2010-12-17 78 views
4

我一直在尝试使用副本集配置中的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行非常简单的数据。

其他的事情你应该知道:

  1. 所有这一切都在一个单一的硬件上运行(2演出奔腾d!)与128兆的两个32位的Ubuntu服务器的VirtualBox实例上运行的集群每个ram和运行在Windows XP主机内部的Java客户端。两个mongod进程在每个虚拟机上运行,​​另外一个arbiter也在一个虚拟机上运行。
  2. 两台虚拟机上的时钟关闭了几秒钟(我需要安装VirtualBox Guest Additions来解决这个问题),但数量不是很大--10gen说时间不应该成为群集问题,但我我想我会提到它。

我知道有蒙戈在32位机上的2演出限制的,但事实上,other people有消失的记录,我知道的是,该机我在做这些测试上是不完全在500强(这就是为什么我选择坚持的数据很小),但是当我的测试工作时,他们工作得很好。

问题我证明Mongo还没有准备好黄金时段,还是我在做一些本质上错误的事情?

我正在使用1.6.5。

任何洞察力,提示,提示,指针,解释或批评非常感谢!

ps:我不是在拖动 - 我非常喜欢NoSQL的想法,因为它对数据类型很好,所以我真的希望它能够工作,但到目前为止我没有太多的运气!

回答

2

MongoDB绝对在很多地方被“黄金时段”使用。所以值得看看这里还有什么可能发生。

那么几个首发的问题在这里:

  1. 如何 “新迈德特()” 工作?是否有可能敲击现有的ID?
  2. 在整个过程中,您的副本套装“up”吗?你只是“继续”出错,所以我不确定错误是如何处理的。 Morphia是否正确冒泡错误?

我真的很感激你已经写下了一种“测试案例”,但我认为你需要深入研究案例。你能够尝试以下两件事吗?

  1. 设置上MyData_idi。这样你可以看到,其中在你要死的过程中。
  2. 每当您收到错误时,请执行console.write或同等操作。看看你是否无法弄清楚数据实际发生的地方。
  3. 通过相同的措施,每次成功保存一个console.write

如果您执行这些步骤,您将获得正在进行的操作的日志,并且您将能够查看保存的内容和未保存的内容,并将其与数据库中的数据进行比较。

我知道这有点乏味,但我认为你有两个问题之一,并且执行这些步骤将有助于清除此问题。

要么 1.吗啡没有正确报告错误(没有正确处理) 2.你发现一个实际的问题与副本集 3.您目前正在由“最终一致性”中招。

无论哪种方式,有了更多的细节,我们应该能够钻进这个问题。

+1

感谢您的回答,并对不早答复感到抱歉,生病,然后假期开始变得困难 - 我完全打算在新的一年里继续这样做! – Rich 2010-12-23 14:21:07

+0

嘿,我知道假期。如果这个测试比较简单,你也可以尝试发布一些让其他人重新评估你所做的事情的要点。应该可能是两个脚本:一个脚本显示你的启动过程,另一个脚本显示你的更新/测试用例。 – 2010-12-27 06:50:07