0
点赞
收藏
分享

微信扫一扫

ZK 选举源码分析

霸姨 2022-02-23 阅读 66
//投票箱   long 表示投出者的 myid ,Vote 为 投出者的选票结果
HashMap<Long, Vote> recvset = new HashMap<>();


//退出选举,该集合总存放的是非法选票,即状态不是looking 的server 选出的票
HashMap<Long, Vote> outofelection = new HashMap<>();

//更新自己的推荐信息
//getInitId 当前sever 的id
//getInitLastLoggedZxId 当前 server 记录的最后zxId,即为最大的zxid
//getPeerEpoch 当前 epoch 的id ,即刚才挂了的leader的epoch
updateProposal(getInitId(),getInitLastLoggedZxId(),getPeerEpoch());
//获取所有节点的选举状态,同时发送通知
sendNotifitions();

epoch :可以理解为当前集群所处的年代或者周期,每个 leader 就像皇帝,都有自己的年号,所以每次改朝换代, leader 变更之后,都会在前一个年代的基础上加 1 。这样 就算旧的 leader 崩 溃 恢 复 之 后 ,也 没 有 人 听 他 的 了 ,因 为 follower 只听从当前年代的 leader 的命令

zxId:是一个 64 位的 数字,它高32位是epoch(ZAB协议通过epoch编号来 区分 Leader 周期变化的策略)用来标识 leader 关系是否 改变,每次一个 leader 被选出来,它都会有一个新的 epoch=(原来的epoch+1),标识当前属于那个leader的 统治时期。低32位用于递增计数

举报

相关推荐

0 条评论