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

Why is it recommended to create clusters with odd number of nodes

有一些关于分布式系统的资源,比如 mongo db documentation 推荐集群中的奇数节点。

奇数节点有什么好处?

奇数节点帮助 - 而不是必需 - 在集群中选举领导者。 It is essential to avoid multiple leaders getting elected, a condition known as split-brain problem.共识算法使用投票来选举领导者。即,以多数票选出节点。

考虑一个包含 5 个节点的集群。所需的最低多数是 3(5/2 或 2 + 2 + 1- 交易破坏者)。

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

认为 5 个节点中有 1 个失败。 we can still elect a leader with majority votes of 3. well, what if out of the 4 nodes, two leaders get elected with equal votes of 2?这留给共识算法来解决争用(也许,只是重新开始选举)

比方说,5 个节点中有 2 个发生故障。我们仍然可以选出多数票为 3 的领导者,即当所有 3 个可用节点都投票给同一个节点时。

当一个奇数节点出现故障时,人们通常会对获得多数感到困惑,而使它们的数量为偶数。现在应该很清楚了,选举领导者需要初始集群大小的大部分(最好是奇数)。

我们已经看到奇数集群在节点故障的情况下如何提供帮助。 这里要补充的另一点是,这在网络分区的情况下有何帮助。 在最坏的情况下,网络分区可以将集群恰好分成相等的两半,这在奇数集群中是不会发生的。

只要集群部分或运行节点数大于或等于floor(n/2)+1,以多数w.r.t达成共识初始集群大小,集群可以继续运行

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

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

+-------------------+------------------------------------------+-----------------+
| 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 节点分区。在这种情况下,两个分区都无法与大多数成员通信,您的集群将变得不可用。

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

简答:更高的容错能力。

这是一个通用原则,适用于许多其他使用 RAFT 类似领导者选举算法的集群,例如 Kubernetes ETCD 集群。

如果它使用 RAFT 来选择领导者,集群需要大多数节点(法定人数)来就领导者达成一致。对于有 n 个成员的集群,法定人数为 (n/2)+1.

就容错性而言,向奇数大小的集群添加一个额外的节点会降低容错性。如何?我们仍然有相同数量的节点可能会在不丢失仲裁的情况下发生故障,但是我们有更多节点可能会发生故障,这意味着丢失仲裁的可能性实际上比以前更高。

关于容错,请查看 this 官方 etcd 文档以获取更多信息。