共识算法:如果一个奇数集群因为节点故障变成偶数会发生什么?

zx_*_*ing 3 consensus paxos raft

共识算法(例如 raft)要求集群包含奇数个节点以避免裂脑问题。

假设我有一个由 5 个节点组成的集群,如果只有一个节点发生故障会发生什么?集群现在有4个节点,打破了奇数规则,集群会继续正常运行吗?

一种解决方案是再删除一个节点,使集群只包含 3 个节点,但是如果之前出现故障的节点又回来了怎么办?那么集群又有了 4 个节点,为了保持集群奇数,我们必须将之前丢弃的节点带回来。

共识算法的实现是自动处理这个问题,还是我必须在我的应用程序代码中这样做(例如,删除一个节点)?

小智 6

是的,集群将继续正常工作。一个N节点集群,如果N是奇数 ( N = 2k + 1),可以处理k节点故障。只要大部分节点存活,就可以正常工作。如果一个节点出现故障,而我们仍然拥有多数,则一切正常。只有当你失去大部分节点时,你才会有问题。

没有理由强制集群具有奇数个节点,并且实现不认为这是一个问题,因此不处理它(删除节点)。您可以在偶数个节点上运行共识算法,但将其设为奇数通常更有意义。

3 node cluster can handle 1 node fail (the majority is 2 nodes).
4 node cluster can handle 1 node fail (the majority is 3 nodes).
Run Code Online (Sandbox Code Playgroud)
5 node cluster can handle 2 node fail (the majority is 3 nodes).
6 node cluster can handle 2 node fail (the majority is 4 nodes).
Run Code Online (Sandbox Code Playgroud)

我希望这能更清楚地说明为什么将集群大小设为奇数更有意义,它可以用集群中的更少节点处理相同数量的节点故障。