Zookeeper ZAB協(xié)議分析

1. ZAB協(xié)議

ZAB協(xié)議(Zookeeper Atomic Broadcast Protocol)是Zookeeper系統(tǒng)專門設計的一種支持崩潰恢復的原子廣播協(xié)議。Zookeeper使用該協(xié)議來實現(xiàn)分布數(shù)據一致性并實現(xiàn)了一種主備模式的系統(tǒng)架構來保持各集群中各個副本之間的數(shù)據一致性。

ZAB協(xié)議理論與Zookeeper對該協(xié)議的實現(xiàn)還是存在一些差別,本文將針對ZAB的協(xié)議本身和Zookeeper的實現(xiàn)兩個維度來介紹。

1.2 ZAB協(xié)議的四階段

在詳細介紹ZAB協(xié)議之前,我們先介紹一下ZAB協(xié)議中的一些常用術語。

服務器的狀態(tài)

  • Looking:該狀態(tài)表示集群中不存在群首節(jié)點,進入群首選舉過程。
  • Leading:群首狀態(tài),表示該服務器是群首節(jié)點。
  • Following:跟隨者狀態(tài),表示該服務器是群首的Follow節(jié)點。
    注意:服務器默認是Looking狀態(tài)

節(jié)點的持久數(shù)據狀態(tài)

  • history: 當前節(jié)點接收到的事務提議的log
  • acceptedEpoch:follower節(jié)點已經接受的leader更改年號的NEWEPOCH提議
  • currentEpoch:當前所處的年代
  • lastZxid:history中最近接收到的提議的zxid

a. 選舉階段

在選舉階段,只要有節(jié)點有集群中超過半數(shù)的節(jié)點支持,該節(jié)點就會被作為準Leader。該節(jié)點暫不會作為Leader節(jié)點來提供服務,能否真正作為Leader節(jié)點,還依賴與后續(xù)的階段能否正常完成。

b. 發(fā)現(xiàn)階段

在選舉出Leader節(jié)點后,集群進入發(fā)現(xiàn)階段。Follow與準Leader進行通信,同步集群中各個節(jié)點的狀態(tài),確認集群中最新提議歷史。


ZAB協(xié)議發(fā)現(xiàn)階段

c. 同步階段

在完成發(fā)現(xiàn)階段后,準Leader可以獲取集群中最新的提議歷史。準Leader在該階段會把最新的提議歷史同步到集群中的所有節(jié)點。當同步完成時,準Leader才會真正成為Leader,執(zhí)行Leader的工作。


ZAB協(xié)議同步階段

d. 廣播階段

到了該階段,Zookeeper才能真正對外提供事務服務,leader可以進行消息的廣播。


ZAB協(xié)議廣播階段

2. Zookeeper的仲裁原則

對于ZAB協(xié)議來說,遵循如下的仲裁原則:少數(shù)服從多數(shù)
深入解讀,可以得出如下的幾點:

    1. 群首選舉過程中有超過一半的節(jié)點達成一致則選舉過程結束。
    1. 事務的確認同樣遵循該原則,只要得到半數(shù)以上的支持,則表示事務成功。
    1. 少數(shù)服從多數(shù)可以保證集群分裂也存在至少一個公共節(jié)點。
    1. Zookeeper的集群數(shù)配置奇數(shù)更為合理,因為n與n+1的容錯是相等的,n這里為奇數(shù)。

3. Zookeeper對ZAB協(xié)議的實現(xiàn)

Java版本對ZAB協(xié)議的實現(xiàn)與原理有一定的區(qū)別,ZAB的實現(xiàn)只有三個階段:

  • 選舉階段
  • 恢復階段(發(fā)現(xiàn)階段+同步階段)
  • 廣播階段

3.1. 選舉階段

服務選舉階段,要求服務器之間兩兩相交,下面我們詳細介紹一下Zookeeper服務器間的連接方式。
首先,每個服務器會記錄本服務器自身的sid。sid由服務器的配置文件指定。
其次,Zookeeper只允許sid較大的服務器與sid較小的服務器建立連接。這樣可以避免建立多余的連接。

在選舉階段,Zookeeper有不同的算法來實現(xiàn)群首的選舉,部分算法已經廢棄,這里我們介紹其中的FastLeaderElection算法。

群首選舉的流程圖如下:


群首選舉步驟

選舉過程中比較重要的一步是判斷是否變更選票,這里的詳細判斷邏輯如下:

  1. 優(yōu)先選擇epoch較大
  2. epoch相等時,優(yōu)先選擇zxid較大的
  3. epoch和zxid都相等時,選擇server id較大的

3.2 恢復階段

該階段,follower同步自己的最新的zxid給leader,leader來決定如何同步。
注意:

  1. 同步事務時,Zookeeper根據oldThreshold來判斷是同步相差部分還是全量數(shù)據
  2. 對于leader zxid之后的事務,leader會發(fā)送trunc指令來中支
    恢復的具體流程如下:


    image.png

3.3 廣播階段

該階段接收服務并進行事務廣播,不過詳細介紹。

參考資料:http://www.itdecent.cn/p/9f3a9528524f

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容