直觀理解:Zookeeper分布式一致性協(xié)議ZAB

??ZAB是Zookeeper使用的分布式一致性協(xié)議,英文全稱是:Zookeeper Atomic Broadcast制恍,因此ZAB也稱之為Zookeeper原子廣播協(xié)議。在解決分布式一致性方面神凑,Zookeeper并沒有使用Paxos净神,而是采用了ZAB協(xié)議「任基于ZAB協(xié)議鹃唯,Zookeeper實現(xiàn)一種主備模式的系統(tǒng)架構(gòu)來保持集群中主備副本之間數(shù)據(jù)的一致性。ZAB協(xié)議包括兩種基本模式:消息廣播(Message Broadcasting)和崩潰恢復(fù)(Leader Activation)薛躬。下面來詳細(xì)介紹這兩種基本模式的實現(xiàn)過程俯渤。

消息廣播

??消息廣播是Zookeeper用來保證寫入事務(wù)一致性的方法,在Zookeeper集群中型宝,存在以下三種角色的節(jié)點:
Leader:Zookeeper集群的核心角色八匠,在集群啟動或崩潰恢復(fù)中通過Follower參與選舉產(chǎn)生,為客戶端提供讀寫服務(wù)趴酣,并對事務(wù)請求進(jìn)行處理梨树。
Follower:Zookeeper集群的核心角色,在集群啟動或崩潰恢復(fù)中參加選舉岖寞,沒有被選上就是這個角色抡四,為客戶端提供讀取服務(wù),也就是處理非事務(wù)請求仗谆,F(xiàn)ollower不能處理事務(wù)請求指巡,對于收到的事務(wù)請求會轉(zhuǎn)發(fā)給Leader。
Observer:觀察者角色隶垮,不參加選舉藻雪,為客戶端提供讀取服務(wù),處理非事務(wù)請求狸吞,對于收到的事務(wù)請求會轉(zhuǎn)發(fā)給Leader勉耀。使用Observer的目的是為了擴(kuò)展系統(tǒng),提高讀取性能蹋偏。
??下面通過幾張圖對ZAB的消息廣播過程進(jìn)行簡單的介紹便斥。

  1. Zookeeper各節(jié)點會接收來自客戶端的請求,如果是非事務(wù)請求威始,各節(jié)點自行進(jìn)行相應(yīng)的處理枢纠。若接收到的是客戶端的事務(wù)請求,如果當(dāng)前節(jié)點是Follower則將該請求轉(zhuǎn)發(fā)給當(dāng)前集群中的Leader節(jié)點進(jìn)行處理黎棠。
接收請求
  1. Leader接收到事務(wù)處理的請求后京郑,將向所有的Follower節(jié)點發(fā)出Proposal提議,并等待各Follower的Ack反饋葫掉。在廣播事務(wù)之前Leader服務(wù)器會先給這個事務(wù)分配一個全局單調(diào)遞增的唯一ID些举,也就是事務(wù)ID(zxid),每一個事務(wù)必須按照zxid的先后順序進(jìn)行處理俭厚。而且Leader服務(wù)器會為每一個Follower分配一個單獨(dú)的隊列户魏,然后將需要廣播的事務(wù)放到隊列中。
廣播Proposal
  1. 各Follower節(jié)點對Leader節(jié)點的Proposal進(jìn)行Ack反饋挪挤,Leader對接收到的Ack進(jìn)行統(tǒng)計叼丑,如果超多半數(shù)Follower進(jìn)行了Ack,此時進(jìn)行下一步操作扛门,否則之間向客戶端進(jìn)行事務(wù)請求失敗的Response鸠信。
ACK
  1. 如果Leader節(jié)點接收到了超過半數(shù)的Ack響應(yīng),此時Leader會向所有的Follower發(fā)出事務(wù)Commit的指令论寨,同時自己也執(zhí)行一次Commit星立,并向客戶端進(jìn)行事務(wù)請求成功的Response爽茴。
提交事務(wù)

??Zookeeper的消息廣播過程類似 2PC(Two Phase Commit),ZAB僅需要超過一半以上的Follower返回 Ack 信息就可以執(zhí)行提交绰垂,大大減小了同步阻塞室奏,提高了可用性。

崩潰恢復(fù)

??在Zookeeper集群啟動劲装、運(yùn)行過程中胧沫,如果Leader出現(xiàn)崩潰、網(wǎng)絡(luò)斷開占业、服務(wù)停止或重啟等異常情況绒怨,或集群中有新服務(wù)器加入時,ZAB會讓當(dāng)前集群快速進(jìn)入崩潰恢復(fù)模式并選舉出新的Leader節(jié)點谦疾,在此期間整個集群不對外提供任何讀取服務(wù)南蹂。當(dāng)產(chǎn)生了新的Leader后并集群中過半Follower完成了與Leader的狀態(tài)同步,那么ZAB協(xié)議就會讓Zookeeper集群從崩潰恢復(fù)模式轉(zhuǎn)換成消息廣播模式餐蔬。崩潰恢復(fù)的目的就是保證當(dāng)前Zookeeper集群快速選舉出一個新的Leader并完成與其他Follower的狀態(tài)同步碎紊,以便盡快進(jìn)入消息廣播模式對外提供服務(wù)。
??Zookeeper崩潰恢復(fù)的主要任務(wù)就是選舉Leader(Leader Election)樊诺,Leader選舉分兩個場景:一個是Zookeeper服務(wù)器啟動時Leader選舉仗考,另一個是Zookeeper集群運(yùn)行過程中Leader崩潰后的Leader選舉。在詳細(xì)介紹Leader選舉過程之前词爬,需要先介紹幾個參數(shù):

  • myid: 服務(wù)器ID秃嗜,這個是在安裝Zookeeper時配置的,myid越大顿膨,該服務(wù)器在選舉中被選為Leader的優(yōu)先級會越大锅锨。

  • zxid: 事務(wù)ID,這個是由Zookeeper集群中的Leader節(jié)點進(jìn)行Proposal時生成的全局唯一的事務(wù)ID恋沃,由于只有Leader才能進(jìn)行Proposal必搞,所以這個zxid很容易做到全局唯一且自增。因為Follower沒有生成zxid的權(quán)限囊咏。zxid越大恕洲,表示當(dāng)前節(jié)點上提交成功了最新的事務(wù),這也是為什么在崩潰恢復(fù)的時候梅割,需要優(yōu)先考慮zxid的原因霜第。

  • epoch: 投票輪次,每完成一次Leader選舉的投票户辞,當(dāng)前Leader節(jié)點的epoch會增加一次泌类。在沒有Leader時,本輪此的epoch會保持不變底燎。

另外在選舉的過程中刃榨,每個節(jié)點的當(dāng)前狀態(tài)會在以下幾種狀態(tài)之中進(jìn)行轉(zhuǎn)變弹砚。

  • LOOKING: 競選狀態(tài)。

  • FOLLOWING: 隨從狀態(tài)喇澡,同步Leader 狀態(tài)殊校,參與Leader選舉的投票過程。

  • OBSERVING: 觀察狀態(tài)呕屎,同步Leader 狀態(tài)敬察,不參與Leader選舉的投票過程。

  • LEADING: 領(lǐng)導(dǎo)者狀態(tài)蹂安。

集群啟動時的Leader選舉

??假設(shè)現(xiàn)在存在一個由5個Zookeeper服務(wù)器組成的集群Sever1锐帜,Sever2缴阎,Sever3,Sever4和Sever5述暂,集群的myid分別為:1畦韭, 2肛跌,3,4惋砂,5西饵。依次按照myid遞增的順序進(jìn)行啟動。由于剛啟動時zxid和epoch都為0期虾,因此Leader選舉的關(guān)鍵因素成了myid。

  1. 啟動Sever1喳坠,此時整個集群中只有Sever1啟動茂蚓,Sever1無法與其他任何服務(wù)建立通信壕鹉,立即進(jìn)入LOOKING狀態(tài),此時Server1給自己投1票(上來都覺得自己可以做Leader)聋涨,由于1不大于集群總數(shù)的一半晾浴,即2,此時Sever1保持LOOKING狀態(tài)牍白。
  2. 啟動Sever2脊凰,此時Sever2與Server1建立通信,Sever1和Sever2互相交換投票信息茂腥,Server1投票的myid為1狸涌,Server2投票的myid為2,此時選取myid最大的最岗,因此Sever1的投票會變成2,但是由于目前投票Server2的服務(wù)器數(shù)量為2臺仑性,小于集群總數(shù)的一半2惶楼,因此Sever1和Sever2繼續(xù)保持LOOKING狀態(tài)歼捐。
  3. 啟動Sever3,此時三臺服務(wù)器之間建立了通信豹储,Server3進(jìn)入LOOKING狀態(tài),并與前兩臺服務(wù)器交換投票信息淘这,Server1和Server2的投票信息為2剥扣,Server3投票自己,即myid為3铝穷,這個時候選擇myid最大的作為Leader晦炊。此時集群中投票3的服務(wù)器數(shù)量變成了3臺贤姆,此時3>2薄疚,Sever3立刻變成LEADING狀態(tài)音婶,Sever1和Sever2變成FOLLOWING狀態(tài)。
  4. 啟動Sever4,Sever4進(jìn)入LOOKING狀態(tài)并與前三臺服務(wù)器建立通信乃正,由于集群中已經(jīng)存在LEADING狀態(tài)的節(jié)點,因此,Sever4立刻變?yōu)镕OLLOWING狀態(tài)传睹,此時Sever3依舊處于LEADING狀態(tài)启上。
    5.動Sever5,Sever5與Sever4一樣,在與其他服務(wù)器建立通信后會立刻變?yōu)镕OLLOWING狀態(tài)系宜,此時Sever3依舊處于LEADING狀態(tài)照激。
    最終整個Zookeeper集群中,Server3成為Leader盹牧,Server1俩垃,Server2,Server4和Server5成為Follower汰寓,最終Server3的epoch加一口柳。
