ZooKeeper選Leader算法

概念

  • logicalclock: ZooKeeper服務(wù)器Leader選舉的輪次

  • electionEpoch: 當(dāng)前服務(wù)器的選舉輪次,每次進(jìn)入新一輪投票后進(jìn)行加1操作

  • peerEpoch: 被推薦的Leader的選舉輪次

  • 外部投票: 特指其他服務(wù)器發(fā)來的投票

  • 內(nèi)部投票: 服務(wù)器自身當(dāng)前的投票

  • Zookeeper規(guī)定了所有有效的投票都必須在同一輪次

ZXID設(shè)計(jì)

一個(gè)ZXID是64位,高32是紀(jì)元(epoch)編號(hào),每經(jīng)過一次leader選舉產(chǎn)生一個(gè)新的leader,新leader會(huì)將epoch號(hào)+1。低32位是消息計(jì)數(shù)器,每接收到一條消息這個(gè)值+1,新leader選舉后這個(gè)值重置為0,可以簡(jiǎn)單理解epoch為皇帝的年后,低位32位為朝中的大臣,真所謂一朝天子、一朝臣。

選舉流程

ZooKeeper選主的接口是Election,默認(rèn)的具體實(shí)現(xiàn)類是FastLeaderElection,接下來主要走讀下lookForLeader()方法。代碼參考zookeeper-3.4.5

  1. 當(dāng)前服務(wù)器選舉輪次加1操作

  2. 更新提案,默認(rèn)將票投給你自己

  3. 將提案通知給其他服務(wù)器,通知的時(shí)候會(huì)將logicalclock賦值給electionEpoch,即完成加1操作

沒有外部投票的處理流程
有外部投票的處理流程
  1. 外部投票的輪次大于內(nèi)部投票
    更新服務(wù)器的投票輪次,然后內(nèi)部投票和外部投票PK,具體PK或得提案,具體PK算法見下圖。

  2. 中外部投票輪次小于內(nèi)部投票
    直接忽略

  3. 中外部投票輪次等于內(nèi)部投票
    內(nèi)部投票和外部投票PK,具體PK算法見下圖

PK算法
  1. 外部投票中被推薦Leader服務(wù)器的選舉輪次大于內(nèi)部投票,提案變更。

  2. 輪次相同,外部投票被推薦Leader服務(wù)器的ZXID大于內(nèi)部投票,提案變更。

  3. ZXID相同,外部投票被推薦Leader服務(wù)器的SID大于內(nèi)部投票,提案變更。(SID是serverId)

過半投票認(rèn)可當(dāng)前內(nèi)部投票
  1. 過半投票認(rèn)可當(dāng)前內(nèi)部投票

  2. 有沒有被推薦的Leader

  3. 更新服務(wù)器狀態(tài)(leading,observing,following)

總流程

參考:從Paxos到Zookeeper分布式一致性原理與實(shí)踐

區(qū)分外部投票輪次,外部投票中被推薦Leader投票輪次,內(nèi)部同理


        /*
         * Epoch 投票輪次
         */
        long electionEpoch;

        /*
         * epoch of the proposed leader 被推薦Leader投票輪次
         */
        long peerEpoch;

簡(jiǎn)單總結(jié)選主流程(模擬選舉一個(gè)NB的人)

  1. 在沒有遇到比我牛的人之前,第一票推薦我自己。

  2. 我有一個(gè)票箱,保存了當(dāng)前這一輪選舉中自己的推薦人以及接收到的推薦人信息,一人一票,重復(fù)或過期的票概不接受,當(dāng)我發(fā)現(xiàn)了比我推薦的牛人還牛的時(shí)候,改為推薦這個(gè)牛人,否則,我還是推薦我自己。如果我發(fā)現(xiàn)我的選舉輪數(shù)落后了,清空票箱,改為推薦接收到的最新選舉中大家推薦的最牛的那個(gè)人(如果沒有人比我牛,那還是推薦我自己)。

  3. 不斷的重復(fù)上面的過程,不斷的告訴別人“我的投票是第幾輪”、“我推舉的人是誰”。直到我的票箱中“我推舉的最牛的人”收到了不少于N/2+1的推舉投票,此時(shí)這個(gè)人就是我認(rèn)定的最終leader。

  4. 當(dāng)我確定了誰是最終 leader 并且這個(gè) leader 一切正常,我就更新我的狀態(tài)為 FOLLOWING/LEADING(我自己是最終 leader 則是 LEADING 否則就是 FOLLOWING),之后的選舉中都直接反饋我確定的這個(gè)最終 leader。

