Zookeeper主要用在分布式應(yīng)用中實(shí)現(xiàn)一致性協(xié)調(diào)調(diào)度服務(wù)。它的命名空間類似傳統(tǒng)文件系統(tǒng),每個(gè)節(jié)點(diǎn)都以唯一的路徑進(jìn)行標(biāo)識(shí),不同的是,每個(gè)節(jié)點(diǎn)除了可以擁有子節(jié)點(diǎn)外,還可擁有相對(duì)性的data數(shù)據(jù)。

一、Zookeeper命名空間

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

上圖是一個(gè)典型的Zookeeper命名空間結(jié)構(gòu),通過(guò)路徑"/app1/p_1"可訪問(wèn)znode1節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可存儲(chǔ)少量數(shù)據(jù),如狀態(tài)、配置、位置信息等等,且data信息量很小,一般在byte到KB級(jí)別。節(jié)點(diǎn)znode維護(hù)一個(gè)狀態(tài)stat結(jié)構(gòu)(包括數(shù)據(jù)變化的版本號(hào)、ACL變化、時(shí)間戳),以允許緩存驗(yàn)證與協(xié)調(diào)更新。每當(dāng)節(jié)點(diǎn)數(shù)據(jù)內(nèi)容改變時(shí),多一個(gè)版本號(hào),類似HBase??蛻舳双@取數(shù)據(jù)的同時(shí)也獲取相對(duì)應(yīng)的版本號(hào)。節(jié)點(diǎn)數(shù)據(jù)內(nèi)容以原子方式讀寫,讀操作會(huì)讀取該znode的全部data數(shù)據(jù),同樣寫操作也會(huì)覆蓋該znode的全部data數(shù)據(jù),不存在部分讀寫的情況。同時(shí),每個(gè)節(jié)點(diǎn)有一個(gè)訪問(wèn)控制列表ACL(Access Control List)來(lái)約束訪問(wèn)操作,即具有權(quán)限控制。

znode存在兩種:

常規(guī)的znode: 由用戶顯式創(chuàng)建和刪除

ephemeral znode:臨時(shí)型znode, 其生命周期伴隨于創(chuàng)建它的session, session結(jié)束后,ZooKeeper Server會(huì)自動(dòng)刪除它,當(dāng)然用戶也可以顯式的刪除

 

二、Zookeeper的Watches

Zookeeper對(duì)Node的增刪改查都可觸發(fā)監(jiān)聽(tīng),每個(gè)client可對(duì)一個(gè)znode設(shè)置一個(gè)watch事件。當(dāng)watch監(jiān)視的數(shù)據(jù)發(fā)生變化時(shí),會(huì)通知設(shè)置了該watch的client,即watcher。watch事件是一次性觸發(fā)器,即觸發(fā)一次就會(huì)被取消,該client如果還要監(jiān)視該znode的變化,需要再次設(shè)置相應(yīng)的watch事件。

注:

watch事件異步發(fā)送至觀察者,可能導(dǎo)致當(dāng)兩次觸發(fā)時(shí)間間隔太短的時(shí)候,不同的接收者收到的事件不一致

watch是一次性觸發(fā)的且在獲取watch事件和設(shè)置watch事件之間有延遲,所以不能可靠的觀察到節(jié)點(diǎn)的每一次變化

客戶端監(jiān)視一個(gè)節(jié)點(diǎn),總是先獲取watch事件,再發(fā)現(xiàn)節(jié)點(diǎn)的數(shù)據(jù)變化。
watch事件的順序?qū)?yīng)于zookeeper服務(wù)所見(jiàn)的數(shù)據(jù)更新順序

 

三、Zookeeper讀寫流程

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

讀請(qǐng)求到來(lái)時(shí),將直接從replicated database獲取數(shù)據(jù),replicated database是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),因此讀寫效率高

寫請(qǐng)求到來(lái)時(shí),所有的寫請(qǐng)求都會(huì)先發(fā)送給一個(gè)稱之為leader的server,然后由該leader廣播給各個(gè)follower(server),在收到超過(guò)一半的server反饋的ack之后,認(rèn)為此次寫操作成功。同時(shí),再寫操作更新到內(nèi)存數(shù)據(jù)庫(kù)之前,會(huì)先持久化到磁盤,用于恢復(fù)。如下圖所示:

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

 

四、在dubbo中的應(yīng)用

在分布式系統(tǒng)中,通過(guò)使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來(lái)獲取資源或服務(wù)的地址,提供者等信息。被命名的實(shí)體通??梢允羌褐械臋C(jī)器,提供的服務(wù)地址,遠(yuǎn)程對(duì)象等等——這些我們都可以統(tǒng)稱他們?yōu)槊郑∟ame)。其中較為常見(jiàn)的就是一些分布式服務(wù)框架中的服務(wù)地址列表。通過(guò)調(diào)用ZK提供的創(chuàng)建節(jié)點(diǎn)的API,能夠很容易創(chuàng)建一個(gè)全局唯一的path,這個(gè)path就可以作為一個(gè)名稱。比如dubbo應(yīng)用中:

服務(wù)提供者在啟動(dòng)的時(shí)候,向ZK上的指定節(jié)點(diǎn)/dubbo/${serviceName}/providers目錄下寫入自己的URL地址,這個(gè)操作就完成了服務(wù)的發(fā)布。

服務(wù)消費(fèi)者啟動(dòng)的時(shí)候,訂閱/dubbo/serviceName/providersURL,/dubbo/{serviceName} /consumers目錄下寫入自己的URL地址。

注意,所有向ZK上注冊(cè)的地址都是臨時(shí)節(jié)點(diǎn),這樣就能夠保證服務(wù)提供者和消費(fèi)者能夠自動(dòng)感應(yīng)資源的變化。

另外,Dubbo還有針對(duì)服務(wù)粒度的監(jiān)控,方法是訂閱/dubbo/${serviceName}目錄下所有提供者和消費(fèi)者的信息。

ww.cnblogs.com/java-wgm/p/7150509.html