我将3个mongo服务器配置为副本集,如下所示:
如果27017
和25017
失效,您如何访问唯一幸存者26017
中的数据?我发现mongo没有自动将26017
设置为PRIMARY服务器,因此整个副本变得无法访问。
我想要一个能够容忍这种情况的副本配置,当27017
和25017
再次运行时,副本集能够同步
THX,
答案 0 :(得分:1)
这是正确的行为。大多数副本集必须已启动并相互通信,然后进行选举,以便拥有主副本并接受任何写入操作。您无法配置副本集,以便在1/3成员启动时(从某些角度来看),该集合可以接受写入。为什么?假设我们有一个3成员副本集,每个成员位于不同的数据中心,并且允许单独的副本集成员自己成为主要成员
DC1: rs0/serverA
DC2: rs0/serverB
DC3: rs0/serverC
叛逆的侏儒切断了数据中心之间的所有电线;服务器A,B和C不能再相互通信。服务器A认为这种情况为“我还活着”,但B和C已经死了。我必须成为小学生!"服务器B和C对自己说同样的话。三个客户端X,Y,Z连接,一个连接到A,一个连接到B,一个连接到C.它们发送以下涉及写入的操作:
X: db.mission_control.drop()
Y: db.mission_control.update({ }, { "fire_all_missiles" : true }, { "multi" : true })
Z: db.mission_control.update({ }, { "world_peace_mode" : "engage" }, { "multi" : true })
现在,数据中心之间的连线已恢复,A,B和C可以再次相互通信。我们应该如何处理mission_control
集合?放下它,然后尝试发射导弹,然后尝试引发世界和平?发射导弹,然后放下它,然后尝试与世界和平相处?也许,最卑鄙的是,我们应该参与世界和平,然后,一旦每个人都放下警卫,发射导弹,然后通过放弃收集来破坏证据。 MongoDB应该如何知道在这种情况下该怎么做?
因此,您不能拥有主要(接受写入的节点)而没有多数。但是,如果没有主要内容,你仍然可以从中学阅读。您只需要设置secondary read preference。