zookeeper原理與實踐

zookeeper推薦本書《分布式一致性原理與實踐》作者倪超一喘,相比較與是市面上爛大街的技術(shù)書籍茶行,這本關(guān)于zookeeper的書寫的算是很好評的了夺饲。

Zookeeper是分布式一致性問題的工業(yè)解決方案胡陪,是Apache Hadoop下解決分布式一致性的一個組件件舵,后被分離出來成為Apache的頂級項目。

工程來源:是雅虎公司內(nèi)部項目她倘,據(jù)說雅虎內(nèi)部很多項目都是以動物命名璧微,這個動物管理員的名字起的很是形象,被開源出來后得到開源社區(qū)的快速推進硬梁,服務(wù)端Java語言實現(xiàn)前硫,棒,git有3000+的star https://github.com/apache/zookeeper

zookeeper集群結(jié)構(gòu)

集群的角色荧止,比較典型的是Master/Slave(主備模式)屹电,zk中的概念跟這個不一樣,包含Leader跃巡、Follower危号、Observer三個角色,leader提供讀和寫的能力素邪,follower只對外提供讀的能力外莲。

會話(session),客戶端跟服務(wù)端交互,是先與服務(wù)端建立一個TCP長連接偷线,會話開始磨确,通過心跳檢測與服務(wù)端保持會話有效,向服務(wù)端發(fā)送請求和接收相應(yīng)

zk將所有的數(shù)據(jù)都加載在內(nèi)存一份声邦,同時有事務(wù)日志文件(持久化文件)乏奥,服務(wù)端會定時dump快照數(shù)據(jù),重啟機器的時候會根據(jù)快照和事務(wù)日志恢復(fù)內(nèi)存數(shù)據(jù)庫的數(shù)據(jù)亥曹,這跟redis的AOF和RDB概念類似英融。

zk上的數(shù)據(jù)的結(jié)構(gòu)跟linux文件系統(tǒng)很像,是個樹狀結(jié)構(gòu)

?zookeeper上的數(shù)據(jù)結(jié)構(gòu)
節(jié)點(node)上的信息字段

節(jié)點類型包括是持久型節(jié)點歇式,順序持久型節(jié)點,臨時節(jié)點胡野,順序臨時節(jié)點材失。其中臨時節(jié)點特性就是創(chuàng)建它的主體消失后,它就跟著消失了硫豆。后續(xù)的應(yīng)用就是利用的節(jié)點的特性實現(xiàn)的龙巨。

事件監(jiān)聽器(watcher),這個應(yīng)該是zookeeper最重要的概念之一了熊响,zk允許用戶在特定的節(jié)點(znode)上注冊watcher旨别,并且在特定事件觸發(fā)的時候,zk服務(wù)端會將事件通知到感興趣的客戶端上汗茄。

偽集群的搭建:

zoo.cfg 配置文件

1.拷貝三份文件文件

2.修改配置zoo.cfg秸弛,區(qū)別出日志目錄和端口號,dataDir文件下添加表示機器號的文件myid

3.集群配置列表洪碳,第一個端口機器間業(yè)務(wù)通訊的端口递览,第二個端口是用來進行l(wèi)eader選舉的端口

4.分別啟動三臺服務(wù)器

啟動成功后,命令行連接zk瞳腌,可以用指令做些增刪改查的操作

telnet 127.0.0.1 2181

stat可以看集群的狀態(tài)信息

stat信息

每次事務(wù)操作绞铃,會在dataDir的目錄下的事務(wù)日志,是序列化的二進制文件嫂侍,zookeeper提供了查看事務(wù)日志的工具類LogFormatter

LogFormatter轉(zhuǎn)換后的事務(wù)日志文件

Java客戶端使用

1儿捧、zookeeper自帶的

2、開源的客戶端ZkClient挑宠,實現(xiàn)session超時重連菲盾,watcher反復(fù)注冊的功能,簡化開發(fā)人員的使用

3各淀、開源客戶端Crurator亿汞,解決底層的細節(jié)開發(fā)工作,目前是apache的頂級項目揪阿,是使用最廣泛的zk客戶端疗我。github1.7star 傳送門https://github.com/Netflix/curator咆畏,官網(wǎng)傳送門http://curator.apache.org/

(1)提供了可讀性更新的api接口

(2)提供了各種應(yīng)用場景的抽象封裝(共享鎖服務(wù)、Master選舉機制吴裤,分布式計數(shù)器等)

(3)guava is to java what cruator is to zookeeper

cruator客戶端例子

zookeeper應(yīng)用場景

利用zookeeper的特性旧找,可以比較方便的構(gòu)建分布式應(yīng)用會涉及的核心功能,比如:

配置中心麦牺、命名服務(wù)钮蛛、分布式協(xié)調(diào)/通知、集群的管理剖膳、master選舉魏颓、分布式鎖等

以下應(yīng)用基本基于zookeeper的兩大特性實現(xiàn)

1、客戶端如果對zookeeper的一個數(shù)據(jù)節(jié)點注冊watcher監(jiān)聽吱晒,那么當(dāng)該數(shù)據(jù)節(jié)點的內(nèi)容或其子節(jié)點的列表發(fā)生變更是甸饱,zookeeper服務(wù)器就會想訂閱的客戶端發(fā)送變更通知

2、對在zookeeper上創(chuàng)建的臨時節(jié)點(sequent類型)仑濒,一旦客戶端與服務(wù)器之間的回話失效叹话,那么臨時節(jié)點會被自動清除

--配置中心:

配置中心

zookeeper利用推拉結(jié)合的方式,客戶端向服務(wù)端注冊自己需要關(guān)注的節(jié)點墩瞳,一旦該數(shù)據(jù)發(fā)生變更驼壶,那么服務(wù)器就會向相應(yīng)的客戶端發(fā)送watcher時間通知,客戶收到這個消息通知之后喉酌,再主動到服務(wù)端獲取最新的數(shù)據(jù)热凹。即回調(diào)的event中包含具體的數(shù)據(jù)。這個應(yīng)用的的業(yè)務(wù)員特點:

1.數(shù)據(jù)不經(jīng)常變化

2.數(shù)據(jù)量通常比較小泪电,保存的內(nèi)存里碌嘀,訪問很快

3.配置動態(tài)變化,不需要重啟機器歪架,數(shù)據(jù)變化股冗,會通知相應(yīng)的客戶端

4.集群共享配置,一致

比如數(shù)據(jù)庫連接的配置和蚪,業(yè)務(wù)的開關(guān)止状,甚至一些數(shù)據(jù)量小,不經(jīng)常變的業(yè)務(wù)數(shù)據(jù)如彈窗文案攒霹,活動文案也放里邊怯疤,用于快速迭代實現(xiàn)功能。


--命名服務(wù)

利用zookeeper的順序節(jié)點催束,樹形結(jié)構(gòu)的數(shù)據(jù)特點集峦。實現(xiàn)命名服務(wù)

1、比如RPC框架中,每個服務(wù)在zookeeper中對應(yīng)一個節(jié)點(serviceName)塔淤,節(jié)點下存放這個服務(wù)所用到的資源摘昌,比如部署的ip列表,接口列表高蜂。

這樣RPC的客戶端只需要傳對應(yīng)的服務(wù)名字聪黎,和接口,就能找到對應(yīng)的服務(wù)备恤。

2稿饰、全局唯一id的生成,UUID(通用的唯一標識碼)可以實現(xiàn)露泊,但是他的缺點是:

太長喉镰,包含32位字符和4個短線字符串

看不出業(yè)務(wù)含義,不方便排查問題

使用zookeeper實現(xiàn):

不同的業(yè)務(wù)下創(chuàng)建一個節(jié)點惭笑,具體的節(jié)點下用zk的順序節(jié)點(sequent)生成id當(dāng)做這個業(yè)務(wù)的全局唯一id使用


--分布式通知/協(xié)調(diào)

ZooKeeper中特有watcher注冊與異步通知機制侣姆,能夠很好的實現(xiàn)分布式環(huán)境下不同系統(tǒng)之間的通知與協(xié)調(diào),實現(xiàn)對數(shù)據(jù)變更的實時處理脖咐。使用方法通常是不同系統(tǒng)都對ZK上同一個znode進行注冊,監(jiān)聽znode的變化(包括znode本身內(nèi)容及子節(jié)點的)汇歹,其中一個系統(tǒng)update了znode屁擅,那么另一個系統(tǒng)能夠收到通知,并作出相應(yīng)處理产弹。應(yīng)用:

心跳檢測機制:傳統(tǒng)的方式是ping派歌,復(fù)雜的話是建立長連接檢測系統(tǒng)和被檢測系統(tǒng)之間并不直接關(guān)聯(lián)起來,而是通過zookeeper上某個節(jié)點關(guān)聯(lián)痰哨,大大減少系統(tǒng)耦合

系統(tǒng)調(diào)度模式:某系統(tǒng)由控制臺和推送系統(tǒng)兩部分組成胶果,控制臺的職責(zé)是控制推送系統(tǒng)進行相應(yīng)的推送工作。管理人員在控制臺作的一些操作斤斧,實際上是修改了ZK上某些節(jié)點的狀態(tài)早抠,而ZK就把這些變化通知給他們注冊Watcher的客戶端,即推送系統(tǒng)撬讽,于是蕊连,作出相應(yīng)的推送任務(wù)

作匯報模式:一些類似于任務(wù)分發(fā)系統(tǒng),子任務(wù)啟動后游昼,到ZK來注冊一個臨時節(jié)點甘苍,并且定時將自己的進度進行匯報(將進度寫回這個臨時節(jié)點),

總之烘豌,使用zookeeper來進行分布式通知和協(xié)調(diào)能夠大大降低系統(tǒng)之間的耦合载庭。


--分布式鎖

這個應(yīng)用主要得益于ZooKeeper為我們保證了數(shù)據(jù)的強一致性,即用戶只要完全相信每時每刻,zk集群中任意節(jié)點(一個zk server)上的相同znode的數(shù)據(jù)是一定是相同的囚聚。一個節(jié)點要么創(chuàng)建成功靖榕,要么失敗,并且只由一個客戶端創(chuàng)建靡挥。

獨占鎖:

保持獨占序矩,就是所有試圖來獲取這個鎖的客戶端,最終只有一個可以成功獲得這把鎖跋破。通常的做法是把ZK上的一個znode看作是一把鎖簸淀,通過create znode的方式來實現(xiàn)。所有客戶端都去創(chuàng)建/distribute_lock節(jié)點毒返,最終成功創(chuàng)建的那個客戶端也即擁有了這把鎖租幕。

共享時序控制鎖:

Zookeeper卻很容易實現(xiàn)這個功能,實現(xiàn)方式也是需要獲得鎖的Server創(chuàng)建一個EPHEMERAL_SEQUENTIAL目錄節(jié)點拧簸,然后調(diào)用getChildren方法獲取當(dāng)前的目錄節(jié)點列表中最小的目錄節(jié)點是不是就是自己創(chuàng)建的目錄節(jié)點劲绪,如果正是自己創(chuàng)建的,那么它就獲得了這個鎖盆赤,如果不是那么它就調(diào)用exists(String path, boolean watch)方法并監(jiān)控Zookeeper上目錄節(jié)點列表的變化贾富,一直到自己創(chuàng)建的節(jié)點是列表中最小編號的目錄節(jié)點,從而獲得鎖牺六,釋放鎖很簡單颤枪,只要刪除前面它自己所創(chuàng)建的目錄節(jié)點就行了。


--master選舉


master選舉應(yīng)用圖

有個容易理解的方案淑际,依靠關(guān)系型數(shù)據(jù)庫主鍵的特性畏纲,集群的機器同時往一張表里插入數(shù)據(jù),數(shù)據(jù)庫會自動進行主鍵沖突檢查春缕,可以選擇插入成功的客戶端作為master

這種方式存在一個問題就是盗胀,master機器掛了,沒有人通知

zk實現(xiàn)可以方便做到這一點:

zk的創(chuàng)建節(jié)點api接口锄贼,具有強一致性票灰,能夠保證客戶端并發(fā)創(chuàng)建的時候,最終一定只有一個客戶端創(chuàng)建成功宅荤。

1.客戶端集群每天定時往/master_election/(當(dāng)天日期)2017-03-24/binding創(chuàng) 建臨時節(jié)點米间,只有一個成功,為master

2.創(chuàng)建失敗的在/master_election/(當(dāng)天日期)2017-03-24 注冊監(jiān)聽事件膘侮,當(dāng)master掛了屈糊,其余機器收到通知,重新進行選舉


--集群管理

應(yīng)用舉例:集群機器存活性監(jiān)控系統(tǒng)琼了,例如

監(jiān)控系統(tǒng)在/clusterServers節(jié)點注冊一個watcher監(jiān)聽逻锐,那么但凡進行動態(tài)添加機器的操作夫晌,就在/clusterServers下創(chuàng)建一個臨時節(jié)點, /clusterServers/ip昧诱。

這樣監(jiān)控系統(tǒng)就能夠?qū)崟r的檢測到機器的變動晓淀,通過getChild方法獲取所有的臨時節(jié)點,來判斷增加的機器盏档。

當(dāng)有機器down調(diào)或者手動下線凶掰,相應(yīng)臨時節(jié)點會消失,監(jiān)控系統(tǒng)也會接收到蜈亩,來處理監(jiān)控服務(wù)的具體業(yè)務(wù)

具體服務(wù)器部署agent實現(xiàn)


zookeeper的HA設(shè)計實現(xiàn)

以上說了那么多犀利實用的應(yīng)用場景懦窘,它們依賴zookeeper,說明這些應(yīng)用服務(wù)的高可用性依賴的zookeeper本身的HA稚配。

zk的選舉算法

算法協(xié)議zab協(xié)議畅涂,“少數(shù)服從多數(shù)”協(xié)議一種

3.4.0版本之后Zookeeper只保留了TCP版本的FastLeaderElection選舉算法

分析選舉算法前,先熟悉了解下zk的一些術(shù)語定義解釋:

