nosql mongodb replicaset autosharding,运行实验时数据丢失

时间:2011-01-17 13:19:02

标签: mongodb sharding nosql

我一直在将数据插入到自动分类的mongodb中。  (不更新,仅插入)

实验设置 2个分片,每个分片有2个节点。

shard1中的

- > node1(primary),node2 在shard2中 - > node3(primary),node4

在一个分片中,我将辅助节点(node2)关闭 - >仍然正确插入数据 现在我将主要(node1)也降低了 - >完整的碎片现在已经关闭

令人惊讶的是,整个mongo设置没有进行任何写入。

故事还有另一个转折点。 现在我已经启动了node2,因为这是唯一可用的节点,它可以作为主节点并开始接受数据。

大约10分钟后,我也把node1带了。

但当我检查我插入node1的数据时(当node2关闭时)丢失了:(。

    s1             s2
   (n1,n2)       (n3,n4)  
   ---------     ---------
1. (up,up)       (up, up)  -> data was getting inserted
2. (up,down)     (up, up)  -> data was getting inserted properly (but got lost :(  )
3. (down, down)  (up, up)  -> no data inserts were happening
4. (down, up)    (up, up)  -> started taking data again
5. (up, up)      (up, up)  -> n1 picked data from n2, but couldn't give the data to n2

在最后一步,当我带来n1时,它从n2获得了新记录,但是在上面的第2步中得到的那个n1完全丢失了:(。

这是mongo的预期行为吗?

有人请帮助我,如果需要,我可以进行更多实验:)。

提前致谢, Vivekananda Tadala

1 个答案:

答案 0 :(得分:3)

如果你在一个两个成员的副本集中关闭一个成员,另一个将停止接受写入。请参阅此explanation了解您需要三名成员的原因,并在玩游戏时始终使用安全模式。

MongoDB中的复制是单向的:从属设备从更新的从设备或主设备复制数据。您不能让两个节点相互复制数据(尚未)。在此期间,您可能会对ensuring write replication感兴趣。

在已击落的分片上插入块不起作用,但您可以在另一个分片上的分片上插入块。您可以使用db.printShardingStatus()查看哪些块位于何处。