我一直在尝试使用副本集配置中的MongoDB来查看它如何扩展/执行/应对.
我一直在使用Morphia(Mongo’s Java drivers之上的POJO映射层)将10,000个简单的随机文档保存到单个集合中.我使用@Entity(Concer =“REPLICAS_SAFE”)注释注释了我的POJO(下面的代码片段中的MyData),希望发送到数据库的数据能够安全地保留.
我的POJO由ObjectId字段(Mongo的主键类型),随机字符的随机字符串(最多20个字符)和使用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 gig Pentium D!),集群在两个32位Ubuntu Server VirtualBox实例上运行,每个实例具有128兆内存,以及在Windows XP主机内运行的Java客户端.每个虚拟机上运行两个mongod进程,另外还有一个arbiter在一个虚拟机上运行.
>两台虚拟机上的时钟关闭了几秒钟(我需要安装VirtualBox Guest Additions来解决这个问题),但不是很大 – 10gen说时间应该不是群集的问题,但我想我提到它.
我知道Mongo在32位机器上的2 gig限制,事实上other people已经消失了记录,而且我知道我正在进行这些测试的机器并不完全在500强(其中这就是我选择坚持的数据很小的原因)但是当我的测试工作时,它们的效果非常好.
问题是我有证据表明Mongo还没有为黄金时段做好准备,或者我在做一些内在错误的事情?
我正在使用1.6.5.
任何见解,提示,技巧,指示,解释或批评都非常感谢!
ps:我不是在拖钓 – 我非常喜欢NoSQL的想法,因为它有利于各种数据,所以我真的希望它可以工作,但到目前为止我运气不好!
最佳答案 MongoDB肯定会在很多地方“黄金时段”使用.所以值得一看这里还有什么可能发生的事情.
所以这里有一些初步问题:
>“新的MyData()”如何工作?您是否可能正在敲打现有ID?
>在整个过程中,您的副本是否“正常”?你只是“继续”出错,所以我不确定如何处理错误. Morphia正确冒泡错误吗?
我真的很感激你已经完成并编写了一个“测试案例”,但我认为你需要深入了解案例.你能尝试以下两件事吗?
>将MyData上的_id设置为i.通过这种方式,您可以看到您正在死亡的过程中的哪个位置.
>每次出现错误时都要执行console.write或等效操作.看看你是否无法弄清楚数据的实际位置.
>通过相同的措施,在每次成功保存时都执行console.write.
如果您执行这些步骤,您将获得正在进行的操作的日志,您将能够查看保存或未保存的内容,并将其与数据库中的数据进行比较.
我知道这有点乏味,但我认为你有两个问题之一,做这些步骤将有助于澄清这一点.
或
1. Morphia未正确报告错误(未正确处理)
2.您发现副本集存在实际问题
你被“最终的一致性”所困扰.
无论哪种方式,通过更多细节,我们应该能够深入研究问题.