分布式选举的原因
分布式系统中需要一个主节点,该节点用于负责对其他节点进行协调和管理。同时主节点的存在能够保证分布式集群数据的一致性。
分布式选举算法
1. Bully算法
选举原则:偏向于让ID更大的节点作为集群的leader
前提条件:假设集群中所有节点都知道其他节点的id
消息类型/节点状态:
election消息,用于发起选举
alive消息,用于对election消息的应答
victory消息,竞选成功的主节点向其他节点发送宣誓主权的消息
选举过程:
触发条件: ID比当前主节点大的节点加入集群,主节点故障
具体过程:
(1) 每个节点判断自己的ID是否最大,最大则直接发送victory消息
(2) 如果ID不是最大的,则向比自己id大的节点发送election消息
(3) 在给定时间范围内,本节点没有收到其他节点回复的alive消息,则认为自己是主节点,并向其他节点发送victory消息;若收到alive消息,则等待其他节点的victory消息
(4) 收到比本节点id小的节点发送的election消息则回复一个alive消息
优缺点:
优点: 选举速度快,算法复杂度低,简单易实现
缺点:每个节点额外存储信息较多,任意一个ID比前主节点大的节点加入时都会触发重新选举过程
软件举例: MongoDB
2. Raft算法
选举原则:获得多数投票的集群节点成为leader
前提条件:假设集群中所有节点之间都能相互通信
消息类型/节点状态:
leader: 主节点
candidate:候选者,每个节点都可以成功候选者
follower:leader的跟随者
选举过程:
触发条件: leader任期到了,新节点加入集群或者主节点故障
具体过程:
(1) 初始化所有节点为follower,开始选举时有follower转化为candidate,并向其他节点发送选举消息
(2) 收到消息的节点进行投票,票数超过一半的节点成为主节点,其他节点由candidate降为follower
优缺点:
优点: 选举速度快,算法复杂度低,简单易实现,当有新节点加入或者节点故障恢复时不会触发真正的切主
缺点:每个节点之间都需要相互通信,所以通信量较大
软件举例: ETCD
3. ZAB(Zookeeper Atomic Broadcast)选举算法
选举原则:少数服从多数,节点id大的或者数据最新的优先成为主节点
消息类型/节点状态:
投票信息
leader: 主节点
follower:leader的跟随者
observer: 观察者,无投票权
Looking,Following,Leading,Observing
优缺点:
优点: 稳定性较好,性能较好
缺点:容易出现广播风暴,投票时间较长,复杂度较高
软件举例:zookeeper
总结图
说明:
本文是极客时间付费课程《分布式技术原理与算法解析》笔记