如果多数服务器关闭,如何访问mongo副本集?

时间:2015-04-02 00:50:46

标签: mongodb mongojs

我将3个mongo服务器配置为副本集,如下所示:

  • MY-PC:27017 - 小学 - DOWN
  • MY-PC:26017 - Secondary - ACTIVE
  • MY-PC:25017 - 中学 - 下来

如果2701725017失效,您如何访问唯一幸存者26017中的数据?我发现mongo没有自动将26017设置为PRIMARY服务器,因此整个副本变得无法访问。

我想要一个能够容忍这种情况的副本配置,当2701725017再次运行时,副本集能够同步

THX,

1 个答案:

答案 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