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

问题描述 投票:0回答:3

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

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

cluster-computing distributed leader-election
3个回答
15
投票

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

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


5
投票

奇数个节点有帮助,并且对于选举集群中的领导者来说不是“必需”。必须避免多名领导人当选,这种情况被称为裂脑问题。共识算法使用投票来选举领导者。即,以多数票选出节点。 考虑一个包含 5 个节点的集群。所需的多数是 3(5/2 或 2 + 2 + 1 - 破坏交易)。

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

考虑 5 个节点中有 1 个发生故障。我们仍然可以选出多数票数为 3 的领导者。那么,如果在 4 个节点中,有两个节点获得相同的 2 票怎么办?这就留给共识算法来解决争用(也许只是发起重新选举)。这不是奇数簇可以解决的问题。当

active

节点数量为偶数时,达成共识的开销很小。同样,对于奇数/偶数节点,这是无法避免的。当奇数节点之一发生故障而使它们的数量为偶数时,人们通常会对实现多数感到困惑。现在应该很清楚了,平局不是问题,多数足以选举领导人。 当 5 个节点中有 2 个失败时,我们仍然可以选出多数票数为 3 的领导者,即所有 3 个可用节点都投票给同一个节点。集群不能容忍超过 2 个节点故障,因为无法实现多数。

这里要补充的另一点是,奇数在网络分区的情况下有何帮助。在最坏的情况下,网络分区可以将集群分成恰好相等的两半,这在奇数集群中不会发生。

为什么领导者选举需要初始集群大小的大多数而不是活动节点的大多数?比如说,7 个节点的集群中有 2 个节点发生故障,剩下 5 个节点仍在运行。如果领导者以 3 票多数当选,有什么问题? 问题是您无法确保两个节点实际上已关闭或仅已分区。这就是领导者选举的目的,避免脑裂问题。一个 7 节点集群可以分为 3 个节点和 4 个节点的两部分。而且,双方都可以选举两名领导人。 7/2 = 4 的多数选出一位领导者。

只要运行/可达的节点数大于或等于floor(n/2)+1,在初始集群大小的基础上达成多数共识,集群就可以继续运行


1
投票

这是适用于许多其他使用

RAFT

类似领导者选举算法的集群的一般原则,例如 Kubernetes ETCD 集群。 如果使用 RAFT 进行领导者选择,集群需要大多数节点(即法定人数)来就领导者达成一致。对于有 n 个成员的集群,法定人数为 (n/2)+1。

在容错方面,

向奇数大小的集群添加额外的节点会降低容错能力。

如何降低容错能力?我们仍然有相同数量的节点可能会在不失去仲裁的情况下发生故障,但是我们有更多的节点可能会发生故障,这意味着失去仲裁的可能性实际上比以前更高。 对于容错,请查看

this

官方etcd文档以获取更多信息。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.