ZooKeeper 有哪些應用場景
hello大家好,上期我們介紹了ZooKeerper一些面試題,今天重點介紹下ZooKeeper的一些應用場景。
ZooKeeper?有哪些應用場景呢?
一、數(shù)據(jù)發(fā)布與訂閱
發(fā)布與訂閱即所謂的配置管理,顧名思義就是將數(shù)據(jù)發(fā)布到ZooKeeper節(jié)點上,供訂閱者動態(tài)獲取數(shù)據(jù),實現(xiàn)配置信息的集中式管理和動態(tài)更新。
例如全局的配置信息,地址列表等就非常適合使用。數(shù)據(jù)發(fā)布/訂閱的一個常見的場景是配置中心,發(fā)布者把數(shù)據(jù)發(fā)布到 ZooKeeper 的一個或一系列的節(jié)點上,供訂閱者進行數(shù)據(jù)訂閱,達到動態(tài)獲取數(shù)據(jù)的目的。
配置信息一般有幾個特點:
數(shù)據(jù)量小的KV
數(shù)據(jù)內(nèi)容在運行時會發(fā)生動態(tài)變化
集群機器共享,配置一致
ZooKeeper 采用的是推拉結(jié)合的方式。
推:?服務端會推給注冊了監(jiān)控節(jié)點的客戶端?Wathcer?事件通知
拉:?客戶端獲得通知后,然后主動到服務端拉取最新的數(shù)據(jù)
二、命名服務
作為分布式命名服務,命名服務是指通過指定的名字來獲取資源或者服務的地址,利用ZooKeeper創(chuàng)建一個全局的路徑,這個路徑就可以作為一個名字,指向集群中的集群,提供的服務的地址,或者一個遠程的對象等等。
統(tǒng)一命名服務的命名結(jié)構(gòu)圖如下所示:

1、在分布式環(huán)境下,經(jīng)常需要對應用/服務進行統(tǒng)一命名,便于識別不同服務。
類似于域名與IP之間對應關(guān)系,IP不容易記住,而域名容易記住。
通過名稱來獲取資源或服務的地址,提供者等信息。
2、按照層次結(jié)構(gòu)組織服務/應用名稱。
可將服務名稱以及地址信息寫到ZooKeeper上,客戶端通過ZooKeeper獲取可用服務列表類。
三、配置管理
程序分布式的部署在不同的機器上,將程序的配置信息放在ZooKeeper的znode下,當有配置發(fā)生改變時,也就是znode發(fā)生變化時,可以通過改變zk中某個目錄節(jié)點的內(nèi)容,利用watch通知給各個客戶端 從而更改配置。
ZooKeeper配置管理結(jié)構(gòu)圖如下所示:

1、分布式環(huán)境下,配置文件管理和同步是一個常見問題。
一個集群中,所有節(jié)點的配置信息是一致的,比如 Hadoop 集群。
對配置文件修改后,希望能夠快速同步到各個節(jié)點上。
2、配置管理可交由ZooKeeper實現(xiàn)。
可將配置信息寫入ZooKeeper上的一個Znode。
各個節(jié)點監(jiān)聽這個Znode。
一旦Znode中的數(shù)據(jù)被修改,ZooKeeper將通知各個節(jié)點。
四、集群管理
所謂集群管理就是:是否有機器退出和加入、選舉master。集群管理主要指集群監(jiān)控和集群控制兩個方面。前者側(cè)重于集群運行時的狀態(tài)的收集,后者則是對集群進行操作與控制。
開發(fā)和運維中,面對集群,經(jīng)常有如下需求:
希望知道集群中究竟有多少機器在工作
對集群中的每臺機器的運行時狀態(tài)進行數(shù)據(jù)收集
對集群中機器進行上下線的操作
集群管理結(jié)構(gòu)圖如下所示:

1、分布式環(huán)境中,實時掌握每個節(jié)點的狀態(tài)是必要的,可根據(jù)節(jié)點實時狀態(tài)做出一些調(diào)整。
2、可交由ZooKeeper實現(xiàn)。
可將節(jié)點信息寫入ZooKeeper上的一個Znode。
監(jiān)聽這個Znode可獲取它的實時狀態(tài)變化。
3、典型應用
Hbase中Master狀態(tài)監(jiān)控與選舉。
利用ZooKeeper的強一致性,能夠保證在分布式高并發(fā)情況下節(jié)點創(chuàng)建的全局唯一性,即:同時有多個客戶端請求創(chuàng)建?/currentMaster?節(jié)點,最終一定只有一個客戶端請求能夠創(chuàng)建成功。
五、分布式通知與協(xié)調(diào)
分布式環(huán)境中,經(jīng)常存在一個服務需要知道它所管理的子服務的狀態(tài)。
a)NameNode需知道各個Datanode的狀態(tài)。
b)JobTracker需知道各個TaskTracker的狀態(tài)。
心跳檢測機制可通過ZooKeeper來實現(xiàn)。
信息推送可由ZooKeeper來實現(xiàn),ZooKeeper相當于一個發(fā)布/訂閱系統(tǒng)。
六、分布式鎖
處于不同節(jié)點上不同的服務,它們可能需要順序地訪問一些資源,這里需要一把分布式的鎖。
分布式鎖具有以下特性:寫鎖、讀鎖、時序鎖。
寫鎖:在zk上創(chuàng)建的一個臨時的無編號的節(jié)點。由于是無序編號,在創(chuàng)建時不會自動編號,導致只能客戶端有一個客戶端得到鎖,然后進行寫入。
讀鎖:在zk上創(chuàng)建一個臨時的有編號的節(jié)點,這樣即使下次有客戶端加入是同時創(chuàng)建相同的節(jié)點時,他也會自動編號,也可以獲得鎖對象,然后對其進行讀取。
時序鎖:在zk上創(chuàng)建的一個臨時的有編號的節(jié)點根據(jù)編號的大小控制鎖。
七、分布式隊列
分布式隊列分為兩種:
1、當一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達,這種是同步隊列。
a)一個job由多個task組成,只有所有任務完成后,job才運行完成。
b)可為job創(chuàng)建一個/job目錄,然后在該目錄下,為每個完成的task創(chuàng)建一個臨時的Znode,一旦臨時節(jié)點數(shù)目達到task總數(shù),則表明job運行完成。
2、隊列按照FIFO方式進行入隊和出隊操作,例如實現(xiàn)生產(chǎn)者和消費者模型。