【问题标题】:Testing MongoDB clustering with Morphia使用 Morphia 测试 MongoDB 集群
【发布时间】:2010-12-17 15:14:40
【问题描述】:

我一直在尝试使用副本集配置中的 MongoDB,看看它如何扩展/执行/应对。

我一直在使用MorphiaMongo's Java drivers 之上的 POJO 映射层)将 10,000 个简单的随机文档保存到单个集合中。我已经用@Entity(concern="REPLICAS_SAFE") 注解了我的POJO(下面sn-p 中的MyData),希望发送到数据库的数据能够安全地持久化。

我的 POJO 由 ObjectId 字段(Mongo 的主键类型)、随机长度(最多 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 个条目,但数据库只有
  • Java 报告它已提交
  • 一切正常

在一种情况下,已恢复的节点实际上无法赶上 PRIMARY 节点,因此必须使用已删除的数据库从头开始。尽管将 opfile 参数增加到 2 gigs,但我认为这足以重播 10,000 行非常简单的数据。

你应该知道的其他事情:

  1. 所有这些都在单个硬件 (2 gig Pentium D!) 上运行,集群在两个 32 位 Ubuntu Server VirtualBox 实例上运行,每个实例具有 128 兆内存,Java 客户端在 Windows XP 主机内运行.每个虚拟机上运行两个mongod 进程,另外一个虚拟机上还运行一个arbiter
  2. 两台虚拟机上的时钟关闭了几秒钟(我需要安装 VirtualBox Guest Additions 来解决这个问题),但不是很大 - 10gen 说时间不应该是集群的问题,但我我想我会提到它。

我知道 Mongo 在 32 位机器上的 2 gig 限制,other people 的记录消失的事实,我知道我正在做这些测试的机器并不完全在前 500 名(这就是我选择保留的数据很小的原因),但是当我的测试成功时,它们运行得非常好。

我有证据表明 Mongo 还没有准备好迎接黄金时段,还是我做错了什么?

我使用的是 1.6.5。

非常感谢任何见解、提示、提示、指针、解释或批评!

ps:我不是在拖钓 - 我真的很喜欢 NoSQL 的想法,因为它适用于各种数据,所以我真的希望它能够工作,但到目前为止我运气不佳!

【问题讨论】:

    标签: mongodb cluster-computing morphia


    【解决方案1】:

    MongoDB 现在肯定在很多地方都在“黄金时段”使用。所以值得看看这里可能发生的其他事情。

    这里有几个入门问题:

    1. “new MyData()”如何工作?您是否有可能在敲打现有的 ID?
    2. 您的副本集是否在整个过程中“建立”起来?您只是在“继续”错误,所以我不确定如何处理错误。 Morphia 是否正确冒泡错误?

    我真的很感谢你经历并编写了一种“测试用例”,但我认为你需要更深入地挖掘这个案例。可以试试以下两点吗?

    1. MyData 上的_id 设置为i。这样你就可以在哪里看到你正在死亡的过程。
    2. 每次遇到错误时执行console.write 或等效操作。看看您是否无法弄清楚数据的实际去向。
    3. 以同样的方式在每次成功保存时执行console.write

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

    我知道这有点乏味,但我认为您有两个问题之一,执行这些步骤将有助于解决这个问题。

    要么 1. Morphia 未正确报告错误(未正确处理) 2. 您发现副本集存在实际问题 3. 你被“最终的一致性”所吸引。

    不管怎样,有了更多细节,我们应该能够深入研究问题。

    【讨论】:

    • 感谢您的回答,很抱歉没有早点回复,疾病和假期都在阻碍 - 不过我完全打算在新的一年继续跟进!
    • 嘿,我知道假期。如果此测试相对简单,您还可以尝试发布一些要点,让其他人重现您正在做的事情。应该是两个脚本:一个脚本显示您的启动过程,另一个脚本显示您的更新/测试用例。
    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多