Leader崩潰時的Leader選舉

??在Zookeeper集群剛啟動的時候,zxid和epoch并不參與群首選舉有滑。但是如果Zookeeper集群在運(yùn)行了一段時間之后崩潰了跃闹,那么epoch和zxid在Leader選舉中的重要性將大于myid。重要性的排序為:epoch \small > zxid \small > myid毛好。當(dāng)某一個Follower與Leader失去通信的時候望艺,就會進(jìn)入Leader選舉,此時Follower會跟集群中的其他節(jié)點進(jìn)行通信肌访,但此時會存在兩種情況:

  1. Follower與Leader失去通信找默,但此時集群中的Follower并未崩潰,且與其他Follower保持正常通信吼驶。此時當(dāng)該Follower與其他Follower進(jìn)行通信時惩激,其他Follower會告訴他,老大還活著蟹演,這個時候风钻,F(xiàn)ollower僅需要與Leader建立通信即可。
  2. Leader真的崩潰了轨帜,此時集群中所有節(jié)點之間會進(jìn)行通信魄咕,當(dāng)?shù)弥洗髵炝酥螅總€節(jié)點都會開啟爭老大模式蚌父,各自會將當(dāng)前節(jié)點最新的epoch哮兰,zxid和myid發(fā)送出來,參與投票苟弛,此時各節(jié)點之間會參照epoch \small > zxid \small > myid進(jìn)行Leader選舉喝滞,最后投票數(shù)超過集群數(shù)量一般的節(jié)點會成為新的Leader。

??這種崩潰后的Leader選舉機(jī)制也很好理解膏秫,如果Leader掛了右遭,優(yōu)先選擇集群中最后做過(epoch)Leader的節(jié)點為新的Leader節(jié)點,其次選取有最新事務(wù)提交的節(jié)點(zxid)為Leader,最后才按默認(rèn)的最大機(jī)器編號(myid)進(jìn)行投票窘哈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吹榴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滚婉,更是在濱河造成了極大的恐慌图筹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件让腹,死亡現(xiàn)場離奇詭異远剩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)骇窍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瓜晤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腹纳,你說我怎么就攤上這事痢掠。” “怎么了只估?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵志群,是天一觀的道長。 經(jīng)常有香客問我蛔钙,道長,這世上最難降的妖魔是什么荠医? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任吁脱,我火速辦了婚禮,結(jié)果婚禮上彬向,老公的妹妹穿的比我還像新娘兼贡。我一直安慰自己,他們只是感情好娃胆,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布遍希。 她就那樣靜靜地躺著,像睡著了一般里烦。 火紅的嫁衣襯著肌膚如雪凿蒜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天胁黑,我揣著相機(jī)與錄音废封,去河邊找鬼。 笑死丧蘸,一個胖子當(dāng)著我的面吹牛漂洋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刽漂,長吁一口氣:“原來是場噩夢啊……” “哼演训!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贝咙,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仇祭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颈畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乌奇,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年眯娱,在試婚紗的時候發(fā)現(xiàn)自己被綠了礁苗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡徙缴,死狀恐怖试伙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情于样,我是刑警寧澤疏叨,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站穿剖,受9級特大地震影響蚤蔓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糊余,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一秀又、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贬芥,春花似錦吐辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至威沫,卻和暖如春贤惯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壹甥。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工救巷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句柠。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓浦译,卻偏偏與公主長得像棒假,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子精盅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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