我一直在尝试使用副本集配置中的MongoDB来查看它如何缩放/执行/应对。使用Morphia测试MongoDB集群
我一直在使用Morphia(在Mongo's Java drivers之上的一个POJO映射层)来将10,000个简单的随机文档保存到一个集合中。我已经用@Entity(concern="REPLICAS_SAFE")
注释注释了我的POJO(下面片段中的MyData
),希望发送到数据库的数据将被安全地保存下来。
我POJO补足的ObjectId
字段(蒙戈的主键型),的随机长度(最大20个字符)的随机字符String
并使用Random.nextLong()
产生的long
的。
我的代码如下:
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个演出,但我认为这足以重放10,000行非常简单的数据。
其他的事情你应该知道:
- 所有这一切都在一个单一的硬件上运行(2演出奔腾d!)与128兆的两个32位的Ubuntu服务器的VirtualBox实例上运行的集群每个ram和运行在Windows XP主机内部的Java客户端。两个
mongod
进程在每个虚拟机上运行,另外一个arbiter也在一个虚拟机上运行。 - 两台虚拟机上的时钟关闭了几秒钟(我需要安装VirtualBox Guest Additions来解决这个问题),但数量不是很大--10gen说时间不应该成为群集问题,但我我想我会提到它。
我知道有蒙戈在32位机上的2演出限制的,但事实上,other people有消失的记录,我知道的是,该机我在做这些测试上是不完全在500强(这就是为什么我选择坚持的数据很小),但是当我的测试工作时,他们工作得很好。
问题我证明Mongo还没有准备好黄金时段,还是我在做一些本质上错误的事情?
我正在使用1.6.5。
任何洞察力,提示,提示,指针,解释或批评非常感谢!
ps:我不是在拖动 - 我非常喜欢NoSQL的想法,因为它对数据类型很好,所以我真的希望它能够工作,但到目前为止我没有太多的运气!
感谢您的回答,并对不早答复感到抱歉,生病,然后假期开始变得困难 - 我完全打算在新的一年里继续这样做! – Rich 2010-12-23 14:21:07
嘿,我知道假期。如果这个测试比较简单,你也可以尝试发布一些让其他人重新评估你所做的事情的要点。应该可能是两个脚本:一个脚本显示你的启动过程,另一个脚本显示你的更新/测试用例。 – 2010-12-27 06:50:07