为什么建议创建具有奇数个节点的集群

时间:2019-11-12 16:59:35

标签: cluster-computing distributed leader-election

关于分布式系统,有几种资源,例如mongo db documentation,它建议集群中的节点数为奇数。

具有奇数个节点有什么好处?

2 个答案:

答案 0 :(得分:1)

简短的回答:在MongoDB的情况下,具有奇数个节点会增加集群系统的可用性(正常运行时间)。

查看您链接的MongoDB文档中的表:

+-------------------+------------------------------------------+-----------------+
| Number of Members | Majority Required to Elect a New Primary | Fault Tolerance |
+-------------------+------------------------------------------+-----------------+
|         3         |                    2                     |        1        |
+-------------------+------------------------------------------+-----------------+
|         4         |                    3                     |        1        |
+-------------------+------------------------------------------+-----------------+
|         5         |                    3                     |        2        |
+-------------------+------------------------------------------+-----------------+
|         6         |                    4                     |        2        |
+-------------------+------------------------------------------+-----------------+

请注意,当您的成员数为奇数并增加一个(成为偶数)时,容错能力不会提高! (意味着,您的集群不能容忍更多的失败成员)

这是因为MongoDB需要多数成员才能选出主要成员。此属性并非特定于MongoDB,而是任何需要大多数成员启动的集群系统(例如,另请参见etcd)。

当节点增加到偶数时,您的系统可用性实际上下降了 ,因为尽管容错能力保持不变,但仍有更多的节点可能发生故障,因此发生故障的可能性上升了

此外,具有偶数个成员会减少如果存在网络分区,则节点的某些子集将能够继续运行的可能性。例如,如果您有一个6节点群集,则可能会出现网络分区将您的节点划分为2个3节点分区的可能性。在这种情况下,两个分区都将无法与大多数成员通信,并且您的集群将变得不可用。

与直觉相反的结论是,如果您拥有一个成员均匀的群集,那么删除其中一个成员实际上是有益的(从高可用性的角度来看)。

答案 1 :(得分:0)

在集群中选举领导者时,帮助的节点数量为奇数,而不是必需的。避免多位领导人当选至关重要,这种情况被称为“裂脑问题”。共识算法使用投票来选举领导者。即,以多数票选出该节点。

考虑一个由5个节点组成的集群。最低要求的多数为3(5/2或2 + 2 + 1-破坏交易)。

重要的是要注意,即使在失败的情况下,领导者的选举也需要大多数集群投票。

考虑5个节点中的1个失败。我们仍然可以以3的多数票选出一位领导人。那么,如果在4个节点中有2个以2票的相等票数当选领导人,那该怎么办?剩下由共识算法来解决争用(也许只是重新启动选举)

假设5个节点中有2个发生故障。我们仍然可以以3的多数票选出一位领导者,即当所有3个可用节点都投票赞成同一节点时。

通常,当奇数节点之一发生故障而使它们保持偶数状态时,对于获得多数制感到困惑。现在应该很清楚,选举领导者需要大多数初始集群大小(最好是奇数)。

我们已经看到了奇数群集在节点故障的情况下如何提供帮助。 在此添加的另一点是,在网络分区的情况下,这有何帮助。 在最坏的情况下,网络分区会将群集分为正好相等的两半,这在奇数群集中是不可能发生的。

只要集群的一部分或操作节点的数量大于或等于floor(n / 2)+1,为了基于多数对初始集群大小达成共识,集群可以继续操作