ZAB一致性協(xié)議

原文鏈接:https://www.cnblogs.com/stateis0/p/9062133.html
推薦看原文,原文排版很清晰

1. 什么是 ZAB 協(xié)議铣缠? ZAB 協(xié)議介紹

  1. ZAB 協(xié)議全稱:Zookeeper Atomic Broadcast(Zookeeper 原子廣播協(xié)議)谚咬。

  2. Zookeeper 是一個(gè)為分布式應(yīng)用提供高效且可靠的分布式協(xié)調(diào)服務(wù)鹦付。在解決分布式一致性方面尚粘,Zookeeper 并沒有使用 Paxos 择卦,而是采用了 ZAB 協(xié)議。

  3. ZAB 協(xié)議定義:ZAB 協(xié)議是為分布式協(xié)調(diào)服務(wù) Zookeeper 專門設(shè)計(jì)的一種支持 崩潰恢復(fù)原子廣播 協(xié)議。下面我們會(huì)重點(diǎn)講這兩個(gè)東西秉继。

  4. 基于該協(xié)議祈噪,Zookeeper 實(shí)現(xiàn)了一種 主備模式 的系統(tǒng)架構(gòu)來保持集群中各個(gè)副本之間數(shù)據(jù)一致性。具體如下圖所示:

image.png

上圖顯示了 Zookeeper 如何處理集群中的數(shù)據(jù)尚辑。所有客戶端寫入數(shù)據(jù)都是寫入到 主進(jìn)程(稱為 Leader)中辑鲤,然后,由 Leader 復(fù)制到備份進(jìn)程(稱為 Follower)中杠茬。從而保證數(shù)據(jù)一致性月褥。從設(shè)計(jì)上看,和 Raft 類似瓢喉。

  1. 那么復(fù)制過程又是如何的呢宁赤?復(fù)制過程類似 2PC,ZAB 只需要 Follower 有一半以上返回 Ack 信息就可以執(zhí)行提交栓票,大大減小了同步阻塞决左。也提高了可用性。

簡(jiǎn)單介紹完走贪,開始重點(diǎn)介紹 消息廣播崩潰恢復(fù)佛猛。整個(gè) Zookeeper 就是在這兩個(gè)模式之間切換。 簡(jiǎn)而言之坠狡,當(dāng) Leader 服務(wù)可以正常使用继找,就進(jìn)入消息廣播模式,當(dāng) Leader 不可用時(shí)逃沿,則進(jìn)入崩潰恢復(fù)模式码荔。

2. 消息廣播

ZAB 協(xié)議的消息廣播過程使用的是一個(gè)原子廣播協(xié)議,類似一個(gè) 二階段提交過程感挥。對(duì)于客戶端發(fā)送的寫請(qǐng)求缩搅,全部由 Leader 接收,Leader 將請(qǐng)求封裝成一個(gè)事務(wù) Proposal触幼,將其發(fā)送給所有 Follwer 硼瓣,然后,根據(jù)所有 Follwer 的反饋置谦,如果超過半數(shù)成功響應(yīng)堂鲤,則執(zhí)行 commit 操作(先提交自己,再發(fā)送 commit 給所有 Follwer)媒峡。

基本上瘟栖,整個(gè)廣播流程分為 3 步驟:

1.將數(shù)據(jù)都復(fù)制到 Follwer 中

image.png
  1. 等待 Follwer 回應(yīng) Ack,最低超過半數(shù)即成功
image.png
  1. 當(dāng)超過半數(shù)成功回應(yīng)谅阿,則執(zhí)行 commit 半哟,同時(shí)提交自己
image.png

通過以上 3 個(gè)步驟酬滤,就能夠保持集群之間數(shù)據(jù)的一致性。實(shí)際上寓涨,在 Leader 和 Follwer 之間還有一個(gè)消息隊(duì)列盯串,用來解耦他們之間的耦合,避免同步戒良,實(shí)現(xiàn)異步解耦体捏。

還有一些細(xì)節(jié):

  1. Leader 在收到客戶端請(qǐng)求之后,會(huì)將這個(gè)請(qǐng)求封裝成一個(gè)事務(wù)糯崎,并給這個(gè)事務(wù)分配一個(gè)全局遞增的唯一 ID几缭,稱為事務(wù)ID(ZXID),ZAB 兮協(xié)議需要保證事務(wù)的順序沃呢,因此必須將每一個(gè)事務(wù)按照 ZXID 進(jìn)行先后排序然后處理奏司。

  2. 在 Leader 和 Follwer 之間還有一個(gè)消息隊(duì)列,用來解耦他們之間的耦合樟插,解除同步阻塞韵洋。

  3. zookeeper集群中為保證任何所有進(jìn)程能夠有序的順序執(zhí)行,只能是 Leader 服務(wù)器接受寫請(qǐng)求黄锤,即使是 Follower 服務(wù)器接受到客戶端的請(qǐng)求搪缨,也會(huì)轉(zhuǎn)發(fā)到 Leader 服務(wù)器進(jìn)行處理。

  4. 實(shí)際上鸵熟,這是一種簡(jiǎn)化版本的 2PC副编,不能解決單點(diǎn)問題。等會(huì)我們會(huì)講述 ZAB 如何解決單點(diǎn)問題(即 Leader 崩潰問題)流强。

3. 崩潰恢復(fù)

剛剛我們說消息廣播過程中痹届,Leader 崩潰怎么辦?還能保證數(shù)據(jù)一致嗎打月?如果 Leader 先本地提交了队腐,然后 commit 請(qǐng)求沒有發(fā)送出去,怎么辦奏篙?

實(shí)際上柴淘,當(dāng) Leader 崩潰,即進(jìn)入我們開頭所說的崩潰恢復(fù)模式(崩潰即:Leader 失去與過半 Follwer 的聯(lián)系)秘通。下面來詳細(xì)講述为严。

假設(shè)1:Leader 在復(fù)制數(shù)據(jù)給所有 Follwer 之后崩潰,怎么辦肺稀?
假設(shè)2:Leader 在收到 Ack 并提交了自己第股,同時(shí)發(fā)送了部分 commit 出去之后崩潰怎么辦?

針對(duì)這些問題话原,ZAB 定義了 2 個(gè)原則:

  1. ZAB 協(xié)議確保那些已經(jīng)在 Leader 提交的事務(wù)最終會(huì)被所有服務(wù)器提交夕吻。
  2. ZAB 協(xié)議確保丟棄那些只在 Leader 提出/復(fù)制诲锹,但沒有提交的事務(wù)。

所以梭冠,ZAB 設(shè)計(jì)了下面這樣一個(gè)選舉算法:
能夠確保提交已經(jīng)被 Leader 提交的事務(wù),同時(shí)丟棄已經(jīng)被跳過的事務(wù)改备。

針對(duì)這個(gè)要求控漠,如果讓 Leader 選舉算法能夠保證新選舉出來的 Leader 服務(wù)器擁有集群總所有機(jī)器編號(hào)(即 ZXID 最大)的事務(wù),那么就能夠保證這個(gè)新選舉出來的 Leader 一定具有所有已經(jīng)提交的提案悬钳。
而且這么做有一個(gè)好處是:可以省去 Leader 服務(wù)器檢查事務(wù)的提交和丟棄工作的這一步操作盐捷。

image.png

這樣,我們剛剛假設(shè)的兩個(gè)問題便能夠解決默勾。假設(shè) 1 最終會(huì)丟棄調(diào)用沒有提交的數(shù)據(jù)碉渡,假設(shè) 2 最終會(huì)同步所有服務(wù)器的數(shù)據(jù)。這個(gè)時(shí)候母剥,就引出了一個(gè)問題滞诺,如何同步?

4. 數(shù)據(jù)同步

當(dāng)崩潰恢復(fù)之后环疼,需要在正式工作之前(接收客戶端請(qǐng)求)习霹,Leader 服務(wù)器首先確認(rèn)事務(wù)是否都已經(jīng)被過半的 Follwer 提交了,即是否完成了數(shù)據(jù)同步炫隶。目的是為了保持?jǐn)?shù)據(jù)一致淋叶。

當(dāng)所有的 Follwer 服務(wù)器都成功同步之后,Leader 會(huì)將這些服務(wù)器加入到可用服務(wù)器列表中伪阶。

實(shí)際上煞檩,Leader 服務(wù)器處理或丟棄事務(wù)都是依賴著 ZXID 的,那么這個(gè) ZXID 如何生成呢栅贴?

