我一直在副本集配置中尝试 MongoDB,以了解它如何扩展/执行/应对。
我一直在使用Morphia ( Mongo 的 Java 驱动程序之上的 POJO 映射层)将 10,000 个简单的随机文档保存到单个集合中。我已经用注释注释了我的 POJO(MyData
在下面的代码段中),@Entity(concern="REPLICAS_SAFE")
希望发送到数据库的数据能够安全地持久化。
我的 POJO 由ObjectId
字段(Mongo 的主键类型)、一个String
随机长度的随机字符(最多 20 个字符)和一个long
使用Random.nextLong()
.
我的代码如下:
for (int i=0;i<10000;i++) {
final MyData data = new MyData();
boolean written = false;
do {
try {
ds.save(data); //ds is of type DataStore
written=true;
} catch (Exception e) {
continue;
}
}
while (!written);
}
我建立了一个四节点副本集集群,运行上述程序,然后开始隐喻地拔出电缆,看看发生了什么。
期望的结果是程序一直运行,直到它成功地将所有文档持久化到数据库中。
经过几次之后,实际结果是以下之一:
- Java 报告它已经提交了 10k 个条目,但数据库只有 <10k
- Java 报告它已提交 <10k 并且数据库报告相同或更少的值
- 一切正常
在一种情况下,重新启动的节点实际上无法赶上 PRIMARY 节点,因此必须使用已删除的数据库从头开始。尽管将 opfile 参数增加到 2 gigs,但我认为这足以重播 10,000 行非常简单的数据。
你应该知道的其他事情:
- 所有这些都运行在单个硬件(2 gig Pentium D!)上,集群运行在两个 32 位 Ubuntu Server VirtualBox 实例上,每个实例有 128 兆内存,Java 客户端在 Windows XP 主机内运行。每个虚拟机上运行两个
mongod
进程,另外还有一个仲裁器也在一个虚拟机上运行。 - 两台虚拟机上的时钟关闭了几秒钟(我需要安装 VirtualBox Guest Additions 来解决这个问题),但不是很大 - 10gen 说时间不应该是集群的问题,但我想我' d 提及它。
我知道 Mongo 在 32 位机器上的 2 gig 限制,其他人的记录消失的事实,而且我知道我正在做这些测试的机器并不完全在前 500 名(这就是为什么我选择保留的数据很小的原因)但是当我的测试工作时,它们工作得很好。
我的问题是否证明 Mongo 还没有为黄金时段做好准备,还是我做错了什么?
我正在使用 1.6.5。
非常感谢任何见解、提示、提示、指针、解释或批评!
ps:我不是在拖钓——我真的很喜欢 NoSQL 的想法,因为它适用于各种数据,所以我真的希望它能够工作,但到目前为止我运气不佳!