關(guān)于ZooKeeper,你想知道的都在這里


圖片來自網(wǎng)絡(luò)凯旋,如有侵權(quán)請聯(lián)系作者刪除

一.ZooKeeper是什么

Zookeeper 從設(shè)計模式角度來看,是一個基于觀察者模式設(shè)計的分布式服務(wù)管理框架,它負(fù)責(zé)存儲和管理大家都關(guān)心的數(shù)據(jù)至非,然后接受觀察者的注冊钠署,一旦這些數(shù)據(jù)的狀態(tài)發(fā)生變化,Zookeeper 就將負(fù)責(zé)通知已經(jīng)在 Zookeeper 上注冊的那些觀察者做出相應(yīng)的反應(yīng)荒椭。

二.ZooKeeper能解決什么

1.命名服務(wù)(Name service)

  • ZooKeeper提供類似JNDI服務(wù)谐鼎,都能夠幫助應(yīng)用系統(tǒng)通過一個資源引用的方式來實現(xiàn)對資源的定位與實用。
  • 利用ZooKeeper順序節(jié)點的特性趣惠,制作分布式的ID生成器狸棍。

2.配置管理

配置的管理在分布式應(yīng)用環(huán)境中很常見,例如同一個應(yīng)用系統(tǒng)需要多臺 PC Server 運行味悄,但是它們運行的應(yīng)用系統(tǒng)的某些配置項是相同的草戈,如果要修改這些相同的配置項,那么就必須同時修改每臺運行這個應(yīng)用系統(tǒng)的 PC Server侍瑟,這樣非常麻煩而且容易出錯唐片。

像這樣的配置信息完全可以交給 Zookeeper 來管理,將配置信息保存在 Zookeeper 的某個目錄節(jié)點中涨颜,然后將所有需要修改的應(yīng)用機器監(jiān)控配置信息的狀態(tài)费韭,一旦配置信息發(fā)生變化,每臺應(yīng)用機器就會收到 Zookeeper 的通知庭瑰,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中


圖片來自網(wǎng)絡(luò)揽思,如有侵權(quán)請聯(lián)系作者刪除
3.集群管理

Zookeeper 能夠很容易的實現(xiàn)集群管理的功能,如有多臺 Server 組成一個服務(wù)集群见擦,那么必須要一個“總管”知道當(dāng)前集群中每臺機器的服務(wù)狀態(tài),一旦有機器不能提供服務(wù)羹令,集群中其它機器必須知道鲤屡,從而做出調(diào)整重新分配服務(wù)策略。同樣當(dāng)增加集群的服務(wù)能力時福侈,就會增加一臺或多臺 Server酒来,同樣也必須讓“總管”知道。

Zookeeper 不僅能夠幫你維護(hù)當(dāng)前的集群中機器的服務(wù)狀態(tài)肪凛,而且能夠幫你選出一個“總管”堰汉,讓這個總管來管理集群,這就是 Zookeeper 的另一個功能 Leader Election伟墙。

它們的實現(xiàn)方式都是在 Zookeeper 上創(chuàng)建一個 EPHEMERAL 類型的目錄節(jié)點翘鸭,然后每個 Server 在它們創(chuàng)建目錄節(jié)點的父目錄節(jié)點上調(diào)用 getChildren(String path, boolean watch) 方法并設(shè)置 watch 為 true,由于是 EPHEMERAL 目錄節(jié)點戳葵,當(dāng)創(chuàng)建它的 Server 死去就乓,這個目錄節(jié)點也隨之被刪除,所以 Children 將會變化,這時 getChildren上的 Watch 將會被調(diào)用生蚁,所以其它 Server 就知道已經(jīng)有某臺 Server 死去了噩翠。新增 Server 也是同樣的原理。

