选主时期

选主逻辑

完整流程图

简略的流程

选主大小比较顺序

依次是:

electionEpoch, curEpoch,curZxid,curId
选举的计数值,时代,zxid,服务器id

提案处理

提案后,zxid递增时间点

在Leader->PrepRequestProcessor.run()中对请求进行封装,封装成提案时执行ZooKeeperServer#getNextZxid()zxid递增。

1
2
3
long getNextZxid() {
return hzxid.incrementAndGet();
}

处理请求保持顺序

  1. org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#logRequest将请求存入pendingTxns队列中;
  2. org.apache.zookeeper.server.quorum.FollowerZooKeeperServer#commit处理请求时验证pendingTxns队列头节点的zxid与当前要处理的zxid是否一致,如果不一致则系统退出(System.exit(12))

sync

在对数据一致性要求高的场合中需要读取从节点的数据与主节点一致,这个时候可以选择发送sync指令到节点,等待从节点完成主节点之前的请求。

这个sync()方法是在主节点完成所有请求后发给从节点执行的方法。

  1. 从节点收到客户端sync请求,在FollowerRequestProcessor和写请求一样处理;
  2. 主节点收到从节点的sync请求,如果当前其他写请求已完成则回复从节点;
  3. 从节点收到主节点的sync响应,执行sync()方法。

leader 处理链

PrepRequestProcessor (调用CommitProcessor后,会调用SyncRequestProcessor记录日志)-> CommitProcessor -> ToBeAppliedRequestProcessor -> FinalRequestProcessor

Follower 处理链

FollowerRequestProcessor -> CommitProcessor -> FinalRequestProcessor

Observer 处理链

ObserverRequestProcessor -> CommitProcessor -> FinalRequestProcessor