來(lái)源:https://t.1yb.co/l5oJ
ZAB協(xié)議是什么?
ZAB 協(xié)議全稱(chēng):Zookeeper Atomic Broadcast(Zookeeper 原子廣播協(xié)議), 它保證Zookeeper 在主從系統(tǒng)架構(gòu)下,集群中各個(gè)節(jié)點(diǎn)之間數(shù)據(jù)的一致性。保證數(shù)據(jù)一致性的分兩種情況討論,一種集群正常運(yùn)行,一種集群不正常。
Zookeeper集群正常運(yùn)行時(shí)采用「消息廣播」模式保證;
Leader節(jié)點(diǎn)宕機(jī)情況下采用「崩潰恢復(fù)」模式,保證;
消息廣播
消息廣播,就是集群正常運(yùn)行時(shí)接收客戶(hù)端寫(xiě)請(qǐng)求,需要保證集群數(shù)據(jù)的一致。
消息廣播是一個(gè)原子廣播協(xié)議,類(lèi)似二階段提交過(guò)程。主要3個(gè)步驟:
Leader 接收客戶(hù)端的寫(xiě)請(qǐng)求
Leader 封裝事物Proposal消息,廣播給集群中的所有Follower,等待ACK響應(yīng)
當(dāng)Leader接收 Follwer的ACK響應(yīng)數(shù)過(guò)半(當(dāng)然包括自己),就commit自己本地?cái)?shù)據(jù),然后將commit請(qǐng)求廣播給集群中的Follwer
消息廣播大概流程如下:
結(jié)合上圖,看看消息廣播的具體細(xì)節(jié):

Leader 接收到請(qǐng)求后在進(jìn)行廣播事務(wù) Proposal 之前會(huì)為這個(gè)事務(wù)分配一個(gè) ZXID,再進(jìn)行廣播。
Leader 會(huì)為每個(gè)Follower都各自分配一個(gè)單獨(dú)的隊(duì)列,然后將需要廣播的事務(wù) Proposal 依次放入這些隊(duì)列中去,并根據(jù) FIFO 策略進(jìn)行消息的發(fā)送。
每個(gè)Follower 在接收到后都會(huì)以事務(wù)日志的形式寫(xiě)入到本地磁盤(pán)中,并且在成功寫(xiě)入后返回給 Leader一個(gè) ACK 響應(yīng)。
當(dāng)有超過(guò)半數(shù)的Follower ACK 響應(yīng)后,Leader 就會(huì)廣播一個(gè) Commit 消息給所有的 Follower,F(xiàn)ollower 接收到后就完成對(duì)事務(wù)的提交操作。
ZXID?的設(shè)計(jì)也很有特點(diǎn),是一個(gè)全局有序的?64?位的數(shù)字,可以分為兩個(gè)部分:
高?32?位是:epoch(紀(jì)元),代表著周期,每當(dāng)選舉產(chǎn)生一個(gè)新的?Leader?服務(wù)器時(shí)
就會(huì)取出其本地日志中最大事務(wù)的?ZXID?,解析出epoch(紀(jì)元)值操作加?1作為新的?epoch?,
并將低?32?位置零。
低?32?位是:counter(計(jì)數(shù)器),它是一個(gè)簡(jiǎn)單的單調(diào)遞增的計(jì)數(shù)器,針對(duì)客戶(hù)端的每個(gè)事務(wù)請(qǐng)求都會(huì)進(jìn)行加?1
畫(huà)個(gè)更詳細(xì)的圖:

崩潰恢復(fù)
崩潰恢復(fù),就是在Leader節(jié)點(diǎn)宕機(jī)的時(shí)候,重新選舉出Leader后(關(guān)于選舉機(jī)制可以參看這片文章),F(xiàn)ollower 同步新Leader時(shí),需要保證一致性。
在Leader節(jié)點(diǎn)宕機(jī)時(shí),可能會(huì)發(fā)生2種情況,針對(duì)這兩種情況我們來(lái)分析,它是怎么保證數(shù)據(jù)一致的。
Leader 在廣播事務(wù) Proposal 給所有 Follwer 之后宕機(jī),數(shù)據(jù)怎么處理?
Leader 在收到 ACK 并commit自己,同時(shí)發(fā)送了部分 commit 出去之后宕機(jī),數(shù)據(jù)怎么處理?
針對(duì)這2個(gè)情況,ZAB 定義了2個(gè)原則:
ZAB 協(xié)議會(huì)保存那些被Leader廣播Proposal且提交的事務(wù)。
ZAB 協(xié)議會(huì)丟棄那些被Leader廣播Proposal但沒(méi)提交的事務(wù)。
說(shuō)白了,就是Follwer接收到Leader的 commit請(qǐng)求的那些數(shù)據(jù)才有效。
在選舉機(jī)制這篇文章,我們就可以確定出新的Leader節(jié)點(diǎn)數(shù)據(jù)一定是最新的。然后Follower就進(jìn)行數(shù)據(jù)同步咯。
- END -