QuorumPeerConfig.parseProperties()方法
if (type == LearnerType.OBSERVER){ //观察者
observers.put(Long.valueOf(sid), new QuorumServer(sid, hostname, port, electionPort, type));
} //port为通信,commit,ack端口 electionPort为选举端口
在SyncRequestProcess中持久化事物(打快照),累计多次事物,打一个快照
QuorumPeer中四种状态,不停地循环读取
while (running) {
switch (getPeerState()) {
case LOOKING: //正在进行领导者选举
case Observing //观察
case Following //跟随
case Leading //领导者
zk集群中的事物id(Zxid):组成leader周期epoch编号+值(+1) learnerHandler类
long zxid = qp.getZxid();
long newEpoch = leader.getEpochToPropose(this.getSid(), lastAcceptedEpoch);//sid为follower的sid时myid
,learner的epoch,这个方法是每个线程共用的
PrepRequestProcessor:checkAcl,构造txn
SyncRequestProcessor:持久化txn,快照
FinalRequestProcessor:更新内存,返回response
Leader:LeaderZooKeeperServer.setupRequestProcessors()方法,请求处理链
firstProcessor=PrepRequestProcessor.next=ProposalRequestProcessor.next=commitProcessor.next=toBeAppliedProcessor.next=FinalRequestProcessor
SyncRequestProcessor.next=AckRequestProcessor
流程:request--->commitProcessor阻塞---->发起提议-->持久化
Follower:FollowerZooKeeperServer.setupRequestProcessors()方法,请求处理链同理
firstProcessor=FollowerRequestProcessor.next=commitProcessor.next=FinalRequestProcessor
SyncRequestProcessor.next=SendAckRequestProcessor
Observer:同理