zookeeper集群啟動的時候,首先讀取配置,接着開始選舉,選舉完成以后,每個server根據選舉的結果設置自己的角色,角色設置完成后leader需要和所有的follower同步。上面一篇介紹了leader選舉過程,這篇接着介紹啟動過程中的leader和follower同步過程。
本文結構如下:
- 同步過程
- 總結
同步過程
設置server當前狀態
server剛啟動的時候都處於LOOKING狀態,選舉完成后根據選舉結果和對應配置進入對應的狀態,設置狀態的方法是:
private void setPeerState(long proposedLeader, SyncedLearnerTracker voteSet) {
ServerState ss = (proposedLeader == self.getId()) ?
ServerState.LEADING: learningState();
self.setPeerState(ss);
if (ss == ServerState.LEADING) {
leadingVoteSet = voteSet;
}
}
- 如果當前server.myId等於選舉出的leader的myId——也就是proposedLeader,則當前server就是leader,設置peerState為ServerState.LEADING
- 否則判斷當前server的具體角色,因為follower和observer都是learner,需要根據各自的配置來決定該server的狀態(配置文件里面的key是peerType,可選的值是participant、observer,如果不配置learnerType默認是LearnerType.PARTICIPANT)
- 如果配置的learnerType是LearnerType.PARTICIPANT,則狀態為ServerState.FOLLOWING
- 否則,狀態為ServerState.OBSERVING
准備同步
leader開始工作的入口就是leader.lead方法,這里的leader是Leader的實例,如下圖所示
准備的過程是:
- 創建leader的實例,Leader,構造方法中傳入LeaderZooKeeperServer的實例
- 調用leader.lead
- 加載ZKDatabase
- 監聽指定的端口(配置的用來監聽learner連接請求的端口,配置的第一個冒號后的端口),接收來自follower的請求
- while循環,檢查當前選舉的狀態是否發生變化需要重新進行選舉
同時,follower設置完自己的狀態后,也開始進行類似leader的工作
- 創建follower,也就是Follower的實例,同時創建FollowerZooKeeperServer
- 建立和leader的連接
進行同步
同步的總體過程如下:
在准備階段完成follower連接到leader,具備通信狀態
- leader阻塞等待follower發來的第一個packet
- 校驗packet類型是否是Leader.FOLLOWERINFO或者Leader.OBSERVERINFO
- 讀取learner信息
- sid
- protocolVersion
- 校驗follower的version不能比leader的version還要新
- leader發送packet(Leader.LEADERINFO)給follower
- follower收到Leader.LEADERINFO后給leader回復Leader.ACKEPOCH
- leader根據follower ack的packet內容來決定同步的策略
- lastProcessedZxid == peerLastZxid,leader的zxid和follower的相同
- peerLastZxid > maxCommittedLog && !isPeerNewEpochZxid follower超前,刪除follower多出的txlog部分
- (maxCommittedLog >= peerLastZxid) && (minCommittedLog <= peerLastZxid) follower落后於leader,處於leader的中間 同步(peerLaxtZxid, maxZxid]之間的commitlog給follower
- peerLastZxid < minCommittedLog && txnLogSyncEnabled follower落后於leader,使用txlog和commitlog同步給follower
- 接下來leader會不斷的發送packet給follower,follower處理leader發來的每個packet
- 同步完成后follower回復ack給leader
- leader、follower進入正式處理客戶端請求的while循環
總結
zookeeper為了保證啟動后leader和follower的數據一致,在啟動的時候就進行數據同步,leader與follower數據傳輸的端口和leader選舉的端口不一樣。數據同步完成后就可以接受client的請求進行處理了。