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 如果和本地投票輪數相等,按照投票的優先級比較收到的選票和自己投出去的選票。
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順序,保證了能夠有優先級最高的節點當主。主從同步通過提議和提交兩個階段,有超過一半的節點寫成功,則認為數據寫成功。
歡迎關注