Zookeeper 如何實現(xiàn) Leader Election邦投,也就是選出一個 Master Server伤锚。和前面的一樣每臺 Server 創(chuàng)建一個 EPHEMERAL 目錄節(jié)點,不同的是它還是一個 SEQUENTIAL 目錄節(jié)點志衣,所以它是個 EPHEMERAL_SEQUENTIAL 目錄節(jié)點屯援。之所以它是 EPHEMERAL_SEQUENTIAL 目錄節(jié)點,是因為我們可以給每臺 Server 編號蠢涝,我們可以選擇當(dāng)前是最小編號的 Server 為 Master玄呛,假如這個最小編號的 Server 死去,由于是 EPHEMERAL 節(jié)點和二,死去的 Server 對應(yīng)的節(jié)點也被刪除徘铝,所以當(dāng)前的節(jié)點列表中又出現(xiàn)一個最小編號的節(jié)點,我們就選擇這個節(jié)點為當(dāng)前 Master惯吕。這樣就實現(xiàn)了動態(tài)選擇 Master惕它,避免了傳統(tǒng)意義上單 Master 容易出現(xiàn)單點故障的問題

三.Zookeeper的數(shù)據(jù)模型

Zookeeper 會維護(hù)一個具有層次關(guān)系的數(shù)據(jù)結(jié)構(gòu),它非常類似于一個標(biāo)準(zhǔn)的文件系統(tǒng)


圖片來自于網(wǎng)絡(luò)废登,如有侵權(quán)請聯(lián)系作者刪除

每個節(jié)點在zookeeper中叫做znode,每個znode節(jié)點有唯一的路徑標(biāo)識淹魄,Znode節(jié)點分為:臨時節(jié)點和持久化節(jié)點

臨時節(jié)點的生命周期與創(chuàng)建該節(jié)點的客戶端的生命周期一致,一旦客戶端與zookeeper服務(wù)器失去聯(lián)系堡距,這個節(jié)點也將被刪除--臨時節(jié)點不能擁有子節(jié)點

持久化節(jié)點是指與客戶端狀態(tài)無關(guān)的節(jié)點的甲锡,除非客戶端主動發(fā)起刪除操作,否則就算客戶端與服務(wù)器失去聯(lián)系羽戒,該節(jié)點依然存在

znode 是有版本的缤沦,每個 znode 中存儲的數(shù)據(jù)可以有多個版本,也就是一個訪問路徑中可以存儲多份數(shù)據(jù)

znode 可以被監(jiān)控(可以設(shè)置Watcher)易稠,包括這個目錄節(jié)點中存儲的數(shù)據(jù)的修改缸废,子節(jié)點目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶端驶社,這個是 Zookeeper 的核心特性企量。

四.Leader選舉

Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在。當(dāng)Zookeeper集群中的一臺服務(wù)器出現(xiàn)以下兩種情況之一時亡电,需要進(jìn)入Leader選舉届巩。

(1) 服務(wù)器初始化啟動。

(2) 服務(wù)器運行期間無法和Leader保持連接

1.服務(wù)器啟動時的Leader選舉

若進(jìn)行Leader選舉份乒,則至少需要兩臺機器姆泻,這里選取3臺機器組成的服務(wù)器集群為例零酪。在集群初始化階段,當(dāng)有一臺服務(wù)器Server1啟動時拇勃,其單獨無法進(jìn)行和完成Leader選舉四苇,當(dāng)?shù)诙_服務(wù)器Server2啟動時,此時兩臺機器可以相互通信方咆,每臺機器都試圖找到Leader月腋,于是進(jìn)入Leader選舉過程。選舉過程如下

(1) 每個Server發(fā)出一個投票瓣赂。由于是初始情況榆骚,Server1和Server2都會將自己作為Leader服務(wù)器來進(jìn)行投票,每次投票會包含所推舉的服務(wù)器的myid和ZXID煌集,使用(myid, ZXID)來表示妓肢,此時Server1的投票為(1, 0),Server2的投票為(2, 0)苫纤,然后各自將這個投票發(fā)給集群中其他機器碉钠。

(2) 接受來自各個服務(wù)器的投票。集群的每個服務(wù)器收到投票后卷拘,首先判斷該投票的有效性喊废,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務(wù)器栗弟。

(3) 處理投票污筷。針對每一個投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK乍赫,PK規(guī)則如下

· 優(yōu)先檢查ZXID瓣蛀。ZXID比較大的服務(wù)器優(yōu)先作為Leader。

· 如果ZXID相同雷厂,那么就比較myid惋增。myid較大的服務(wù)器作為Leader服務(wù)器。

對于Server1而言罗侯,它的投票是(1, 0),接收Server2的投票為(2, 0)溪猿,首先會比較兩者的ZXID钩杰,均為0,再比較myid诊县,此時Server2的myid最大讲弄,于是更新自己的投票為(2, 0),然后重新投票依痊,對于Server2而言避除,其無須更新自己的投票怎披,只是再次向集群中所有機器發(fā)出上一次投票信息即可。

