奇数如何解决分布式系统中的脑裂?

How does an odd number solve a split brain in a distributed system?

分布式系统建议使用奇数个Master节点,例如3个Master节点或5个Master节点,以避免脑裂问题。

但是它是如何解决问题的呢?

如果有2个节点(A和B),1个主持人,如果A和B告诉主持人"I'm Master",那么就会发生脑裂。版主无法决定谁是大师

如果有3个节点(A、B、C),那么如果有2个节点说Master是A,那么Moderator就可以判定A是Master。

但是如果A死了怎么办,然后版主必须从B和C中选择一个Master,如果B和C告诉版主"I'm Master"怎么办?脑裂再次出现

分布式系统通常不会建议奇数个节点可以防止脑裂。相反,多数 quorums 可以避免脑裂。如果一个协议选择拥有多数票的节点作为领导者,并且该协议可以确保节点只会选择一个领导者,那么逻辑上只能有一个,因为只能有一个多数。通常,仅使用奇数个节点是因为它们提供了最高级别的容错能力,例如2 的多数是 2,但 3 的多数也是 2。这给了你容忍一次失败的空间,同时仍然能够为领导者获得多数选票。

当然,避免脑裂不仅仅是从集群中的大多数节点收集选票并从中选出领导者的问题。在异步分布式系统中,两个节点仍然有机会 相信 自己是领导者,即使他们不是,而创建脑裂所需要做的就是让两个不同的客户端进行通信相信自己是领导者的两个不同节点,无论他们是否是。请参阅 Kyle Kingsbury 的 Jepsen blog 以获取大量此类示例。

此外,请参阅 Raft paper 以获取避免脑裂的基于多数群体的协议示例。