为什么mongodb副本集需要奇数个投票节点?

时间:2013-04-22 15:04:36

标签: mongodb

mongodb文档表明副本集应具有奇数个投票节点。这是什么原因?

2 个答案:

答案 0 :(得分:9)

让我们假设一个副本集具有偶数个节点(例如4个)。然后发生一个不幸的网络分区,将该组分成两半(2 + 2)。哪个分区应该接受写入?第一?第二?都?网络恢复后会发生什么?这些都是难题。

奇数个节点完全消除了这些问题。该集合不能完全分成两半。因此,较大的部分将接受写入(确切地说,节点必须看到超过一半的节点(包括自己)被选为主要节点。因此它是1的1,2的3,3的5,4的7等等)。

答案 1 :(得分:1)

投票由大多数投票成员完成。

想象一个具有三个(投票)成员的副本集。假设节点A是主要的,而节点B + C是次要的。节点A发生故障,因此节点B + C进入选举。他们仍然占多数(三分之二)。选举首先由优先级决定。如果两个节点B和C具有相同的优先级,则关于发生故障的主节点(oplog)的最新更新将获胜。假设它是节点B。

一旦节点A恢复活动,就不会有新的选举。节点B仍然是主节点,而C + A现在是辅助节点。

另一方面,如果两个节点出现故障,您将没有多数,因此副本集将无法再接受更新(应用写入),直到两个发生故障的服务器中至少有一个处于活动状态(并已连接)再次通过单个幸存节点)。

现在想象一个具有四个(投票)成员的副本集。假设节点A是主要节点,而节点B + C + D是次要节点。节点A发生故障,因此节点B + C + D进入选举。他们当然占多数(四分之三)

但是,如果两个节点出现故障,您将没有多数(四分之二),因此副本集再次处于只读模式。

这就是为什么建议使用奇数的原因;如果您在3个成员副本集中失去一个成员,就与在4个成员副本集中失去一个成员一样:您仍然获得法定多数,并且可以选择新的主要成员(RS仍可以通过多数)。另一方面,如果您将3个成员副本集或4个成员副本集(或n个成员副本集的n / 2个成员)中的两个成员放开,那么影响是相同的:无法投票选举新的领导者通过选举。

因此,总而言之,在副本集中只有偶数个成员不会带来冗余。