Zookeeper從入門到精通(一)

Zookeeper 概念

Zookeeper 是一個分布式協(xié)調(diào)服務(wù)尺栖,可用于服務(wù)發(fā)現(xiàn)延赌,分布式鎖,分布式領(lǐng)導(dǎo)選舉痴颊,配置管理等屡贺。
Zookeeper 提供了一個類似于 Linux 文件系統(tǒng)的樹形結(jié)構(gòu)(可認(rèn)為是輕量級的內(nèi)存文件系統(tǒng)甩栈,但
只適合存少量信息,完全不適合存儲大量文件或者大文件)玉转,同時提供了對于每個節(jié)點(diǎn)的監(jiān)控與
通知機(jī)制殴蹄。

Zookeeper 角色

Zookeeper 集群是一個基于主從復(fù)制的高可用集群袭灯,每個服務(wù)器承擔(dān)如下三種角色中的一種

Leader

  1. 一個 Zookeeper 集群同一時間只會有一個實(shí)際工作的 Leader稽荧,它會發(fā)起并維護(hù)與各 Follwer
    及 Observer 間的心跳。
  2. 所有的寫操作必須要通過 Leader 完成再由 Leader 將寫操作廣播給其它服務(wù)器畅卓。只要有超過
    半數(shù)節(jié)點(diǎn)(不包括 observeer 節(jié)點(diǎn))寫入成功翁潘,該寫請求就會被提交(類 2PC 協(xié)議)唐础。

Follower

  1. 一個 Zookeeper 集群可能同時存在多個 Follower一膨,它會響應(yīng) Leader 的心跳,
  2. Follower 可直接處理并返回客戶端的讀請求豹绪,同時會將寫請求轉(zhuǎn)發(fā)給 Leader 處理瞒津,
  3. 并且負(fù)責(zé)在 Leader 處理寫請求時對請求進(jìn)行投票。

Observer

    角色與 Follower 類似病毡,但是無投票權(quán)啦膜。Zookeeper 需保證高可用和強(qiáng)一致性淌喻,為了支持更多的客

戶端,需要增加更多 Server八拱;Server 增多肌稻,投票階段延遲增大匕荸,影響性能每聪;引入 Observer药薯,
Observer 不參與投票救斑; Observers 接受客戶端的連接脸候,并將寫請求轉(zhuǎn)發(fā)給 leader 節(jié)點(diǎn)运沦; 加入更
多 Observer 節(jié)點(diǎn),提高伸縮性嫁盲,同時不影響吞吐率羞秤。

圖片

ZAB 協(xié)議

事務(wù)編號 Zxid(事務(wù)請求計數(shù)器+ epoch)

在 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息廣播協(xié)議) 協(xié)議的事務(wù)編號 Zxid
設(shè)計中瘾蛋,Zxid 是一個 64 位的數(shù)字哺哼,其中低 32 位是一個簡單的單調(diào)遞增的計數(shù)器幸斥,針對客戶端每
一個事務(wù)請求甲葬,計數(shù)器加 1;而高 32 位則代表 Leader 周期 epoch 的編號坡垫,每個當(dāng)選產(chǎn)生一個新
的 Leader 服務(wù)器画侣,就會從這個 Leader 服務(wù)器上取出其本地日志中最大事務(wù)的 ZXID溉卓,并從中讀取
epoch 值搬泥,然后加 1,以此作為新的 epoch尉尾,并將低 32 位從 0 開始計數(shù)沙咏。
Zxid(Transaction id)類似于 RDBMS 中的事務(wù) ID肢藐,用于標(biāo)識一次更新操作的 Proposal(提議)
ID窖壕。為了保證順序性瞻讽,該 zkid 必須單調(diào)遞增。

epoch

epoch:可以理解為當(dāng)前集群所處的年代或者周期晌砾,每個 leader 就像皇帝养匈,都有自己的年號呕乎,所
以每次改朝換代猬仁,leader 變更之后先誉,都會在前一個年代的基礎(chǔ)上加 1。這樣就算舊的 leader 崩潰
恢復(fù)之后诈闺,也沒有人聽他的了,因為 follower 只聽從當(dāng)前年代的 leader 的命令刃滓。

Zab 協(xié)議有兩種模式-恢復(fù)模式(選主)、廣播模式(同步)

Zab 協(xié)議有兩種模式注盈,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)
者崩潰后叙赚,Zab 就進(jìn)入了恢復(fù)模式老客,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù) Server 完成了和 leader 的狀
態(tài)同步以后震叮,恢復(fù)模式就結(jié)束了胧砰。狀態(tài)同步保證了 leader 和 Server 具有相同的系統(tǒng)狀態(tài)。

ZAB 協(xié)議 4 階段

  • ** Leader election(選舉階段-選出準(zhǔn) Leader)**

    Leader election(選舉階段):節(jié)點(diǎn)在一開始都處于選舉階段苇瓣,只要有一個節(jié)點(diǎn)得到超半數(shù)
    節(jié)點(diǎn)的票數(shù)尉间,它就可以當(dāng)選準(zhǔn) leader。只有到達(dá) 廣播階段(broadcast) 準(zhǔn) leader 才會成
    為真正的 leader。這一階段的目的是就是為了選出一個準(zhǔn) leader哲嘲,然后進(jìn)入下一個階段贪薪。

  • ** Discovery(發(fā)現(xiàn)階段-接受提議、生成 epoch霍弹、接受 epoch)**

Discovery(發(fā)現(xiàn)階段):在這個階段台丛,followers 跟準(zhǔn) leader 進(jìn)行通信,同步 followers
最近接收的事務(wù)提議。這個一階段的主要目的是發(fā)現(xiàn)當(dāng)前大多數(shù)節(jié)點(diǎn)接收的最新提議荣德,并且
準(zhǔn) leader 生成新的 epoch署咽,讓 followers 接受,更新它們的 accepted Epoch。
一個 follower 只會連接一個 leader蓉媳,如果有一個節(jié)點(diǎn) f 認(rèn)為另一個 follower p 是 leader狠角,f
在嘗試連接 p 時會被拒絕,f 被拒絕之后晓勇,就會進(jìn)入重新選舉階段。

  • ** Synchronization(同步階段-同步 follower 副本)**

Synchronization(同步階段):同步階段主要是利用 leader 前一階段獲得的最新提議歷史铝噩,
同步集群中所有的副本年叮。只有當(dāng) 大多數(shù)節(jié)點(diǎn)都同步完成,準(zhǔn) leader 才會成為真正的 leader。
follower 只會接收 zxid 比自己的 lastZxid 大的提議裹粤。

  • ** Broadcast(廣播階段-leader 消息廣播)**

Broadcast(廣播階段):到了這個階段,Zookeeper 集群才能正式對外提供事務(wù)服務(wù),
并且 leader 可以進(jìn)行消息廣播序芦。同時如果有新的節(jié)點(diǎn)加入,還需要對新節(jié)點(diǎn)進(jìn)行同步。
ZAB 提交事務(wù)并不像 2PC 一樣需要全部 follower 都 ACK,只需要得到超過半數(shù)的節(jié)點(diǎn)的 ACK 就
可以了。

  • ** ZAB 協(xié)議 JAVA 實(shí)現(xiàn)(FLE-發(fā)現(xiàn)階段和同步合并為 Recovery Phase(恢復(fù)階段)**

協(xié)議的 Java 版本實(shí)現(xiàn)跟上面的定義有些不同,選舉階段使用的是 Fast Leader Election(FLE)柑司,
它包含了 選舉的發(fā)現(xiàn)職責(zé)隅津。因為 FLE 會選舉擁有最新提議歷史的節(jié)點(diǎn)作為 leader,這樣就省去了
發(fā)現(xiàn)最新提議的步驟。實(shí)際的實(shí)現(xiàn)將 發(fā)現(xiàn)階段 和 同步合并為 Recovery Phase(恢復(fù)階段)确买。所
以搀缠,ZAB 的實(shí)現(xiàn)只有三個階段:Fast Leader Election;Recovery Phase;Broadcast Phase璧眠。

投票機(jī)制

每個 sever 首先給自己投票,然后用自己的選票和其他 sever 選票對比灾螃,權(quán)重大的勝出靴拱,使用權(quán)
重較大的更新自身選票箱初家。具體選舉過程如下:

  1. 每個 Server 啟動以后都詢問其它的 Server 它要投票給誰掖肋。對于其他 server 的詢問紊浩,
    server 每次根據(jù)自己的狀態(tài)都回復(fù)自己推薦的 leader 的 id 和上一次處理事務(wù)的 zxid(系
    統(tǒng)啟動時每個 server 都會推薦自己)

  2. 收到所有 Server 回復(fù)以后,就計算出 zxid 最大的哪個 Server聋庵,并將這個 Server 相關(guān)信
    息設(shè)置成下一次要投票的 Server膘融。

  1. 計算這過程中獲得票數(shù)最多的的 sever 為獲勝者,如果獲勝者的票數(shù)超過半數(shù)祭玉,則改
    server 被選為 leader氧映。否則,繼續(xù)這個過程脱货,直到 leader 被選舉出來

  2. leader 就會開始等待 server 連接

  3. Follower 連接 leader岛都,將最大的 zxid 發(fā)送給 leader

  4. Leader 根據(jù) follower 的 zxid 確定同步點(diǎn)律姨,至此選舉階段完成。

  5. 選舉階段完成 Leader 同步后通知 follower 已經(jīng)成為 uptodate 狀態(tài)

  6. Follower 收到 uptodate 消息后臼疫,又可以重新接受 client 的請求進(jìn)行服務(wù)了

投票過程舉例:目前有 5 臺服務(wù)器择份,每臺服務(wù)器均沒有數(shù)據(jù),它們的編號分別是 1,2,3,4,5,按編號依次啟動烫堤,它們
的選擇舉過程如下荣赶。

  1. 服務(wù)器 1 啟動,給自己投票鸽斟,然后發(fā)投票信息拔创,由于其它機(jī)器還沒有啟動所以它收不到反
    饋信息,服務(wù)器 1 的狀態(tài)一直屬于 Looking富蓄。

  2. 服務(wù)器 2 啟動剩燥,給自己投票,同時與之前啟動的服務(wù)器 1 交換結(jié)果立倍,由于服務(wù)器 2 的編號
    大所以服務(wù)器 2 勝出灭红,但此時投票數(shù)沒有大于半數(shù),所以兩個服務(wù)器的狀態(tài)依然是
    LOOKING口注。

  3. 服務(wù)器 3 啟動比伏,給自己投票,同時與之前啟動的服務(wù)器 1,2 交換信息疆导,由于服務(wù)器 3 的編
    號最大所以服務(wù)器 3 勝出赁项,此時投票數(shù)正好大于半數(shù),所以服務(wù)器 3 成為領(lǐng)導(dǎo)者澈段,服務(wù)器
    1,2 成為小弟悠菜。

  4. 服務(wù)器 4 啟動,給自己投票败富,同時與之前啟動的服務(wù)器 1,2,3 交換信息悔醋,盡管服務(wù)器 4 的
    編號大,但之前服務(wù)器 3 已經(jīng)勝出兽叮,所以服務(wù)器 4 只能成為小弟芬骄。

  5. 服務(wù)器 5 啟動,后面的邏輯同服務(wù)器 4 成為小弟鹦聪。

小結(jié)

本篇幅账阻,我們一起熟悉了zookeeper的基本概念,以及它的一些基本角色泽本,以及ZAB協(xié)議和投票機(jī)制淘太,后續(xù)我們再來討論一下Zookeeper相關(guān)的工作原理和Znode。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒲牧,一起剝皮案震驚了整個濱河市撇贺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冰抢,老刑警劉巖松嘶,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挎扰,居然都是意外死亡喘蟆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門鼓鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人港谊,你說我怎么就攤上這事骇吭。” “怎么了歧寺?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵燥狰,是天一觀的道長。 經(jīng)常有香客問我斜筐,道長龙致,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任顷链,我火速辦了婚禮目代,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗤练。我一直安慰自己榛了,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布煞抬。 她就那樣靜靜地躺著霜大,像睡著了一般。 火紅的嫁衣襯著肌膚如雪革答。 梳的紋絲不亂的頭發(fā)上战坤,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音残拐,去河邊找鬼途茫。 笑死,一個胖子當(dāng)著我的面吹牛溪食,可吹牛的內(nèi)容都是我干的慈省。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼边败!你這毒婦竟也來了袱衷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笑窜,失蹤者是張志新(化名)和其女友劉穎致燥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排截,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌蚤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了断傲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱吱。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖认罩,靈堂內(nèi)的尸體忽然破棺而出箱蝠,到底是詐尸還是另有隱情,我是刑警寧澤垦垂,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布宦搬,位于F島的核電站,受9級特大地震影響劫拗,放射性物質(zhì)發(fā)生泄漏间校。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一页慷、第九天 我趴在偏房一處隱蔽的房頂上張望憔足。 院中可真熱鬧,春花似錦酒繁、人聲如沸四瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找蜜。三九已至,卻和暖如春稳析,著一層夾襖步出監(jiān)牢的瞬間洗做,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工彰居, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诚纸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓陈惰,卻偏偏與公主長得像畦徘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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

  • 夜鶯2517閱讀 127,720評論 1 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月井辆,有人笑有人哭关筒,有人歡樂有人憂愁,有人驚喜有人失落杯缺,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,603評論 2 9
  • 信任包括信任自己和信任他人 很多時候蒸播,很多事情,失敗萍肆、遺憾袍榆、錯過,源于不自信塘揣,不信任他人 覺得自己做不成包雀,別人做不...
    吳氵晃閱讀 6,189評論 4 8