ZooKeeper 的功能和原理初探


在公司核心系統(tǒng)的開發(fā)過程中用到了ZooKeeper钙勃,簡稱zk祖秒,用于搭建分布式核心環(huán)境痕囱,開發(fā)過程中也經(jīng)常會遇到zk出現(xiàn)的問題田轧,看了幾篇博客了解和總結(jié)一下zk的基本原理。

一鞍恢、Zookeeper簡介

ZooKeeper 是一個開源的分布式協(xié)調(diào)服務(wù)傻粘,由雅虎創(chuàng)建每窖,是 Google Chubby 的開源實現(xiàn)。分布式應(yīng)用程序可以基于 ZooKeeper 實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱弦悉、負載均衡窒典、命名服務(wù)、分布式協(xié)調(diào)/通知稽莉、集群管理瀑志、Master 選舉、配置維護污秆,名字服務(wù)劈猪、分布式同步、分布式鎖和分布式隊列等功能良拼。

二战得、基本概念

ZooKeeper?主要有幾個重要的概念,簡單總結(jié)下:

1.集群角色

ZooKeeper?中主要有三種角色:Leader庸推、Follower常侦、Observer

一個 ZooKeeper 集群同一時刻只會有一個 Leader,其他都是 Follower 或 Observer贬媒。

什么是集群聋亡?

PS:引用一個有趣的例子

小飯店原來只有一個廚師,切菜洗菜備料炒菜全干掖蛤。后來客人多了杀捻,廚房一個廚師忙不過來,又請了個廚師蚓庭,兩個廚師都能炒一樣的菜,這兩個廚師的關(guān)系是集群仅仆。為了讓廚師專心炒菜器赞,把菜做到極致,又請了個配菜師負責(zé)切菜墓拜,備菜港柜,備料,廚師和配菜師的關(guān)系是分布式咳榜,一個配菜師也忙不過來了夏醉,又請了個配菜師,兩個配菜師關(guān)系是集群

官方解釋:

分布式:不同的業(yè)務(wù)模塊部署在不同的服務(wù)器上或者同一個業(yè)務(wù)模塊分拆多個子業(yè)務(wù)涌韩,部署在不同的服務(wù)器上畔柔,解決高并發(fā)的問題

集群:同一個業(yè)務(wù)部署在多臺機器上,提高系統(tǒng)可用性


2.Zookeeper節(jié)點讀寫服務(wù)分工

ZooKeeper 集群的所有機器通過一個 Leader 選舉過程來選定一臺被稱為『Leader』的機器臣樱,Leader服務(wù)器為客戶端提供讀和寫服務(wù)靶擦。

Follower 和 Observer 都能提供讀服務(wù)腮考,不能提供寫服務(wù)。兩者唯一的區(qū)別在于玄捕,Observer機器不參與 Leader 選舉過程踩蔚,也不參與寫操作的『過半寫成功』策略,因此 Observer 可以在不影響寫性能的情況下提升集群的讀性能枚粘。

每個子目錄項如 NameService 都被稱作為znode馅闽,和文件系統(tǒng)一樣,我們能夠自由的增加馍迄、刪除znode捞蛋,在一個znode下增加、刪除子znode柬姚,唯一的不同在于znode是可以存儲數(shù)據(jù)的拟杉。?

Zookeeper選主流程(basic paxos)

當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時候zk進入恢復(fù)模式量承,恢復(fù)模式需要重新選舉出一個新的leader搬设,讓所有的Server都恢復(fù)到一個正確的狀態(tài)。Zk的選舉算法有兩種:一種是基于basic paxos實現(xiàn)的撕捍,另外一種是基于fast paxos算法實現(xiàn)的拿穴。系統(tǒng)默認的選舉算法為fast paxos。

1.選舉線程由當(dāng)前Server發(fā)起選舉的線程擔(dān)任忧风,其主要功能是對投票結(jié)果進行統(tǒng)計默色,并選出推薦的Server;

2.選舉線程首先向所有Server發(fā)起一次詢問(包括自己)狮腿;

