面試官:說一下Zookeeper的ZAB協(xié)議?

文章來源于公眾號三太子敖丙 音诫,作者嚴浩

前言

Zab(Zookeeper Atomic Broadcast)是為ZooKeeper協(xié)設(shè)計的崩潰恢復(fù)原子廣播協(xié)議竣付,它保證zookeeper集群數(shù)據(jù)的一致性和命令的全局有序性。

概念介紹

在介紹zab協(xié)議之前首先要知道zookeeper相關(guān)的幾個概念,才能更好的了解zab協(xié)議忙菠。

  • 集群角色
  1. Leader:同一時間集群總只允許有一個Leader何鸡,提供對客戶端的讀寫功能,負責將數(shù)據(jù)同步至各個節(jié)點牛欢;
  2. Follower:提供對客戶端讀功能骡男,寫請求則轉(zhuǎn)發(fā)給Leader處理,當Leader崩潰失聯(lián)之后參與Leader選舉傍睹;
  3. Observer:與Follower不同的是但不參與Leader選舉隔盛。
  • 服務(wù)狀態(tài)
  1. LOOKING:當節(jié)點認為群集中沒有Leader,服務(wù)器會進入LOOKING狀態(tài)拾稳,目的是為了查找或者選舉Leader吮炕;
  2. FOLLOWING:follower角色;
  3. LEADING:leader角色访得;
  4. OBSERVING:observer角色龙亲;

可以知道Zookeeper是通過自身的狀態(tài)來區(qū)分自己所屬的角色,來執(zhí)行自己應(yīng)該的任務(wù)悍抑。

  • ZAB狀態(tài)Zookeeper還給ZAB定義的4中狀態(tài)鳄炉,反應(yīng)Zookeeper從選舉到對外提供服務(wù)的過程中的四個步驟。狀態(tài)枚舉定義:
public enum ZabState {
        ELECTION,
        DISCOVERY,
        SYNCHRONIZATION,
        BROADCAST
    }
  1. ELECTION: 集群進入選舉狀態(tài)搜骡,此過程會選出一個節(jié)點作為leader角色迎膜;
  2. DISCOVERY:連接上leader,響應(yīng)leader心跳浆兰,并且檢測leader的角色是否更改,通過此步驟之后選舉出的leader才能執(zhí)行真正職務(wù)珊豹;
  3. SYNCHRONIZATION:整個集群都確認leader之后簸呈,將會把leader的數(shù)據(jù)同步到各個節(jié)點,保證整個集群的數(shù)據(jù)一致性店茶;
  4. BROADCAST:過渡到廣播狀態(tài)蜕便,集群開始對外提供服務(wù)。
  • ZXID

Zxid是極為重要的概念贩幻,它是一個long型(64位)整數(shù)轿腺,分為兩部分:紀元(epoch)部分和計數(shù)器(counter)部分,是一個全局有序的數(shù)字丛楚。

epoch代表當前集群所屬的哪個leader族壳,leader的選舉就類似一個朝代的更替,你前朝的劍不能斬本朝的官趣些,用epoch代表當前命令的有效性仿荆,counter是一個遞增的數(shù)字。

選舉

基礎(chǔ)概念介紹完了,下面開始介紹zab協(xié)議是怎么支持leader選舉的拢操。

進行l(wèi)eader有三個問題锦亦,什么時候進行?選舉規(guī)則令境?選擇流程杠园?

