zookeeper篇-zk的選舉機制


點贊再看,養成習慣,微信搜索「小大白日志」關注這個搬磚人。

文章不定期同步公眾號,還有各種一線大廠面試原題、我的學習系列筆記。

說說zk的選舉機制

基礎概念
  • zxid=事務id=一個時間戳,代表當前事件發生的先后順序,zxid越小代表事件發生的時間越早;zxid由64位數字組成=高32位的epoch+低32位遞增數列,每個leader都有自己的統治年代,高32位epoch代表當前leader的統治年,低32位則是遞增計數位,所以在同一個集群中每個節點的zxid都都可能不同,因為高32位epoch相同但低32位遞增數列不同;
    myid=zk集群中每個節點的標識id;
  • zk的leader選舉分為集群啟動階段和運行階段的選舉
  • 選舉原則:比較每個節點的(zxid,myid),在當選節點的票數>總節點數/2(該原則可以避免zk集群的腦裂問題),zxid大者當選,若zxid相同再比較myid,myid大者當選;若當前已發生投票節點數未過半,則繼續等待投票
  • zk保證CAP中的CP,不保證可用性(A):因為在zk集群選舉過程中不對外提供服務
  • zk可以保證數據不丟失:因為在選舉過程中zxid較大的節點會當選leader,zxid越大代表數據越新(但這種保證是不嚴格的:啟動階段zxid相同,但運行階段zxid相對較大的位於中間的節點會當選,zxid最大但位於最后的節點反而不當選)
  • 選舉需滿足【當選節點的票數>總節點數/2】,故這種情況選舉不出leader:整個集群中過半的節點掛掉了,此時永遠不滿足【當選節點的票數>總節點數/2】
  • 集群總節點數一般設為基數【2N+1】,目的有兩個:
    • 出於成本考慮。當集群有5個節點時,最多掛掉2個節點,此時剩下3台,最大的當選節點票數為3>總節點數/2=5/2=2.5;當集群有6個節點,最多掛掉2個節點,此時剩下4台,最大當選票數為4>總節點數/2=6/2=3。所以5個節點和6個節點服務器的容錯數都是一樣的,但明顯5台服務器成本更少。
    • 防止腦裂。腦裂=一個集群由於網絡故障分為兩個集群,這兩個集群又各自選選舉出了自己的主節點,這樣就有兩個主節點了,原本只有一個主節點現在有了兩個,類似於大腦裂開了兩半;當考慮過半機制時,不管節點裂開成多少個集群,每個集群都需要超過總節點數的一半才能選主成功,這樣自始至終都只有一個裂開后形成的集群能正常選主,其他裂開后形成的集群不能選主而不能正常工作
啟動階段的leader選舉

zk集群至少要有3個節點,假如有5個節點1、2、3、4、5先后啟動,它們啟動時的zxid都是一樣的(設為0):

->節點1進入looking選舉狀態,給自己投票,發出(0,1),此時當選節點票數=1<節點總數的一半=2.5,故節點1仍保持looking狀態繼續等待選舉

->節點2進入looking選舉狀態,給自己投票,發出(0,2),myid為2最大,2當選,但此時當選節點票數=2<節點總數的一半=2.5,故節點2仍保持looking狀態繼續等待選舉

->節點3進入looking選舉狀態,給自己投票,發出(0,3),myid為3最大,3當選,且此時當選節點票數=3>節點總數的一半=2.5,故節點3當選leader

->節點4進入looking選舉狀態,給自己投票,發出(0,4),但此時集群leader已選出,所以節點4仍成為follwer

->節點5進入looking選舉狀態,給自己投票,發出(0,5),但此時集群leader已選出,所以節點5仍成為follwer

->選舉完成后,leader的狀態由looking變為leading,follower的狀態由looking變為following

總的來說,啟動階段的選舉當選的必然為位於中間的節點

運行階段的選舉

運行階段每個節點的zxid都可能不同,但選舉原則與啟動階段一樣,都是先比較zxid,再比較myid,假如主節點3運行中掛掉了,其他所有從節點全部進入looking狀態,節點1、2、4、5的zxid為121、122、124、125,且各從節點都推舉自己為下一個leader,節點1發出(121,1),節點2發出(122,2),節點4發出(124,4),由於節點4的zxid比1、2的大,故4當選,且當選節點票數=3>總節點數/2=5/2=2.5,所以4當選新一代leader,節點5發出(125,5),但此時已經選舉出leader,所以5成為follwer,最后leader變更狀態為leading,follower變更為following

OK,如果文章哪里有錯誤或不足,歡迎各位留言。

創作不易,各位的「三連」是二少創作的最大動力!我們下期見!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM