Paxos时呀,Raft张漂,Zab強(qiáng)一致性協(xié)議-Zab篇

Zab也是一個(gè)強(qiáng)一致性算法,也是(multi-)Paxos的一種谨娜,全稱是Zookeeper atomic broadcast protocol航攒,是Zookeeper內(nèi)部用到的一致性協(xié)議。相比Paxos趴梢,也易于理解漠畜。其保證了消息的全局有序和因果有序,擁有著一致性坞靶。Zab和Raft也是非常相似的憔狞,只是其中有些概念名詞不一樣。

Role(or Status)

節(jié)點(diǎn)狀態(tài):

Leading:說明當(dāng)前節(jié)點(diǎn)為Leader

Following:說明當(dāng)前節(jié)點(diǎn)為Follower

Election:說明節(jié)點(diǎn)處于選舉狀態(tài)彰阴。整個(gè)集群都處于選舉狀態(tài)中瘾敢。

Epoch邏輯時(shí)鐘

Epoch相當(dāng)于paxos中的proposerID,Raft中的term尿这,相當(dāng)于一個(gè)國家廉丽,朝代紀(jì)元。

Quorums:

多數(shù)派妻味,集群中超過半數(shù)的節(jié)點(diǎn)集合。

節(jié)點(diǎn)中的持久化信息:

history:?a log of transaction proposals accepted; 歷史提議日志文件

acceptedEpoch:?the epoch number of the last NEWEPOCH message accepted; 集群中的最近最新Epoch

currentEpoch:?the epoch number of the last NEWLEADER message accepted; 集群中的最近最新Leader的Epoch

lastZxid:?zxid of the last proposal in the history log; 歷史提議日志文件的最后一個(gè)提議的zxid

在 ZAB 協(xié)議的事務(wù)編號(hào) Zxid 設(shè)計(jì)中欣福,Zxid?是一個(gè) 64 位的數(shù)字责球,

低 32 位是一個(gè)簡單的單調(diào)遞增的計(jì)數(shù)器,針對客戶端每一個(gè)事務(wù)請求,計(jì)數(shù)器加 1雏逾;

高 32 位則代表 Leader 周期 epoch 的編號(hào)嘉裤,每個(gè)當(dāng)選產(chǎn)生一個(gè)新的 Leader 服務(wù)器,就會(huì)從這個(gè) Leader 服務(wù)器上取出其本地日志中最大事務(wù)的ZXID栖博,并從中讀取 epoch 值屑宠,然后加 1,以此作為新的 epoch仇让,并將低 32 位從 0 開始計(jì)數(shù)典奉。

epoch:可以理解為當(dāng)前集群所處的年代或者周期,每個(gè) leader 就像皇帝丧叽,都有自己的年號(hào)卫玖,所以每次改朝換代,leader 變更之后踊淳,都會(huì)在前一個(gè)年代的基礎(chǔ)上加 1假瞬。這樣就算舊的 leader 崩潰恢復(fù)之后,也沒有人聽他的了迂尝,因?yàn)?follower 只聽從當(dāng)前年代的 leader 的命令脱茉。

ZAB協(xié)議

Zab協(xié)議分為四個(gè)階段

Phase 0: Leader election(選舉階段,Leader不存在)

節(jié)點(diǎn)在一開始都處于選舉階段垄开,只要有一個(gè)節(jié)點(diǎn)得到超半數(shù)Quorums節(jié)點(diǎn)的票數(shù)的支持琴许,它就可以當(dāng)選prospective ?leader。只有到達(dá) Phase 3 prospective leader 才會(huì)成為established ?leader(EL)说榆。

這一階段的目的是就是為了選出一個(gè)prospective leader(PL)虚吟,然后進(jìn)入下一個(gè)階段。

協(xié)議并沒有規(guī)定詳細(xì)的選舉算法签财,后面我們會(huì)提到實(shí)現(xiàn)中使用的?Fast Leader Election串慰。

Phase 1: Discovery(發(fā)現(xiàn)階段,Leader不存在)

在這個(gè)階段唱蒸,PL收集Follower發(fā)來的acceptedEpoch(或者)邦鲫,并確定了PL的Epoch和Zxid最大,則會(huì)生成一個(gè)NEWEPOCH分發(fā)給Follower神汹,F(xiàn)ollower確認(rèn)無誤后返回ACK給PL庆捺。

這個(gè)一階段的主要目的是PL生成NEWEPOCH,同時(shí)更新Followers的acceptedEpoch屁魏,并尋找最新的historylog滔以,賦值給PL的history。

這個(gè)階段的根本:發(fā)現(xiàn)最新的history log氓拼,發(fā)現(xiàn)最新的history log你画,發(fā)現(xiàn)最新的history log抵碟。

一個(gè) follower 只會(huì)連接一個(gè) leader,如果有一個(gè)節(jié)點(diǎn) f 認(rèn)為另一個(gè) follower 是 leader坏匪,f 在嘗試連接 p 時(shí)會(huì)被拒絕拟逮,f 被拒絕之后,就會(huì)進(jìn)入 Phase 0适滓。