問題

提交已被Leader Commit的事務(wù)

發(fā)生場(chǎng)景

Leader發(fā)送Propose請(qǐng)求,F(xiàn)ollower F1和Follower F2都向Leader回復(fù)了ACK,Leader向所有的Follower發(fā)送Commit請(qǐng)求并Commit自身,此時(shí)Leader宕機(jī),Leader已經(jīng)Commit,但Follower尚未Commit,數(shù)據(jù)不一致。

處理方式

選舉F.zxid最大的Follower成為新的準(zhǔn)Leader,由于舊Leader宕機(jī)前,半數(shù)或以上的Follower曾經(jīng)發(fā)送ACK消息,新的準(zhǔn)Leader必然是這半數(shù)或以上Follower的一員;新的準(zhǔn)Leader會(huì)發(fā)現(xiàn)自身存在已經(jīng)Propose但尚未Commit的事務(wù)Proposal,新的準(zhǔn)Leader會(huì)向所有的Follower先發(fā)送Propose請(qǐng)求,再發(fā)送Commit請(qǐng)求。

丟棄只被Leader Propose的事務(wù)

發(fā)生場(chǎng)景

Leader收到了事務(wù)請(qǐng)求,將其包裝成了事務(wù)Proposal,此時(shí)Leader宕機(jī),F(xiàn)ollower并沒有收到Propose請(qǐng)求,F(xiàn)ollower進(jìn)入選舉階段,選舉產(chǎn)生新Leader,舊的Leader重啟,以Follower的角色加入集群,此時(shí)舊Leader上有一個(gè)多余的事務(wù)Proposal,數(shù)據(jù)不一致。

處理方式

新的準(zhǔn)Leader會(huì)根據(jù)自己服務(wù)器上最后被提交的事務(wù)Proposal和Follower的事務(wù)Proposal進(jìn)行對(duì)比,然后新的準(zhǔn)Leader要求Follower執(zhí)行一個(gè)回退操作,回退到一個(gè)已經(jīng)被集群半數(shù)以上機(jī)器提交的最新的事務(wù)Proposal。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)自】http://www.cnblogs.com/leesf456/p/6107600.html 一、前言 前...
    lxqfirst閱讀 847評(píng)論 0 0
  • 本文將從系統(tǒng)模型、序列化與協(xié)議、客戶端工作原理、會(huì)話、服務(wù)端工作原理以及數(shù)據(jù)存儲(chǔ)等方面來揭示ZooKeeper的技...
    端木軒閱讀 3,828評(píng)論 0 42
  • Paxos算法與Zookeeper分析 1 Paxos算法 1.1基本定義 算法中的參與者主要分為三個(gè)角色,同時(shí)每...
    meng_philip123閱讀 684評(píng)論 0 11
  • Vote 群首選舉過程是通過投票來實(shí)現(xiàn)的,每個(gè)投票中包含兩個(gè)最基本信息:所推舉 Leader 的 sid 和 zx...
    PFF閱讀 3,000評(píng)論 1 5
  • ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),它包含一個(gè)簡(jiǎn)單的原語集,分布式應(yīng)用程序可以基于...
    Prize閱讀 257評(píng)論 0 1