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),確認集群中最新提議歷史。

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

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

2. Zookeeper的仲裁原則
對于ZAB協(xié)議來說,遵循如下的仲裁原則:少數(shù)服從多數(shù)
深入解讀,可以得出如下的幾點:
- 群首選舉過程中有超過一半的節(jié)點達成一致則選舉過程結束。
- 事務的確認同樣遵循該原則,只要得到半數(shù)以上的支持,則表示事務成功。
- 少數(shù)服從多數(shù)可以保證集群分裂也存在至少一個公共節(jié)點。
- 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算法。
群首選舉的流程圖如下:

選舉過程中比較重要的一步是判斷是否變更選票,這里的詳細判斷邏輯如下:
- 優(yōu)先選擇epoch較大
- epoch相等時,優(yōu)先選擇zxid較大的
- epoch和zxid都相等時,選擇server id較大的
3.2 恢復階段
該階段,follower同步自己的最新的zxid給leader,leader來決定如何同步。
注意:
- 同步事務時,Zookeeper根據oldThreshold來判斷是同步相差部分還是全量數(shù)據
-
對于leader zxid之后的事務,leader會發(fā)送trunc指令來中支
恢復的具體流程如下:
image.png
3.3 廣播階段
該階段接收服務并進行事務廣播,不過詳細介紹。
