1

我不断地将数据插入到自动分片的 mongodb 中。(不更新,只插入)

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

在 shard1 -> node1 (primary), node2 in 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 中获取了新记录,但 n1 在上面第 2 步中获得的记录完全丢失了:(。

这是 mongo 的预期行为吗?

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

在此先感谢 Vivekananda Tadala

4

1 回答 1

3

如果您在两个成员副本集中关闭一个成员,另一个成员将停止接受写入。请参阅此说明,了解为什么需要三个成员并在玩耍时始终使用安全模式。

MongoDB 中的复制是单向的:从属服务器从更新的从属服务器或主服务器复制数据。您不能让两个节点相互复制数据(目前)。您可能对同时确保写入复制感兴趣。

插入到倒塌分片上的块中不起作用,但您可以插入到另一个分片上的分片上的块中。您可以使用db.printShardingStatus()查看哪些块在哪里。

于 2011-01-17T16:01:31.073 回答