3.選舉線程收到回復(fù)后腿宰,驗證是否是自己發(fā)起的詢問(驗證zxid是否一致),然后獲取對方的id(myid)缘厢,并存儲到當(dāng)前詢問對象列表中吃度,最后獲取對方提議的leader相關(guān)信息(id,zxid),并將這些信息存儲到當(dāng)次選舉的投票記錄表中贴硫;

4.收到所有Server回復(fù)以后椿每,就計算出zxid最大的那個Server,并將這個Server相關(guān)信息設(shè)置成下一次要投票的Server英遭;

5.線程將當(dāng)前zxid最大的Server設(shè)置為當(dāng)前Server要推薦的Leader间护,如果此時獲勝的Server獲得n/2 + 1的Server票數(shù),設(shè)置當(dāng)前推薦的leader為獲勝的Server挖诸,將根據(jù)獲勝的Server相關(guān)信息設(shè)置自己的狀態(tài)汁尺,否則,繼續(xù)這個過程税灌,直到leader被選舉出來均函。 通過流程分析我們可以得出:要使Leader獲得多數(shù)Server的支持亿虽,則Server總數(shù)必須是奇數(shù)2n+1,且存活的Server的數(shù)目不得少于n+1. 每個Server啟動后都會重復(fù)以上流程苞也。在恢復(fù)模式下洛勉,如果是剛從崩潰狀態(tài)恢復(fù)的或者剛啟動的server還會從磁盤快照中恢復(fù)數(shù)據(jù)和會話信息,zk會記錄事務(wù)日志并定期進行快照如迟,方便在恢復(fù)時進行狀態(tài)恢復(fù)收毫。

3.Session 客戶端會話

Session 是指客戶端會話。在ZooKeeper 中殷勘,一個客戶端連接是指客戶端和 ZooKeeper 服務(wù)器之間的TCP長連接此再。

ZooKeeper 對外的服務(wù)端口默認是2181,客戶端啟動時玲销,首先會與服務(wù)器建立一個TCP連接输拇,從第一次連接建立開始,客戶端會話的生命周期也開始了贤斜,通過這個連接策吠,客戶端能夠通過心跳檢測和服務(wù)器保持有效的會話,也能夠向 ZooKeeper 服務(wù)器發(fā)送請求并接受響應(yīng)瘩绒,同時還能通過該連接接收來自服務(wù)器的 Watch 事件通知猴抹。

Session 的 SessionTimeout 值用來設(shè)置一個客戶端會話的超時時間。當(dāng)由于服務(wù)器壓力太大锁荔、網(wǎng)絡(luò)故障或是客戶端主動斷開連接等各種原因?qū)е驴蛻舳诉B接斷開時蟀给,只要在SessionTimeout 規(guī)定的時間內(nèi)能夠重新連接上集群中任意一臺服務(wù)器,那么之前創(chuàng)建的會話仍然有效阳堕。

4.?數(shù)據(jù)節(jié)點

zookeeper的結(jié)構(gòu)其實就是一個樹形結(jié)構(gòu)跋理,leader就相當(dāng)于其中的根結(jié)點,其它節(jié)點就相當(dāng)于follow節(jié)點嘱丢,每個節(jié)點都保留自己的內(nèi)容薪介。

zookeeper的節(jié)點分兩類:持久節(jié)點臨時節(jié)點

持久節(jié)點:所謂持久節(jié)點是指一旦這個 樹形結(jié)構(gòu)上被創(chuàng)建了,除非主動進行對樹節(jié)點的移除操作越驻,否則這個 節(jié)點將一直保存在 ZooKeeper 上。

臨時節(jié)點:臨時節(jié)點的生命周期跟客戶端會話綁定道偷,一旦客戶端會話失效缀旁,那么這個客戶端創(chuàng)建的所有臨時節(jié)點都會被移除。

有四種類型的znode:?

1勺鸦、PERSISTENT-持久化目錄節(jié)點?

客戶端與zookeeper斷開連接后并巍,該節(jié)點依舊存在?

2、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點?