答:在 ZAB 協(xié)議的事務(wù)編號(hào) ZXID 設(shè)計(jì)中斟湃,ZXID 是一個(gè) 64 位的數(shù)字,其中低 32 位可以看作是一個(gè)簡(jiǎn)單的遞增的計(jì)數(shù)器檐薯,針對(duì)客戶端的每一個(gè)事務(wù)請(qǐng)求桐早,Leader 都會(huì)產(chǎn)生一個(gè)新的事務(wù) Proposal 并對(duì)該計(jì)數(shù)器進(jìn)行 + 1 操作。

而高 32 位則代表了 Leader 服務(wù)器上取出本地日志中最大事務(wù) Proposal 的 ZXID厨剪,并從該 ZXID 中解析出對(duì)應(yīng)的 epoch 值哄酝,然后再對(duì)這個(gè)值加一。

image.png

高 32 位代表了每代 Leader 的唯一性祷膳,低 32 代表了每代 Leader 中事務(wù)的唯一性陶衅。同時(shí),也能讓 Follwer 通過高 32 位識(shí)別不同的 Leader直晨。簡(jiǎn)化了數(shù)據(jù)恢復(fù)流程搀军。

基于這樣的策略:當(dāng) Follower 鏈接上 Leader 之后膨俐,Leader 服務(wù)器會(huì)根據(jù)自己服務(wù)器上最后被提交的 ZXID 和 Follower 上的 ZXID 進(jìn)行比對(duì),比對(duì)結(jié)果要么回滾罩句,要么和 Leader 同步焚刺。

5. 總結(jié)

到了總結(jié)的時(shí)刻了。

ZAB 協(xié)議和我們之前看的 Raft 協(xié)議實(shí)際上是有相似之處的门烂,比如都有一個(gè) Leader乳愉,用來保證一致性(Paxos 并沒有使用 Leader 機(jī)制保證一致性)。再有采取過半即成功的機(jī)制保證服務(wù)可用(實(shí)際上 Paxos 和 Raft 都是這么做的)屯远。

ZAB 讓整個(gè) Zookeeper 集群在兩個(gè)模式之間轉(zhuǎn)換蔓姚,消息廣播和崩潰恢復(fù),消息廣播可以說是一個(gè)簡(jiǎn)化版本的 2PC慨丐,通過崩潰恢復(fù)解決了 2PC 的單點(diǎn)問題坡脐,通過隊(duì)列解決了 2PC 的同步阻塞問題。

而支持崩潰恢復(fù)后數(shù)據(jù)準(zhǔn)確性的就是數(shù)據(jù)同步了房揭,數(shù)據(jù)同步基于事務(wù)的 ZXID 的唯一性來保證备闲。通過 + 1 操作可以辨別事務(wù)的先后順序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捅暴,一起剝皮案震驚了整個(gè)濱河市浅役,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伶唯,老刑警劉巖觉既,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乳幸,居然都是意外死亡瞪讼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門粹断,熙熙樓的掌柜王于貴愁眉苦臉地迎上來符欠,“玉大人,你說我怎么就攤上這事瓶埋∠J粒” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵养筒,是天一觀的道長(zhǎng)曾撤。 經(jīng)常有香客問我,道長(zhǎng)晕粪,這世上最難降的妖魔是什么挤悉? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮巫湘,結(jié)果婚禮上装悲,老公的妹妹穿的比我還像新娘昏鹃。我一直安慰自己,他們只是感情好诀诊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布洞渤。 她就那樣靜靜地躺著,像睡著了一般属瓣。 火紅的嫁衣襯著肌膚如雪载迄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天奠涌,我揣著相機(jī)與錄音宪巨,去河邊找鬼磷杏。 笑死溜畅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的极祸。 我是一名探鬼主播慈格,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼遥金!你這毒婦竟也來了浴捆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤稿械,失蹤者是張志新(化名)和其女友劉穎选泻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體美莫,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡页眯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厢呵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窝撵。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖襟铭,靈堂內(nèi)的尸體忽然破棺而出碌奉,到底是詐尸還是另有隱情,我是刑警寧澤寒砖,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布赐劣,位于F島的核電站,受9級(jí)特大地震影響哩都,放射性物質(zhì)發(fā)生泄漏隆豹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一茅逮、第九天 我趴在偏房一處隱蔽的房頂上張望璃赡。 院中可真熱鬧判哥,春花似錦、人聲如沸碉考。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侯谁。三九已至锌仅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墙贱,已是汗流浹背热芹。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惨撇,地道東北人伊脓。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像魁衙,于是被迫代替她去往敵國(guó)和親报腔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345