SID:服務(wù)器ID道川,在集群的配置文件里配置

ZXID:是一個事務(wù)ID午衰,用來唯一標示一次服務(wù)器狀態(tài)變更,集群中每臺機器上的ZXID可能不一樣

Vote:投票選舉冒萄,當(dāng)集群中機器發(fā)現(xiàn)自己無法檢測到leader的時候臊岸,開始嘗試進行投票

Quorum:過半機器數(shù), quorum=(集群機器數(shù))n/2+1尊流,比如集群數(shù)量是3帅戒, quorum=2

集群數(shù)量是4,quorum=2奠旺,集群數(shù)量是5蜘澜,quorum=3


當(dāng)哪些情況發(fā)生時會出發(fā)leader重新選舉呢施流?

當(dāng)zk的一臺服務(wù)器出現(xiàn)以下兩種情況的時候响疚,會進入leader選舉流程

1.加機器,服務(wù)器初始化

2.服務(wù)器運行期間無法和leader通信瞪醋,leader所在服務(wù)器down掉了

對于第一種情況忿晕,即已經(jīng)存在一臺leader服務(wù)器,當(dāng)改機器試圖去選舉leader的時候银受,會被告知當(dāng)前服務(wù)器的leader信息践盼,對于該機器僅僅需要和leader建立連接,并進行狀態(tài)同步即可

主要看下第二種情況:

有兩種情況導(dǎo)致集群不存在leader宾巍,一個是集群剛啟動初始化的時候咕幻,另一種情況是運行期間leader所在服務(wù)器掛了。無論哪種情況集群所有集群都處在一個找leader的狀態(tài)顶霞,稱作Looking狀態(tài)肄程,開始想其他機器發(fā)送消息投票


開始leader選舉投票的協(xié)議規(guī)則是怎樣呢锣吼?

1.投票的消息包含(SID,ZXID)

2.一開始試圖投自己蓝厌,把投票消息廣播出去

3.先比較ZXID玄叠,選擇ZXID大的

4.ZXID相等的,比較SID拓提,選擇SID大的

5.如果自己的值大于別的服務(wù)器廣播來的消息读恃,投票不做變更

6.反正,更換投票代态,開始第二輪投票寺惫,廣播出去投票信息

7.每輪結(jié)束統(tǒng)計投票,如果一臺服務(wù)器收到超過半數(shù)的相同投票胆数,那個這個服務(wù)器對用的SID機器為Leader

5臺機器宕機兩臺后肌蜻,leader選舉的過程圖示

因此,一個錯誤的認識必尼,為了使zookeeper集群能順利的選出leader蒋搜,必須將zookeeper集群的服務(wù)器數(shù)部署為奇數(shù)。

從上邊例子能看出來部署任意臺機器都能夠正常選舉運行判莉。部署奇數(shù)臺是官方給的建議豆挽,因為奇數(shù)和奇數(shù)+1的容災(zāi)能力是一樣的。比如:

5臺服務(wù)器券盅,能夠?qū)?臺機器掛掉的情況進程容災(zāi)

6臺服務(wù)器帮哈,能夠?qū)?臺機器掛掉的情況進程容災(zāi),如果掛掉3臺锰镀,剩下的機器就無法實現(xiàn)過半了娘侍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泳炉,隨后出現(xiàn)的幾起案子憾筏,更是在濱河造成了極大的恐慌,老刑警劉巖花鹅,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氧腰,死亡現(xiàn)場離奇詭異,居然都是意外死亡刨肃,警方通過查閱死者的電腦和手機古拴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來真友,“玉大人黄痪,你說我怎么就攤上這事】唬” “怎么了桅打?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵焕参,是天一觀的道長。 經(jīng)常有香客問我油额,道長叠纷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任潦嘶,我火速辦了婚禮涩嚣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掂僵。我一直安慰自己航厚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布锰蓬。 她就那樣靜靜地躺著幔睬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芹扭。 梳的紋絲不亂的頭發(fā)上麻顶,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音舱卡,去河邊找鬼辅肾。 笑死,一個胖子當(dāng)著我的面吹牛轮锥,可吹牛的內(nèi)容都是我干的矫钓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舍杜,長吁一口氣:“原來是場噩夢啊……” “哼新娜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起既绩,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤概龄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熬词,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旁钧,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡吸重,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年互拾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚎幸。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡颜矿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫉晶,到底是詐尸還是另有隱情骑疆,我是刑警寧澤田篇,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站箍铭,受9級特大地震影響泊柬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诈火,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一兽赁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冷守,春花似錦刀崖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至充活,卻和暖如春蜂莉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背混卵。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工巡语, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淮菠。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓男公,卻偏偏與公主長得像,于是被迫代替她去往敵國和親合陵。 傳聞我的和親對象是個殘疾皇子枢赔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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