(4) 統(tǒng)計投票瓶摆。每次投票后凉逛,服務(wù)器都會統(tǒng)計投票信息,判斷是否已經(jīng)有過半機器接受到相同的投票信息群井,對于Server1状飞、Server2而言,都統(tǒng)計出集群中已經(jīng)有兩臺機器接受了(2, 0)的投票信息书斜,此時便認(rèn)為已經(jīng)選出了Leader诬辈。

(5) 改變服務(wù)器狀態(tài)。一旦確定了Leader荐吉,每個服務(wù)器就會更新自己的狀態(tài)焙糟,如果是Follower,那么就變更為FOLLOWING样屠,如果是Leader穿撮,就變更為LEADING。

2.服務(wù)器運行時的Leader選舉

在Zookeeper運行期間瞧哟,Leader與非Leader服務(wù)器各司其職混巧,即便當(dāng)有非Leader服務(wù)器宕機或新加入,此時也不會影響Leader勤揩,但是一旦Leader服務(wù)器掛了咧党,那么整個集群將暫停對外服務(wù),進(jìn)入新一輪Leader選舉陨亡,其過程和啟動時期的Leader選舉過程基本一致傍衡。假設(shè)正在運行的有Server1、Server2负蠕、Server3三臺服務(wù)器蛙埂,當(dāng)前Leader是Server2,若某一時刻Leader掛了遮糖,此時便開始Leader選舉绣的。選舉過程如下

(1) 變更狀態(tài)。Leader掛后欲账,余下的非Observer服務(wù)器都會講自己的服務(wù)器狀態(tài)變更為LOOKING屡江,然后開始進(jìn)入Leader選舉過程。

(2) 每個Server會發(fā)出一個投票赛不。在運行期間惩嘉,每個服務(wù)器上的ZXID可能不同,此時假定Server1的ZXID為123踢故,Server3的ZXID為122文黎;在第一輪投票中惹苗,Server1和Server3都會投自己,產(chǎn)生投票(1, 123)耸峭,(3, 122)桩蓉,然后各自將投票發(fā)送給集群中所有機器。

(3) 接收來自各個服務(wù)器的投票抓艳。與啟動時過程相同触机。

(4) 處理投票。與啟動時過程相同玷或,此時儡首,Server1將會成為Leader。

(5) 統(tǒng)計投票偏友。與啟動時過程相同蔬胯。

(6) 改變服務(wù)器的狀態(tài)。與啟動時過程相同

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末位他,一起剝皮案震驚了整個濱河市氛濒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹅髓,老刑警劉巖舞竿,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窿冯,居然都是意外死亡骗奖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門醒串,熙熙樓的掌柜王于貴愁眉苦臉地迎上來执桌,“玉大人,你說我怎么就攤上這事芜赌⊙稣酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵缠沈,是天一觀的道長膘壶。 經(jīng)常有香客問我,道長洲愤,這世上最難降的妖魔是什么颓芭? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮禽篱,結(jié)果婚禮上畜伐,老公的妹妹穿的比我還像新娘馍惹。我一直安慰自己躺率,他們只是感情好玛界,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悼吱,像睡著了一般慎框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上后添,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天笨枯,我揣著相機與錄音,去河邊找鬼遇西。 笑死馅精,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粱檀。 我是一名探鬼主播洲敢,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茄蚯!你這毒婦竟也來了压彭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渗常,失蹤者是張志新(化名)和其女友劉穎壮不,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皱碘,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡询一,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尸执。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片家凯。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖如失,靈堂內(nèi)的尸體忽然破棺而出绊诲,到底是詐尸還是另有隱情,我是刑警寧澤褪贵,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布掂之,位于F島的核電站,受9級特大地震影響脆丁,放射性物質(zhì)發(fā)生泄漏世舰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一槽卫、第九天 我趴在偏房一處隱蔽的房頂上張望跟压。 院中可真熱鬧,春花似錦歼培、人聲如沸震蒋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽查剖。三九已至钾虐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笋庄,已是汗流浹背效扫。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留直砂,地道東北人菌仁。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像静暂,于是被迫代替她去往敵國和親掘托。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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