一文了解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 paxos和 basic paxos。
fast paxos
預設ZAB採用的演算法是fast paxos演算法。
每次選舉都要把選舉輪數加一,類似於zxid裡的epoch欄位,防止不同輪次的選舉互相干擾。
每個進入looking狀態的節點,最開始投票給自己,然後把投票訊息發給其它機器。內容為<第幾輪投票,被投節點的zxid,被投節點的編號>。
其他looking狀態的節點收到後,
1 首先判斷票是否有效。 是否有效的方法為看票的投票輪數和本地記載的投票輪數是否相等:
2.1 如果比本地投票輪數的小,丟棄。
2.2 如果比本地投票輪數的大
證明自己投票過期了,清空本地投票資訊,
更新投票輪數和結果為收到的內容。
通知其他所有節點新的投票方案。
2.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順序,保證了能夠有優先順序最高的節點當主。主從同步通過提議和提交兩個階段,有超過一半的節點寫成功,則認為資料寫成功。
寫在最後:歡迎留言討論,加關注,持續更新!