算法【ZAB 优先级的民主投票】
一、简介
ZAB(ZooKeeper Atomic Broadcast)算法是ZooKeeper为实现分布式协调而设计的,它是对Raft选主算法的一种改进,在拥有投票选举的维度下增加节点ID以及数据ID(数据的最新值)为参考。
二、说明
2.1、ZAB算法有3种角色:
Leader:主节点
Observe:观察者。只观察,无投票权
Follower:跟随者
2.2、选举过程中的状态
三、选举过程
3.1、ZAB算法使用节点元素的信息
每个节点都有一个唯一的三元组(server_id,server_zxId,epoch);server_id即为当前节点的Id,server_zxId即为当前节点存放数据的最新值id,epoch即为当前选主进行的轮数。
ZAB算法在选主过程在投票给具体节点时,通过(vote_id,vote_zxId)表示投票给哪个节点,vote_id即为被投票的节点id,vote_zxid为被投票节点的zxid;其ZAB选主算法的唯一原则是,server_zxId值最大则成为Leader,如果相同,则看server_id最大者。
3.2、选举主流程
1、系统初始化时,即为第一轮投票选主,即epoch=1,所有的节点zxID=0,此时所有节点都会推选自己,且将选票信息(epoch,vote_id,vote_zxid)广播出去:
2、此时epoch和zxId都是相同,根据ZAB算法判断原则,则会依据server_id最大者为推选对象,所以节点会更新vote_id=3进行重新广播:
3、现在所有的节点都推线了Node3节点,则node3成为Leader,为Leading状态,其他节点为Following状态,Leader与Follower将会建立心跳机制。
四、优缺点
性能较高,对系统没有特殊的要求,采用的是广播的模式发送偷跑信息,如果集群中节点比较多,每个节点同时广播,则会有n*(n-1)个消息,容易发生广播风暴,同时还增加节点Id和数据Id参考,则ZAB在选主时间上相对长一点,那为何还是性能最优的,是因为它不会容易频繁出现切主的情况。
五、Bully、Raft以及ZAB算法对比
思维导图如下: