【发布时间】:2010-12-17 15:14:40
【问题描述】:
我一直在尝试使用副本集配置中的 MongoDB,看看它如何扩展/执行/应对。
我一直在使用Morphia(Mongo'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 行非常简单的数据。
你应该知道的其他事情:
- 所有这些都在单个硬件 (2 gig Pentium D!) 上运行,集群在两个 32 位 Ubuntu Server VirtualBox 实例上运行,每个实例具有 128 兆内存,Java 客户端在 Windows XP 主机内运行.每个虚拟机上运行两个
mongod进程,另外一个虚拟机上还运行一个arbiter。 - 两台虚拟机上的时钟关闭了几秒钟(我需要安装 VirtualBox Guest Additions 来解决这个问题),但不是很大 - 10gen 说时间不应该是集群的问题,但我我想我会提到它。
我知道 Mongo 在 32 位机器上的 2 gig 限制,other people 的记录消失的事实,我知道我正在做这些测试的机器并不完全在前 500 名(这就是我选择保留的数据很小的原因),但是当我的测试成功时,它们运行得非常好。
我有证据表明 Mongo 还没有准备好迎接黄金时段,还是我做错了什么?
我使用的是 1.6.5。
非常感谢任何见解、提示、提示、指针、解释或批评!
ps:我不是在拖钓 - 我真的很喜欢 NoSQL 的想法,因为它适用于各种数据,所以我真的希望它能够工作,但到目前为止我运气不佳!
【问题讨论】:
标签: mongodb cluster-computing morphia