我一直在将数据插入到自动分类的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
答案 0 :(得分:3)
如果你在一个两个成员的副本集中关闭一个成员,另一个将停止接受写入。请参阅此explanation了解您需要三名成员的原因,并在玩游戏时始终使用安全模式。
MongoDB中的复制是单向的:从属设备从更新的从设备或主设备复制数据。您不能让两个节点相互复制数据(尚未)。在此期间,您可能会对ensuring write replication感兴趣。
在已击落的分片上插入块不起作用,但您可以在另一个分片上的分片上插入块。您可以使用db.printShardingStatus()
查看哪些块位于何处。