下面我會一一解答這三個問題:

  1. 選舉發(fā)生的時機Leader發(fā)生選舉有兩個時機,一個是服務(wù)啟動的時候當整個集群都沒有l(wèi)eader節(jié)點會進入選舉狀態(tài)舔庶,如果leader已經(jīng)存在就會告訴該節(jié)點leader的信息抛蚁,自己連接上leader,整個集群不用進入選舉狀態(tài)栖茉。

    還有一個就是在服務(wù)運行中篮绿,可能會出現(xiàn)各種情況,服務(wù)宕機吕漂、斷電亲配、網(wǎng)絡(luò)延遲很高的時候leader都不能再對外提供服務(wù)了,所有當其他幾點通過心跳檢測到leader失聯(lián)之后惶凝,集群也會進入選舉狀態(tài)吼虎。

  2. 選舉規(guī)則進入投票選舉流程,怎么才能選舉出leader苍鲜?或者說按照什么規(guī)則來讓其他節(jié)點都能選舉你當leader思灰。

  3. zab協(xié)議是按照幾個比較規(guī)則來進行投票的篩選,如果你的票比我更好混滔,就修改自身的投票信息洒疚,改投你當leader。

    下面代碼是zookeeper投票比較規(guī)則:

        /*
         * We return true if one of the following three cases hold:
         * 1- New epoch is higher
         * 2- New epoch is the same as current epoch, but new zxid is higher
         * 3- New epoch is the same as current epoch, new zxid is the same
         *  as current zxid, but server id is higher.
         */

        return ((newEpoch > curEpoch)
                || ((newEpoch == curEpoch)
                    && ((newZxid > curZxid)
                        || ((newZxid == curZxid)
                            && (newId > curId)))));

當其他節(jié)點的紀元比自身高投它坯屿,如果紀元相同比較自身的zxid的大小油湖,選舉zxid大的節(jié)點,這里的zxid代表節(jié)點所提交事務(wù)最大的id领跛,zxid越大代表該節(jié)點的數(shù)據(jù)越完整乏德。

最后如果epoch和zxid都相等,則比較服務(wù)的serverId吠昭,這個Id是配置zookeeper集群所配置的喊括,所以我們配置zookeeper集群的時候可以把服務(wù)性能更高的集群的serverId配置大些,讓性能好的機器擔任leader角色矢棚。

  1. 選舉流程

時機和規(guī)則都有了郑什,下面就是leader的選舉流程:
image
  • 所有節(jié)點第一票先選舉自己當leader,將投票信息廣播出去蒲肋;
  • 從隊列中接受投票信息蹦误;
  • 按照規(guī)則判斷是否需要更改投票信息劫拢,將更改后的投票信息再次廣播出去;
  • 判斷是否有超過一半的投票選舉同一個節(jié)點强胰,如果是選舉結(jié)束根據(jù)投票結(jié)果設(shè)置自己的服務(wù)狀態(tài)舱沧,選舉結(jié)束,否則繼續(xù)進入投票流程偶洋。
  1. 舉例
    image

上圖來自《ZooKeeper:分布式過程協(xié)同技術(shù)詳解》熟吏,整體流程還是比較簡單,這里就不具體分析了玄窝。

廣播

集群在經(jīng)過leader選舉之后還會有連接leader和同步兩個步驟牵寺,這里就不具體分析這兩個步驟的流程了,主要介紹集群對外提供服務(wù)如何保證各個節(jié)點數(shù)據(jù)的一致性恩脂。

zab在廣播狀態(tài)中保證以下特征

  • 可靠傳遞: 如果消息m由一臺服務(wù)器傳遞帽氓,那么它最終將由所有服務(wù)器傳遞。
  • 全局有序: 如果一個消息a在消息b之前被一臺服務(wù)器交付俩块,那么所有服務(wù)器都交付了a和b黎休,并且a先于b。
  • 因果有序: 如果消息a在因果上先于消息b并且二者都被交付玉凯,那么a必須排在b之前势腮。

有序性是zab協(xié)議必須要保證的一個很重要的屬性,因為zookeeper是以類似目錄結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)的漫仆,必須要求命名的有序性捎拯。

比如一個命名a創(chuàng)建路徑為/test,然后命名b創(chuàng)建路徑為/test/123盲厌,如果不能保證有序性b命名在a之前署照,b命令會因為父節(jié)點不存在而創(chuàng)建失敗。
image

如上圖所示吗浩,整個寫請求類似一個二階段的提交建芙。

當收到客戶端的寫請求的時候會經(jīng)歷以下幾個步驟:

  1. Leader收到客戶端的寫請求,生成一個事務(wù)(Proposal)拓萌,其中包含了zxid;
  2. Leader開始廣播該事務(wù)升略,需要注意的是所有節(jié)點的通訊都是由一個FIFO的隊列維護的微王;
  3. Follower接受到事務(wù)之后,將事務(wù)寫入本地磁盤品嚣,寫入成功之后返回Leader一個ACK炕倘;
  4. Leader收到過半的ACK之后,開始提交本事務(wù)翰撑,并廣播事務(wù)提交信息
  5. 從節(jié)點開始提交本事務(wù)罩旋。

