zookeeper選舉算法
- zookeeper有三種算法來實現(xiàn)leader選舉:
- LeaderElection算法
- AuthFastLeaderElection算法
- FastLeaderElection算法.
具體使用哪種算法,可以在配置文件中配置,對應(yīng)的配置項是electionAlg,
配置值分別對應(yīng)以上序號,默認使用FastLeaderElection算法,本文僅以默認算法流程;
leader 選舉
選舉屬性:
- electionEpoch:每執(zhí)行一次leader選舉,electionEpoch就會自增,用來標記leader選舉的輪次
- peerEpoch:每次leader選舉完成之后,都會選舉出一個新的peerEpoch,用來標記事務(wù)請求所屬的輪次
- serverID:配置文件中配置的每個服務(wù)器對應(yīng)的ID
- zxid:為了保證事務(wù)一致性,zk采用了遞增的事務(wù)ID號(zxid)來標識事務(wù)。所有的提議都在唄提出的時候加上了zxid。實現(xiàn)中,zxid是一個64位的數(shù)字,它高32位是epoch用來標識leader關(guān)系是否改變,每次一個leader被選出來,它都會有一個新的peerEpoch,標識當前屬于那個leader的通知時期,低32位用于遞增計數(shù);
選舉狀態(tài):
- Looking: 當前server不知道leader是誰,正在搜尋
- Following: leader已經(jīng)選舉出來,當前server與之同步
- Leading: 當前server即為選舉出來的leader
- Observing:大多數(shù)行為與following一致,但是不參加選舉,只接受選舉的結(jié)果
選舉發(fā)送內(nèi)容:
- serverID,zxid,peerEpoch,當前選舉狀態(tài);
選舉流程:
- 每個服務(wù)器都發(fā)送自己選舉的leader,首輪會發(fā)送的選票都會投給自己;
- 服務(wù)器收到其他服務(wù)器的選票:
收到的推薦人是looking狀態(tài):
首先判斷邏輯時間:
(1) 收到的選票邏輯時間大于目前的邏輯時鐘,則說明選舉已經(jīng)進入新一輪了,所以需要更新本機邏輯時間,并清空之前收到的選票信息;然后更新選票信息,廣播出去;
(2) 收到的選票邏輯時間等于目前的邏輯時鐘,則判斷是否需要更新推薦人,如更新,則廣播出去;
然后記錄選票信息,本地進行選舉,如選舉出來,則等待一段時間沒有新的選票后,則進行角色確認,更改狀態(tài)返回最終選票;
收到的推薦人是following、leading狀態(tài):
(1) 收到的選票邏輯時間等于目前的邏輯時鐘,進行本地選舉,并確定收到的選票為leader,如果確定,則進行角色確認,返回最終選票
(2) 如果上一步?jīng)]有確定角色且返回最終選票,則將選票存入outofelection中,進行再次選舉,如果能確定出leader,且確定收到的選票為leader,如果確定,則進行角色確認,返回最終選票;
流程圖:

選舉流程圖
選舉判定:
依次判定peerEpoch,zxid,serverId

FastLeaderElection
選舉源碼類:
FastLeaderElection,實現(xiàn)Election接口的lookForLeader方法,從類關(guān)系上來看,AuthFastLeaderElection,LeaderElection這兩個實現(xiàn)類已經(jīng)被廢棄,目前僅剩FastLeaderElection這個實現(xiàn)類;
以上為根據(jù)源碼及網(wǎng)上資料總結(jié),總結(jié)的過程中可以使自己的理解更深刻