1PL?????????Followers

2|<---------X--X--X????????FOLLOWERINFO(F.acceptedEpoch)

3X--------->|->|->|????????NEWEPOCH(e′)

4|<---------X--X--X????????ACKEPOCH(F.currentEpoch,?F.history,?F.lastZxid)敦迄,接著PL尋找所有Follower和PL中最新的history賦值給PL.history

Phase 2: Synchronization(同步階段,Leader不存在)

同步階段主要是利用 leader 前一階段獲得的最新提議歷史凭迹,同步集群中所有的副本罚屋。只有當(dāng) quorum 都同步完成,PL才會(huì)成為EL蕊苗。follower 只會(huì)接收 zxid 比自己的 lastZxid 大的提議沿后。

這個(gè)一階段的主要目的是同步PL的historylog副本。

1PL?????????Followers

2X--------->|->|->|????????NEWLEADER(e′?,?L.history)?

3|<---------X--X--X????????ACKNEWLEADER(e′,L.history)

4X--------->|->|->|????????COMMIT?message,Follow?Deliver??v,?z?,PL->L

Phase 3: Broadcast(廣播階段朽砰,Leader存在)

到了這個(gè)階段尖滚,Zookeeper 集群才能正式對外提供事務(wù)服務(wù),并且 leader 可以進(jìn)行消息廣播瞧柔。同時(shí)如果有新的節(jié)點(diǎn)加入漆弄,還需要對新節(jié)點(diǎn)進(jìn)行同步。

這個(gè)一階段的主要目的是接受請求造锅,進(jìn)行消息廣播

值得注意的是撼唾,ZAB 提交事務(wù)并不像 2PC 一樣需要全部 follower 都 ACK,只需要得到 quorum (超過半數(shù)的節(jié)點(diǎn))的 ACK 就可以了哥蔚。

1Client?????Leader??????Followers

2|?????????|??????????|??|??|

3???X-------->|??????????|??|??|??????write?Request

4|?????????X--------->|->|->|?????sent?Propose??e′,??v,?z??

5|?????????|<---------X--X--X?????Append?proposal?to?F.history,Send?ACK(?e′,??v,?z??)?to?L

6|?????????X--------->|->|->|?????COMMIT(e′,??v,?z?),F?Commit?(deliver)?transaction??v,?z?

zookeeper中zab協(xié)議的實(shí)現(xiàn)

協(xié)議的 Java 版本實(shí)現(xiàn)跟上面的定義有些不同倒谷,選舉階段使用的是 Fast Leader Election(FLE),它包含了 Phase 1 的發(fā)現(xiàn)職責(zé)糙箍。因?yàn)?FLE 會(huì)選舉擁有最新提議歷史的節(jié)點(diǎn)作為 leader渤愁,這樣就省去了發(fā)現(xiàn)最新提議的步驟。實(shí)際的實(shí)現(xiàn)將 Phase 1 和 Phase 2 合并為 Recovery Phase(恢復(fù)階段)深夯。所以抖格,ZAB 的實(shí)現(xiàn)只有三個(gè)階段:

Phase 1:Fast Leader Election(快速選舉階段,Leader不存在)

前面提到 FLE 會(huì)選舉擁有最新提議歷史(lastZixd最大)的節(jié)點(diǎn)作為 leader咕晋,這樣就省去了發(fā)現(xiàn)最新提議的步驟雹拄。這是基于擁有最新提議的節(jié)點(diǎn)也有最新提交記錄的前提。

每個(gè)節(jié)點(diǎn)會(huì)同時(shí)向自己和其他節(jié)點(diǎn)發(fā)出投票請求掌呜,互相投票滓玖。

選舉流程:

選epoch最大的

epoch相等,選 zxid 最大的

epoch和zxid都相等质蕉,選擇serverID最大的(就是我們配置zoo.cfg中的myid)

節(jié)點(diǎn)在選舉開始都默認(rèn)投票給自己势篡,當(dāng)接收其他節(jié)點(diǎn)的選票時(shí)损姜,會(huì)根據(jù)上面的條件更改自己的選票并重新發(fā)送選票給其他節(jié)點(diǎn),當(dāng)有一個(gè)節(jié)點(diǎn)的得票超過半數(shù)殊霞,該節(jié)點(diǎn)會(huì)設(shè)置自己的狀態(tài)為 leading,其他節(jié)點(diǎn)會(huì)設(shè)置自己的狀態(tài)為 following汰蓉。

Phase 2:Recovery Phase(恢復(fù)階段绷蹲,Leader不存在)

這一階段 follower 發(fā)送它們的 lastZixd 給 leader,leader 根據(jù) lastZixd 決定如何同步數(shù)據(jù)顾孽。這里的實(shí)現(xiàn)跟前面 Phase 2 有所不同:Follower 收到 TRUNC 指令會(huì)中止 L.lastCommittedZxid 之后的提議祝钢,收到 DIFF 指令會(huì)接收新的提議。

