zookeeper 选举

选举概述:

  1、启动时期的选举

    所有的服务器状态为 LOOKING。

    1.1、每个Server 会投出一票(投票规则为:SID、ZXID ,即 服务器ID 和 最大事务ID)。

    1.2、处理选票 (A、优先选ZXID最大的。B、再优先SID最大的),根据处理结果再投一次。

    1.3、统计投票。

    1.4、通知投票结果,更改集群机器状态。

  2、运行期的选举

    Leader 挂了后,Follower 将变更状态为 LOOKING , 进入新一轮的Leader 选举。

    剩余步骤同上。

选举算法:FastLeaderElection

  1、术语

    SID:服务器ID,ZXID:事务ID,Vote:投票,Quorum:过半机器数(机器数为n,那么  Quorum = n/2+1  )

  2、处理选票规则(A、优先选ZXID最大的。B、再优先SID最大的),根据选票规则跟自身进行对比,如果找到比自己大的,则投票给大的,否则坚持自己的投票。

实现细节:

  1、服务器的四种状态

    1.1、LOOKING:无领导状态,进入选举流程。

    1.2、FOLLOWING   随从

    1.3、LEADING    领导

    1.4、OBSERVING  观察者

  2、票据数据结构

    SID        //

    ZXID        //

    electionEpoch    // 逻辑时钟,用来判断投票是否在同一轮选举周期中,自增序列,每一轮投票自增1。

    peerEpoch     // 被选举的 Leader  的 epoch

    state        // 当前服务器的状态。

  3、消息队列会根据SID进行分组

  4、根据 electionEpoch 的值进行判断(ee)

    4.1、接收到的 ee , 大于自身的ee,则清空已经收到的选票将自身ee修改为接收到的ee值,并根据PK规则,进行新一轮的选票投递。

    4.2、如果收到的ee小于自身的ee,则抛弃不处理该选票。

    4.3、ee相等,先PK再发送新的选票。

猜你喜欢

转载自www.cnblogs.com/chen--biao/p/10097951.html