zookeeper 选举和同步

节点状态:

// org.apache.zookeeper.server.quorum.QuorumPeer.ServerState
public enum ServerState {
    LOOKING, FOLLOWING, LEADING, OBSERVING;
}

测试环境可以用 2 个节点组成集群。2 个节点的集群中,节点需要得到 2 票,才能当选为 leader。

假定 2 个节点的 id 分别为 1 和 2,以 FastLeaderElection 为例,描述选举过程:
开始, 2 个节点均处于 LOOKING 状态,投票进行选举,2 个节点分别为自己投票,这样均只得 1 票,无法选举出 leader。
开始下一轮选举,节点 1 发现节点 2 的 id 比自己大,于是给节点 2 投票,随之节点 2 成为 leader。

投票信息
FastLeaderElection.Notification

选举 leader
FastLeaderElection.lookForLeader

比较 epoch,zxid,id。判断是否要更新当前节点的投票信息
FastLeaderElection.totalOrderPredicate

计票,判断选举是否结束
FastLeaderElection.termPredicate

选举完成后的同步

QuorumPeer.run() 代码片段:

case FOLLOWING:
    try {
        LOG.info("FOLLOWING");
        setFollower(makeFollower(logFactory));
        follower.followLeader();
    } catch (Exception e) {
        LOG.warn("Unexpected exception",e);
    } finally {
        follower.shutdown();
        setFollower(null);
        setPeerState(ServerState.LOOKING);
    }
    break;

Follower.followLeader() 代码片段:

syncWithLeader(newEpochZxid);                
QuorumPacket qp = new QuorumPacket();
while (self.isRunning()) {
    readPacket(qp);
    processPacket(qp);
}

follower 无限 while 循环。

猜你喜欢

转载自www.cnblogs.com/allenwas3/p/9287996.html