我读过当前的主选举算法(如 Raft、Paxos 或 Zab)如何在集群上选举主节点,但不明白为什么他们使用复杂的算法而不是简单的恶霸算法。
我正在开发一个集群库并使用 UDP 多播来发送心跳消息。每个节点加入一个多播地址,并定期向该地址发送数据报包。如果节点发现有一个新节点向该多播地址发送数据包,则该节点将被简单地添加到集群中,同样,当集群中的节点没有从某个节点获取任何数据包时,它们会将其从集群中删除。当我需要选择主节点时,我只需迭代集群中的节点并选择最旧的节点即可。
我读过一些文章,这些文章暗示这种方法并不有效,应该使用 Paxos 等更复杂的算法来选举主节点或通过心跳消息检测故障。我不明白为什么 Paxos 比传统的欺凌算法更适合裂脑场景或其他网络故障,因为我可以轻松地找出法定节点何时从集群中离开,而无需使用 Raft。我看到的唯一好处是每个服务器必须处理的数据包数量; Raft 中只有 master 会发送心跳消息,而在这种情况下,每个节点都必须互相发送心跳消息。不过,我认为这不是问题,因为我可以简单地实现类似的心跳算法,而无需更改我的主选举算法。
有人可以详细说明一下吗?
从理论角度来看,Raft、Paxos 和 Zab 都不是领导者选举算法。他们解决了一个不同的问题,称为共识。
在您的具体场景中,差异如下。使用领导者选举算法,您只能保证最终有一个节点成为领导者。这意味着在一段时间内,多个节点可能认为自己是领导者,因此可能表现得像一个节点。相比之下,使用上面的共识算法,你可以保证在一个逻辑时刻最多有一个领导者。
结果是这样的。如果系统的安全取决于单个领导者的存在,那么仅依靠领导者选举可能会遇到麻烦。考虑一个例子。节点从 UDP 多播接收消息,如果发送者是领导者,则执行 A,如果发送者不是领导者,则执行 B。如果两个节点在稍微不同的时间点检查集群中最旧的节点,它们可能会看到不同的领导者。然后,这两个节点可能会接收多播消息并以不同的方式处理它,这可能会违反您想要保留的系统的某些安全属性(例如,所有节点要么执行 A 要么 B,但从来没有一个节点执行 A 而另一个节点执行B)。
使用 Raft、Paxos 和 Zab,您可以克服这个问题,因为这些算法创建了某种逻辑纪元,每个纪元中最多有一个领导者。
这里有两个注释。首先,为同步系统定义了欺凌算法。如果您真的按照 Garcia-Molina 的论文中所述来实现它,我相信您可能会在部分同步系统中遇到问题。其次,Zab 算法依赖于一种异步系统的恶霸算法。通过比较历史长度来选举领导者(这可以最大限度地减少系统的恢复时间)。一旦领导者当选,它就会尝试启动 Zab 协议,从而锁定领导者的纪元。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)