1L?????????Followers

2X-----------------??????????L.lastZxid?←??L.lastZxid.epoch?+?1,?0?

3|<---------X--X--X????????FOLLOWERINFO(F.lastZxid)

4X--------->|->|->|????????NEWEPOCH(L.lastZxid)

5X--------->|->|->|????????SNAP,DIFF?or?TRUNC指令

6|<---------X--X--X????????if?TRUNC?notAccept?L.lastZxid?else(DIFF)?accept,commit?proposal?else(SNAP)?...

Phase 3:Broadcast Election(廣播階段若厚,Leader存在)

同上

Leader故障

如果是Leader故障拦英,首先進(jìn)行Phase 1:Fast Leader Election,然后Phase 2:Recovery Phase测秸,恢復(fù)階段保證了如下兩個(gè)問題疤估,這兩個(gè)問題同時(shí)也和Raft中的Leader故障解決的問題是一樣的,總之就是要保證Leader操作日志是最新的

已經(jīng)被處理的消息不能丟? ? ??

被丟棄的消息不能再次出現(xiàn)

總結(jié)

Zab和Raft都是強(qiáng)一致性協(xié)議霎冯,但是Zab和Raft的實(shí)質(zhì)是一樣的铃拇,都是mutli-paxos衍生出來的強(qiáng)一致性算法。簡單而言沈撞,他們的算法都都是先通過Leader選舉慷荔,選出一個(gè)Leader,然后Leader接受到客戶端的提議時(shí)缠俺,都是先寫入操作日志显晶,然后再與其他Followers同步日志,Leader再commit提議壹士,再與其他Followers同步提議磷雇。如果Leader故障,重新走一遍選舉流程墓卦,選取最新的操作日志倦春,然后同步日志,接著繼續(xù)接受客戶端請求等等落剪。過程都是一樣睁本,只不過兩個(gè)的實(shí)現(xiàn)方式不同,描述方式不同忠怖。實(shí)現(xiàn)Raft的核心是Term呢堰,Zab的核心是Zxid,反正Term和Zxid都是邏輯時(shí)鐘凡泣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枉疼,一起剝皮案震驚了整個(gè)濱河市皮假,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骂维,老刑警劉巖惹资,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異航闺,居然都是意外死亡褪测,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門潦刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮措,“玉大人,你說我怎么就攤上這事乖杠》衷” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵胧洒,是天一觀的道長畏吓。 經(jīng)常有香客問我,道長略荡,這世上最難降的妖魔是什么庵佣? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮汛兜,結(jié)果婚禮上巴粪,老公的妹妹穿的比我還像新娘。我一直安慰自己粥谬,他們只是感情好肛根,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漏策,像睡著了一般派哲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掺喻,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天芭届,我揣著相機(jī)與錄音,去河邊找鬼感耙。 笑死褂乍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的即硼。 我是一名探鬼主播逃片,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只酥!你這毒婦竟也來了褥实?” 一聲冷哼從身側(cè)響起呀狼,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎损离,沒想到半個(gè)月后哥艇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僻澎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年她奥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怎棱。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绷跑,靈堂內(nèi)的尸體忽然破棺而出拳恋,到底是詐尸還是另有隱情,我是刑警寧澤砸捏,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布谬运,位于F島的核電站,受9級特大地震影響垦藏,放射性物質(zhì)發(fā)生泄漏梆暖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一掂骏、第九天 我趴在偏房一處隱蔽的房頂上張望轰驳。 院中可真熱鬧,春花似錦弟灼、人聲如沸级解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤哗。三九已至,卻和暖如春掩驱,著一層夾襖步出監(jiān)牢的瞬間芒划,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工欧穴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民逼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓苔可,卻偏偏與公主長得像缴挖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子焚辅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 聲明:本文寫的時(shí)候映屋,當(dāng)時(shí)就是完全不懂zk苟鸯,邊看網(wǎng)上的文章邊學(xué)習(xí)歸納和整理,這不是我的產(chǎn)出棚点,不用點(diǎn)贊打賞早处。大家理智友...
    _Zy閱讀 76,029評論 38 129
  • 概述 ZAB (Zookeeper Atomic Broadcast)協(xié)議是為分布式協(xié)調(diào)服務(wù) ZooKeeper ...
    jiangmo閱讀 2,996評論 0 3
  • 概要: 1.前言 2.Atomic broadcast protocol 2.1.問題的提出 2.2.ZAB ...
    hedgehog1112閱讀 229評論 0 0
  • 1. 關(guān)于Zookeper ZooKeeper是一個(gè)集中服務(wù),用于維護(hù)配置信息瘫析,命名砌梆,提供分布式同步和提供組服務(wù)。...
    maskwang520閱讀 854評論 0 2
  • 幸好是個(gè)宅(歌) 幸好我只是個(gè)宅贬循,比較安全咸包。沒什么激情和無聊的幻想。 可以輕易快樂杖虾,并且理所當(dāng)然烂瘫。我每一天輕松的活...
    大美不仁閱讀 194評論 0 0