ZooKeeper介紹及典型使用場(chǎng)景

      網(wǎng)友投稿 1338 2025-03-31

      1 概述


      ZooKeeper(動(dòng)物園管理員),顧名思義,是用來(lái)管理Hadoop(大象)、Hive(蜜蜂)、Pig(小豬)的管理員,同時(shí)Apache HBase、Apache Solr、LinkedIn Sensei等眾多項(xiàng)目中都采用了ZooKeeper。

      ZooKeeper曾是Hadoop的正式子項(xiàng)目,后發(fā)展成為Apache頂級(jí)項(xiàng)目,與Hadoop密切相關(guān)但卻沒(méi)有任何依賴。它是一個(gè)針對(duì)大型應(yīng)用提供高可用的數(shù)據(jù)管理、應(yīng)用程序協(xié)調(diào)服務(wù)的分布式服務(wù)框架,基于對(duì)Paxos算法的實(shí)現(xiàn),使該框架保證了分布式環(huán)境中數(shù)據(jù)的強(qiáng)一致性,提供的功能包括:配置維護(hù)、統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理等。

      在分布式應(yīng)用中,由于工程師不能很好地使用鎖機(jī)制,以及基于消息的協(xié)調(diào)機(jī)制不適合在某些應(yīng)用中使用,因此需要有一種可靠的、可擴(kuò)展的、分布式的、可配置的協(xié)調(diào)機(jī)制來(lái)統(tǒng)一系統(tǒng)的狀態(tài)。Zookeeper的目的就在于此。

      2 特征

      ZooKeeper是簡(jiǎn)單的:ZooKeeper的核心是一個(gè)精簡(jiǎn)文件系統(tǒng),它提供一些簡(jiǎn)單的操作和一些額外的抽象操作,例如:排序和通知。

      ZooKeeper是富有表現(xiàn)力的:ZooKeeper的原語(yǔ)操作是一組構(gòu)件(building block),可用于實(shí)現(xiàn)很多協(xié)調(diào)數(shù)據(jù)結(jié)構(gòu)和協(xié)議,例如:分布式隊(duì)列、分布式鎖和一組同級(jí)節(jié)點(diǎn)中的leader選舉(leader election)。

      ZooKeeper具有高可用性:ZooKeeper運(yùn)行在集群上,被設(shè)計(jì)成具有較高的可用性,因此應(yīng)用程序可以完全依賴它。ZooKeeper可以幫助系統(tǒng)避免出現(xiàn)單點(diǎn)故障,從而構(gòu)建一個(gè)可靠的應(yīng)用。

      ZooKeeper采用松耦合交互方式:在ZooKeeper支持的交互過(guò)程中,參與者之間不需要彼此了解。例如:ZooKeeper可以被用作一個(gè)rendezvous機(jī)制,讓進(jìn)程在不了解其他進(jìn)程或網(wǎng)絡(luò)狀況的情況下能夠彼此發(fā)現(xiàn)并進(jìn)行交互。參與協(xié)調(diào)的各方甚至可以不必同時(shí)存在,因?yàn)橐粋€(gè)進(jìn)程在ZooKeeper中留下一條消息,在該進(jìn)程結(jié)束后,另外一個(gè)進(jìn)程還可以讀取這條消息。

      ZooKeeper是一個(gè)資源庫(kù):ZooKeeper提供了一個(gè)關(guān)于通用協(xié)調(diào)模式實(shí)現(xiàn)和方法的開(kāi)源共享存儲(chǔ)庫(kù),能使程序員免于編寫(xiě)這類通用的協(xié)議。所有人都能夠?qū)@個(gè)資源庫(kù)進(jìn)行添加和改進(jìn),隨著時(shí)間的推移,會(huì)使每個(gè)人都從中收益。

      ZooKeeper是高性能的:在它的誕生地Yahoo!公司,對(duì)于以寫(xiě)為主的工作負(fù)載來(lái)說(shuō),ZooKeeper的基準(zhǔn)吞吐量已超過(guò)每秒10000個(gè)操作;對(duì)于常規(guī)的以讀為主的工作負(fù)載來(lái)說(shuō),吞吐量更是高出好幾倍。

      3 ZooKeeper的數(shù)據(jù)模型

      理解ZooKeeper的一種方法是將其看做一個(gè)具有高可用性的文件系統(tǒng)。但這個(gè)文件系統(tǒng)中沒(méi)有文件和目錄,而是統(tǒng)一使用節(jié)點(diǎn)(node)的概念,稱為znode。znode既可以保存數(shù)據(jù)(如同文件),也可以保存其他znode(如同目錄)。所有的znode構(gòu)成一個(gè)層次化的數(shù)據(jù)結(jié)構(gòu),。

      Persistent Nodes: 永久有效地節(jié)點(diǎn),除非client顯式的刪除,否則一直存在

      Ephemeral Nodes: 臨時(shí)節(jié)點(diǎn),僅在創(chuàng)建該節(jié)點(diǎn)client保持連接期間有效,一旦連接丟失,zookeeper會(huì)自動(dòng)刪除該節(jié)點(diǎn)

      Sequence Nodes: 順序節(jié)點(diǎn),client申請(qǐng)創(chuàng)建該節(jié)點(diǎn)時(shí),zk會(huì)自動(dòng)在節(jié)點(diǎn)路徑末尾添加遞增序號(hào),這種類型是實(shí)現(xiàn)分布式鎖,分布式queue等特殊功能的關(guān)鍵

      ZooKeeper是Hadoop的正式子項(xiàng)目,與Hadoop密切相關(guān)但卻沒(méi)有任何依賴。它是一個(gè)針對(duì)大型應(yīng)用提供高可用的數(shù)據(jù)管理、應(yīng)用程序協(xié)調(diào)服務(wù)的分布式服務(wù)框架,基于對(duì)Paxos算法的實(shí)現(xiàn),使該框架保證了分布式環(huán)境中數(shù)據(jù)的強(qiáng)一致性,提供的功能包括:配置維護(hù)、統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理等。

      4 ZooKeeper典型使用場(chǎng)景

      4.1 數(shù)據(jù)發(fā)布于訂閱

      ZooKeeper介紹及典型使用場(chǎng)景

      4.1.1 特性、用法

      發(fā)布與訂閱即所謂的配置管理,顧名思義就是將數(shù)據(jù)發(fā)布到zk節(jié)點(diǎn)上,供訂閱者動(dòng)態(tài)獲取數(shù)據(jù),實(shí)現(xiàn)配置信息的集中式管理和動(dòng)態(tài)更新。例如:全局的配置信息、地址列表等。

      4.1.2 具體用法

      索引信息和集群中機(jī)器節(jié)點(diǎn)狀態(tài)放在zk的一些指定節(jié)點(diǎn),供各個(gè)客戶端訂閱使用。

      系統(tǒng)日志(經(jīng)處理后)存儲(chǔ),這些日志通常2-3天后清除。

      應(yīng)用中用到的一些配置信息集中管理,在應(yīng)用啟動(dòng)的時(shí)候主動(dòng)來(lái)獲取一次,并在節(jié)點(diǎn)上注冊(cè)一個(gè)Watcher,以后每次配置有更新,實(shí)時(shí)通知到應(yīng)用,獲取最新的配置信息。

      業(yè)務(wù)邏輯中需要用到的一些全局變量,比如一些消息中間件的消息隊(duì)列通常有個(gè)offset,這個(gè)offset存放在zk上,這樣集群中每個(gè)發(fā)送者都能知道當(dāng)前的發(fā)送進(jìn)度。

      系統(tǒng)中有些信息需要?jiǎng)討B(tài)獲取,并且還會(huì)存在人工手動(dòng)去修改這個(gè)信息。以前通常是暴露出接口,例如JMX接口,有了zk后,只要將這些信息存放到zk節(jié)點(diǎn)上即可。

      4.2 命名服務(wù)

      4.2.1 特性、用法

      這個(gè)主要是作為分布式命名服務(wù),通過(guò)調(diào)用zk的create node api,能夠很容易創(chuàng)建一個(gè)全局唯一的path,可以將這個(gè)path作為一個(gè)名稱。

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

      4.3.1 特性、用法

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

      使用ZooKeeper來(lái)進(jìn)行分布式通知和協(xié)調(diào)能夠大大降低系統(tǒng)之間的耦合。

      4.3.2 具體用法

      心跳檢測(cè)機(jī)制:檢測(cè)系統(tǒng)和被測(cè)系統(tǒng)之間并不直接關(guān)聯(lián)起來(lái),而是通過(guò)zk上某個(gè)節(jié)點(diǎn)關(guān)聯(lián),大大減少系統(tǒng)耦合。

      系統(tǒng)調(diào)度模式:某系統(tǒng)有控制臺(tái)和推送系統(tǒng)兩部分組成,控制臺(tái)的職責(zé)是控制推送系統(tǒng)進(jìn)行相應(yīng)的推送工作。管理人員在控制臺(tái)做的一些操作,實(shí)際上是修改了zk上某些節(jié)點(diǎn)的狀態(tài),而zk就把這些變化通知給它們注冊(cè)watcher的客戶端,即推送系統(tǒng),于是,做出相應(yīng)的推送任務(wù)。

      工作匯報(bào)模式:一些類似于任務(wù)分發(fā)系統(tǒng),子任務(wù)啟動(dòng)后,到zk來(lái)注冊(cè)一個(gè)臨時(shí)節(jié)點(diǎn),并定時(shí)將自己的進(jìn)度進(jìn)行匯報(bào)(將進(jìn)度寫(xiě)回這個(gè)臨時(shí)節(jié)點(diǎn)),這樣任務(wù)管理者就能夠?qū)崟r(shí)指導(dǎo)任務(wù)進(jìn)度。

      4.4 分布式鎖

      4.4.1 特性、用法

      分布式鎖,主要得益于ZooKeeper保證數(shù)據(jù)的強(qiáng)一致性,即zk集群中任意節(jié)點(diǎn)(一個(gè)zk server)上系統(tǒng)znoe的數(shù)據(jù)一定相同。

      鎖服務(wù)可以分為兩類:

      保持獨(dú)占鎖:所有試圖來(lái)獲取這個(gè)鎖的客戶端,最終只有一個(gè)可以成功獲得這把鎖。通常的做法是把zk上的一個(gè)znode看做是一把鎖,通過(guò)create znode的方式來(lái)實(shí)現(xiàn)。所有客戶端都去創(chuàng)建/distribute_lock節(jié)點(diǎn),最終成功創(chuàng)建的那個(gè)客戶端也即擁有了這把鎖。

      控制時(shí)序鎖:所有試圖來(lái)獲取這個(gè)鎖的客戶端,最終都是會(huì)被安排執(zhí)行,只是有個(gè)全局時(shí)序了。與保持獨(dú)占鎖的做法類似,不同點(diǎn)是/distribute_lock已經(jīng)預(yù)先存在,客戶端在它下面創(chuàng)建臨時(shí)有序節(jié)點(diǎn)(可以通過(guò)節(jié)點(diǎn)控制屬性控制:CreateMode.EPHEMERAL_SEQUENTIAL來(lái)指定)。zk的父節(jié)點(diǎn)(/distribute_lock)維持一份sequence,保證子節(jié)點(diǎn)創(chuàng)建的時(shí)序性,從而形成每個(gè)客戶端的全局時(shí)序。

      4.5 集群管理

      4.5.1 特性、用法

      集群機(jī)器監(jiān)控:這通常用于那種對(duì)集群中機(jī)器狀態(tài)、機(jī)器在線率有較高要求的場(chǎng)景,能夠快速對(duì)集群中機(jī)器變化做出響應(yīng)。這樣的場(chǎng)景中,往往有一個(gè)監(jiān)控系統(tǒng),實(shí)時(shí)監(jiān)測(cè)集群機(jī)器是否存活。過(guò)去的做法通常是:監(jiān)控系統(tǒng)通過(guò)某種手段(比如ping)定時(shí)檢測(cè)每個(gè)機(jī)器、或每個(gè)機(jī)器定時(shí)向監(jiān)控系統(tǒng)發(fā)送心跳信息。這種做法存在兩個(gè)弊端:1.集群中機(jī)器有變動(dòng)的時(shí)候,牽連修改的東西比較多。2.有一定的延遲。利用ZooKeeper,可以實(shí)現(xiàn)另一種集群機(jī)器存活性監(jiān)控系統(tǒng):a.客戶端在節(jié)點(diǎn)x上注冊(cè)watcher,如果x的子節(jié)點(diǎn)發(fā)生變化,會(huì)通知該客戶端。b.創(chuàng)建EPHEMERAL類型的節(jié)點(diǎn),一旦客戶端和服務(wù)器的會(huì)話結(jié)束或過(guò)期,該節(jié)點(diǎn)就會(huì)消失。例如:監(jiān)控系統(tǒng)在/clusterServers節(jié)點(diǎn)上注冊(cè)一個(gè)watcher,以后每動(dòng)態(tài)加機(jī)器,就往/culsterServer下創(chuàng)建一個(gè)EPHEMERAL類型的節(jié)點(diǎn):/clusterServer/{hostname}。這樣,監(jiān)控系統(tǒng)就能實(shí)時(shí)知道機(jī)器的增減情況,至于后續(xù)處理就是監(jiān)控系統(tǒng)的業(yè)務(wù)了。

      Master選舉:在分布式環(huán)境中,相同的業(yè)務(wù)應(yīng)用分布在不同的機(jī)器上,有些業(yè)務(wù)邏輯(例如一些耗時(shí)的計(jì)算、網(wǎng)絡(luò)I/O處理),往往需要讓整個(gè)集群中的某一臺(tái)機(jī)器進(jìn)行執(zhí)行,其余機(jī)器可以共享這個(gè)結(jié)果,這樣可以減少重復(fù)勞動(dòng)、提高性能。利用ZooKeeper的強(qiáng)一致性,能夠保證在分布式高并發(fā)情況下節(jié)點(diǎn)創(chuàng)建的全局唯一性,即:同時(shí)有多個(gè)客戶端請(qǐng)求創(chuàng)建/currentMaster節(jié)點(diǎn),最終一定只有一個(gè)客戶端請(qǐng)求能夠創(chuàng)建成功。利用這個(gè)特性,就能很輕易的在分布式環(huán)境中進(jìn)行集群選取了。另外,這種場(chǎng)景演化一下,就是動(dòng)態(tài)Master選舉。這就要用到 EPHEMERAL_SEQUENTIAL類型節(jié)點(diǎn)的特性了。上文中提到,所有客戶端創(chuàng)建請(qǐng)求,最終只有一個(gè)能夠創(chuàng)建成功。在這里稍微變化下,就是允許所有請(qǐng)求都能夠創(chuàng)建成功,但是得有個(gè)創(chuàng)建順序,于是所有的請(qǐng)求最終在zk上創(chuàng)建結(jié)果的一種可能情況是這樣: /currentMaster/{sessionId}-1、/currentMaster/{sessionId}-2、/currentMaster/{sessionId}-3……。每次選取序列號(hào)最小的那個(gè)機(jī)器作為Master,如果這個(gè)機(jī)器掛了,由于他創(chuàng)建的節(jié)點(diǎn)會(huì)馬上消失,那么之后最小的那個(gè)機(jī)器就是Master了。

      4.5.2 具體用法

      在搜索系統(tǒng)中,如果集群中每個(gè)機(jī)器都生成一份全量索引,不僅耗時(shí),而且不能保證彼此之間索引數(shù)據(jù)一致。因此讓集群中的Master來(lái)進(jìn)行全量索引的生成,然后同步到集群中其它機(jī)器。

      Master選舉的容災(zāi)措施是,可以隨時(shí)進(jìn)行手動(dòng)指定master,就是說(shuō)應(yīng)用在zk在無(wú)法獲取master信息時(shí),可以通過(guò)比如http方式,向一個(gè)地方獲取master。

      4.6 分布式隊(duì)列

      4.6.1 特性、用法

      隊(duì)列方面,有兩種方式:一種是常規(guī)的先進(jìn)先出隊(duì)列,另一種是要等到隊(duì)列成員聚齊之后的才統(tǒng)一按序執(zhí)行。

      對(duì)于先進(jìn)先出隊(duì)列,和分布式鎖服務(wù)中的控制時(shí)序場(chǎng)景基本原理一致,這里不再贅述。

      第二種隊(duì)列其實(shí)是在FIFO隊(duì)列的基礎(chǔ)上作了一個(gè)增強(qiáng)。通常可以在/queue這個(gè)znode下預(yù)先建立一個(gè)/queue/num節(jié)點(diǎn),并且賦值為n(或者直接給/queue賦值n),表示隊(duì)列大小,之后每次有隊(duì)列成員加入后,就判斷下是否已經(jīng)到達(dá)隊(duì)列大小,決定是否可以開(kāi)始執(zhí)行了。這種用法的典型場(chǎng)景是,分布式環(huán)境中,一個(gè)大任務(wù)Task A,需要在很多子任務(wù)完成(或條件就緒)情況下才能進(jìn)行。這個(gè)時(shí)候,凡是其中一個(gè)子任務(wù)完成(就緒),那么就去/taskList下建立自己的臨時(shí)時(shí)序節(jié)點(diǎn)(CreateMode.EPHEMERAL_SEQUENTIAL),當(dāng)/taskList發(fā)現(xiàn)自己下面的子節(jié)點(diǎn)滿足指定個(gè)數(shù),就可以進(jìn)行下一步按序進(jìn)行處理了。

      ZooKeeper 分布式

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:精裝項(xiàng)目管理
      下一篇:excel如何以文本形式存儲(chǔ)數(shù)字(excel以文本形式存儲(chǔ)的數(shù)字)
      相關(guān)文章
      久久av无码专区亚洲av桃花岛| 亚洲欧洲成人精品香蕉网| 亚洲AV无码一区二区乱子伦| 亚洲区不卡顿区在线观看| 国产成人综合亚洲| 麻豆亚洲AV成人无码久久精品| 亚洲AV无码片一区二区三区| 亚洲国产成人综合精品| 亚洲精品无码成人| 亚洲AV无码国产剧情| 亚洲a∨国产av综合av下载 | 亚洲处破女AV日韩精品| 国产亚洲色婷婷久久99精品91| 久久影视综合亚洲| 国外亚洲成AV人片在线观看 | 亚洲校园春色小说| 亚洲一区二区三区精品视频| 亚洲a∨无码男人的天堂| 亚洲一区精彩视频| 亚洲精品无码永久在线观看男男 | 亚洲成av人片在www鸭子| 亚洲国产精品ⅴa在线观看| 亚洲av无码一区二区三区人妖| 久久亚洲AV成人无码国产最大| 国产成人亚洲午夜电影| 亚洲精品高清在线| 国产成人精品日本亚洲专区61| 国产成人精品日本亚洲网站| 亚洲AV日韩AV天堂久久| 亚洲综合日韩中文字幕v在线| 亚洲色图.com| 97se亚洲国产综合自在线| 亚洲乱色伦图片区小说| 国产精品观看在线亚洲人成网| 夜色阁亚洲一区二区三区| 亚洲一区二区三区影院| 亚洲成人午夜在线| 亚洲国产精品成人精品软件| 日本亚洲免费无线码| 久久久久亚洲国产AV麻豆 | 亚洲伊人久久成综合人影院|