客戶端與zookeeper斷開連接后换途,該節(jié)點依舊存在懊渡,只是Zookeeper給該節(jié)點名稱進行順序編號?

3刽射、EPHEMERAL-臨時目錄節(jié)點?

客戶端與zookeeper斷開連接后,該節(jié)點被刪除?

4剃执、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點?

客戶端與zookeeper斷開連接后誓禁,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進行順序編號?

源碼

5.?狀態(tài)信息

每個 節(jié)點除了存儲數(shù)據(jù)內(nèi)容之外肾档,還存儲了 節(jié)點本身的一些狀態(tài)信息摹恰。用 get 命令可以同時獲得某個 節(jié)點的內(nèi)容和狀態(tài)信息

在 ZooKeeper 中,version 屬性是用來實現(xiàn)樂觀鎖機制中的『寫入校驗』的(保證分布式數(shù)據(jù)原子性操作)怒见。

6.事物操作

Zookeeper 的核心是原子廣播俗慈,這個機制保證了各個Server之間的同步。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議遣耍。Zab協(xié)議有兩種模式闺阱,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后舵变,Zab就進入了恢復(fù)模式酣溃,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和 leader的狀態(tài)同步以后棋傍,恢復(fù)模式就結(jié)束了救拉。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。

在ZooKeeper中瘫拣,能改變ZooKeeper服務(wù)器狀態(tài)的操作稱為事務(wù)操作亿絮。一般包括數(shù)據(jù)節(jié)點創(chuàng)建與刪除、數(shù)據(jù)內(nèi)容更新和客戶端會話創(chuàng)建與失效等操作麸拄。對應(yīng)每一個事務(wù)請求派昧,為了保證事務(wù)的順序一致性,ZooKeeper都會為其分配一個全局唯一的事務(wù)ID拢切,用 ZXID 表示蒂萎,通常是一個64位的數(shù)字。每一個 ZXID對應(yīng)一次更新操作淮椰,從這些 ZXID 中可以間接地識別出 ZooKeeper 處理這些事務(wù)操作請求的全局順序五慈。

7.Watcher(事件監(jiān)聽器)

ZooKeeper允許用戶在指定節(jié)點上注冊一些 Watcher,并且在一些特定事件觸發(fā)的時候主穗,ZooKeeper 服務(wù)端會將事件通知到感興趣的客戶端上去泻拦。該機制是 ZooKeeper 實現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忽媒,一起剝皮案震驚了整個濱河市争拐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晦雨,老刑警劉巖架曹,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘冲,死亡現(xiàn)場離奇詭異,居然都是意外死亡绑雄,警方通過查閱死者的電腦和手機展辞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绳慎,“玉大人纵竖,你說我怎么就攤上這事⌒臃撸” “怎么了靡砌?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長珊楼。 經(jīng)常有香客問我通殃,道長,這世上最難降的妖魔是什么厕宗? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任画舌,我火速辦了婚禮,結(jié)果婚禮上已慢,老公的妹妹穿的比我還像新娘曲聂。我一直安慰自己,他們只是感情好佑惠,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布朋腋。 她就那樣靜靜地躺著,像睡著了一般膜楷。 火紅的嫁衣襯著肌膚如雪旭咽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天赌厅,我揣著相機與錄音穷绵,去河邊找鬼。 笑死特愿,一個胖子當(dāng)著我的面吹牛仲墨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揍障,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼宗收,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亚兄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤采驻,失蹤者是張志新(化名)和其女友劉穎审胚,沒想到半個月后匈勋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡膳叨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年洽洁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菲嘴。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡饿自,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出龄坪,到底是詐尸還是另有隱情昭雌,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布健田,位于F島的核電站烛卧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妓局。R本人自食惡果不足惜总放,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望好爬。 院中可真熱鬧局雄,春花似錦、人聲如沸存炮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僵蛛。三九已至尚蝌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間充尉,已是汗流浹背飘言。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驼侠,地道東北人姿鸿。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像倒源,于是被迫代替她去往敵國和親苛预。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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