有以上流程可知啊央,zookeeper通過二階段提交來保證集群中數(shù)據(jù)的一致性,因為只需要收到過半的ACK就可以提交事務(wù)涨醋,所以zookeeper的數(shù)據(jù)并不是強一致性瓜饥。

zab協(xié)議的有序性保證是通過幾個方面來體現(xiàn)的,第一是浴骂,服務(wù)之前用TCP協(xié)議進行通訊乓土,保證在網(wǎng)絡(luò)傳輸中的有序性;第二溯警,節(jié)點之前都維護了一個FIFO的隊列趣苏,保證全局有序性;第三梯轻,通過全局遞增的zxid保證因果有序性食磕。

狀態(tài)流轉(zhuǎn)

前面介紹了zookeeper服務(wù)狀態(tài)有四種,ZAB狀態(tài)也有四種喳挑。這里就簡單介紹一個他們之間的狀態(tài)流轉(zhuǎn)彬伦,更能加深對zab協(xié)議在zookeeper工作流程中的作用。
image
  1. 服務(wù)在啟動或者和leader失聯(lián)之后服務(wù)狀態(tài)轉(zhuǎn)為LOOKING蟀悦;
  2. 如果leader不存在選舉leader媚朦,如果存在直接連接leader,此時zab協(xié)議狀態(tài)為ELECTION日戈;
  3. 如果有超過半數(shù)的投票選擇同一臺server询张,則leader選舉結(jié)束,被選舉為leader的server服務(wù)狀態(tài)為LEADING浙炼,其他server服務(wù)狀態(tài)為FOLLOWING/OBSERVING份氧;
  4. 所有server連接上leader,此時zab協(xié)議狀態(tài)為DISCOVERY弯屈;
  5. leader同步數(shù)據(jù)給learner蜗帜,使各個從節(jié)點數(shù)據(jù)和leader保持一致,此時zab協(xié)議狀態(tài)為SYNCHRONIZATION资厉;
  6. 同步超過一半的server之后厅缺,集群對外提供服務(wù),此時zab狀態(tài)為BROADCAST宴偿。

可以知道整個zookeeper服務(wù)的工作流程類似一個狀態(tài)機的轉(zhuǎn)換湘捎,而zab協(xié)議就是驅(qū)動服務(wù)狀態(tài)流轉(zhuǎn)的關(guān)鍵,理解了zab就理解了zookeeper工作的關(guān)鍵原理

總結(jié)

本文對zab協(xié)議在zookeeper的工作流程中做了簡單的介紹窄刘,希望對大家理解學習zookeeper有所幫助窥妇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娩践,隨后出現(xiàn)的幾起案子活翩,更是在濱河造成了極大的恐慌烹骨,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件材泄,死亡現(xiàn)場離奇詭異沮焕,居然都是意外死亡,警方通過查閱死者的電腦和手機脸爱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門遇汞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人簿废,你說我怎么就攤上這事空入。” “怎么了族檬?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵歪赢,是天一觀的道長。 經(jīng)常有香客問我单料,道長埋凯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任扫尖,我火速辦了婚禮白对,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘换怖。我一直安慰自己甩恼,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布沉颂。 她就那樣靜靜地躺著条摸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铸屉。 梳的紋絲不亂的頭發(fā)上钉蒲,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音彻坛,去河邊找鬼顷啼。 笑死,一個胖子當著我的面吹牛昌屉,可吹牛的內(nèi)容都是我干的钙蒙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼怠益,長吁一口氣:“原來是場噩夢啊……” “哼仪搔!你這毒婦竟也來了瘾婿?” 一聲冷哼從身側(cè)響起蜻牢,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烤咧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抢呆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮嫌,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年抱虐,在試婚紗的時候發(fā)現(xiàn)自己被綠了昌阿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡恳邀,死狀恐怖懦冰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谣沸,我是刑警寧澤刷钢,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站乳附,受9級特大地震影響内地,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋除,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一阱缓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧举农,春花似錦荆针、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滚停,卻和暖如春沃粗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背键畴。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工最盅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人起惕。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓涡贱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惹想。 傳聞我的和親對象是個殘疾皇子问词,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355