算法【ZAB 优先级的民主投票】

发布时间 2023-10-31 17:17:27作者: 木乃伊人

一、简介

       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算法对比

         

        思维导图如下: