使用Morphia测试MongoDB集群

我一直在尝试使用副本集配置中的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.您发现副本集存在实际问题
 你被“最终的一致性”所困扰.

无论哪种方式,通过更多细节,我们应该能够深入研究问题.

点赞