十分鍾了解ZAB(Zookeeper Atomic Broadcast)協議


Zookeeper基於ZAB(Zookeeper Atomic Broadcast),實現了主備模式下的系統架構,保持集群中各個副本之間的數據一致性。

ZAB協議定義了選舉(election)、發現(discovery)、同步(sync)、廣播(Broadcast)四個階段。

選舉(election)是選出哪台為主機; 發現(discovery)、同步(sync)當主選出后,要做的恢復數據的階段;

廣播(Broadcast)當主機和從選出並同步好數據后,正常的主寫同步從寫數據的階段。

下面簡單地介紹下ZAB協議,目的是能夠快速了解其精髓,快速掌握ZAB協議。然后通過論文了解具體協議的細節。主要介紹選舉和廣播兩個階段。

基本概念

我們了解下zk的一些基本概念。

zk集群有三種角色:

  • leader 就是我們說的主;

  • follower 就是我們說的從;

  • observer 可以認為是主的clone copy,不參與投票,本文可忽略;

zk集群的一個節點,有三種狀態:

  • looking 選舉狀態,當前群龍無首;

  • leading leader才有的狀態;

  • following follower才有的狀態;

每次寫成功的消息,都有一個全局唯一的標識,叫zxid。是64bit的正整數,高32為叫epoch表示選舉紀元,低32位是自增的id,每寫一次加一。 可以想象為中國古代的年號,例如萬歷十五年,萬歷是epoch,十五年是id。

zk集群一般都是奇數個機器(2n+1),只有一個主機leader,其余都是從機follower。選主還是寫數據,要有>=n+1台選舉相同,才能執行選舉的操作。

投票優先級:優先比較zxid,如果相等,再比較機器的id,都按從大到小的順序。

選舉

當集群新建,或者主機死機,或者主機與一半或以上的從機失去聯系后,都會觸發選擇新的主機操作。有兩種算法 fast paxosbasic paxos

fast paxos

默認ZAB采用的算法是fast paxos算法。

每次選舉都要把選舉輪數加一,類似於zxid里的epoch字段,防止不同輪次的選舉互相干擾。

每個進入looking狀態的節點,最開始投票給自己,然后把投票消息發給其它機器。內容為<第幾輪投票,被投節點的zxid,被投節點的編號>

其他looking狀態的節點收到后,

1 首先判斷票是否有效。 是否有效的方法為看票的投票輪數和本地記載的投票輪數是否相等:

2.1 如果比本地投票輪數的小,丟棄。

2.2 如果比本地投票輪數的大

  1. 證明自己投票過期了,清空本地投票信息,

  2. 更新投票輪數和結果為收到的內容。

  3. 通知其他所有節點新的投票方案。

2.3 如果和本地投票輪數相等,按照投票的優先級比較收到的選票和自己投出去的選票。

  2.3.1 如果收到的優先級大,更新自己的投票為對方發過來投票方案,把投票發出去。 

  2.3.2 如果收到的優先級小,則忽略該投票。

  2.3.3 如果收到的優先級相等,則更新對應節點的投票。

3 每收集到一個投票后,查看已經收到的投票結果記錄列表,看是否有節點能夠達到一半以上的投票數。如果有達到,則終止投票,宣布選舉結束,更新自身狀態。然后進行發現和同步階段。 否則繼續收集投票。

basic paxos

1 每個looking節點先發出請求,詢問其他節點的投票。

其他節點返回自己的投票 < zk的id,zxid >。第一次都投自己。

2 收到結果后,如果收到的投票比自己投票的zxid大,更新自己的投票。

3 當收到所有節點返回后,統計投票,有一個節點的選舉達到一半以上,則選舉成功。 否則繼續開始下一輪詢問,直到選擇出leader結束。

basic paxos和fast paxos區別

這里fast是主動推送出,只要結果有更新,就馬上同步給其他節點。其他節點可能還沒把自己的票通知給所有節點,就發現自己投的票優先級低,要更新投票,然后更新再重新通知給所有節點。

basic則要每一節點都詢問完,才能知道新結果,然后再去問其他節點新的選舉結果。

fast比basic快的地方,是一個節點,不用和每個節點都交換投票信息后,才能知道自己的票是否要更新。會減少交互次數。

廣播——主從同步

主從同步數據比較簡單, 當有寫操作時,如果是從機接收,會轉到主機。做一次轉發,保證寫都是在主機上進行。

主先提議事務,收到過半回復后,再發提交。 主收到寫操作時,先本地生成事務為事務生成zxid,然后發給所有follower節點。 當follower收到事務時,先把提議事務的日志寫到本地磁盤,成功后返回給leader。 leader收到過半反饋后對事務提交。再通知所有的follower提交事務,follower收到后也提交事務,提交后就可以對客戶端進行分發了。

總結

通過只有主控制寫然后同步從,保證了生成全局zxid不沖突。全局唯一的zxid能夠給選舉和同步數據區分出優先級。 選舉主部分了解fast paxos原理即可。 核心思想是遞增的zxid順序,保證了能夠有優先級最高的節點當主。主從同步通過提議和提交兩個階段,有超過一半的節點寫成功,則認為數據寫成功。


 

歡迎關注


免責聲明!

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



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