节点状态:
// 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 循环。