高级主选举算法优于欺负算法的好处是什么?

时间:2014-12-19 01:55:58

标签: cluster-computing distributed-computing apache-zookeeper paxos raft

我读到当前的主要选举算法如Raft,Paxos或Zab如何在群集上选择主人并且无法理解为什么他们使用复杂的算法而不是简单的欺负算法。

我正在开发集群库并使用UDP Multicast来处理心跳消息。每个节点都加入一个多播地址,并定期向该地址发送数据报包。如果节点发现有一个新节点将数据包发送到此多播地址,则该节点只会添加到群集中,类似地,当群集中的节点不从节点获取任何包时,它们会将其从节点中删除簇。当我需要选择主节点时,我只需遍历集群中的节点并选择最旧的节点。

我读过一些文章,暗示这种方法效果不佳,应该使用像Paxos这样的更复杂的算法,以便通过心跳消息选出主控或检测故障。我无法理解为什么Paxos比传统的欺负算法更适合裂脑情况或其他网络故障,因为我可以很容易地发现当法定数量的节点离开集群而不使用Raft时。我看到的唯一好处是每个服务器必须处理的数据包数量;只有master在Raft中发送心跳消息,而在这种情况下,每个节点都必须向对方发送心跳消息。但是我不认为这是一个问题,因为我可以简单地实现类似的心跳算法而不改变我的主选举算法。

有人可以详细说明吗?

1 个答案:

答案 0 :(得分:5)

从理论角度来看,Raft,Paxos和Zab不是领导者选举算法。他们解决了一个叫做共识的不同问题。

在您的具体方案中,区别如下。使用领导者选举算法,您只能保证最终一个节点是领导者。这意味着在一段时间内,多个节点可能会认为它们是领导者,因此可能就像一个节点。相反,使用上面的一致性算法,您可以保证在逻辑时刻中最多只有一个领导者。

结果就是这样。如果系统的安全性取决于单个领导者的存在,那么仅依靠领导者选举可能会遇到麻烦。考虑一个例子。节点从UDP多播接收消息,如果发送者是领导者则执行A,但如果发送者不是领导者,则执行B.如果两个节点在稍微不同的时间点检查群集中最旧的节点,则可能会看到不同的领导者。然后,这两个节点可能会收到多播消息并以不同的方式处理它,可能违反了您想要保留的系统的某些安全属性(例如,所有节点都执行A或B,但从来没有一个做A而另一个做B)。

使用Raft,Paxos和Zab,您可以克服这个问题,因为这些算法创建了一些逻辑时代,每个算法最多只有一个领导者。

这里有两个注释。首先,为同步系统定义欺凌算法。如果您真的按照Garcia-Molina的论文中的说明实现它,我相信您可能会在部分同步系统中遇到问题。其次,Zab算法依赖于异步系统的一种欺凌算法。通过比较历史长度(最小化系统的恢复时间)来选出领导者。一旦领导者当选,它就会尝试启动Zab协议,从而锁定领导者的时代。