ZooKeeper 常用應(yīng)用場(chǎng)景原理詳解

zookepper存放數(shù)據(jù)的目錄結(jié)構(gòu)類(lèi)似于標(biāo)準(zhǔn)的文件系統(tǒng)格式,如果使用過(guò)window或linux就能體會(huì)到其內(nèi)部的數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)化結(jié)果如下:

主要基本概念

1.每個(gè)目錄都被稱(chēng)為znode,如唯一標(biāo)識(shí)分別為為“/org”,"/com/lance" 和 “/com/lance/zk”。

2.每個(gè)znode可以存儲(chǔ)數(shù)據(jù),

3.znode的類(lèi)型

a. PERSISTENT

// 該znode不會(huì)在client斷開(kāi)時(shí)被zookepper自動(dòng)刪除,除非client端主動(dòng)刪除

b. PERSISTENT_SEQUENTIAL

// 該znode不會(huì)在client斷開(kāi)時(shí)被zookepper自動(dòng)刪除,除非client端主動(dòng)刪除,

// 且znode的名字后綴會(huì)添加上單調(diào)遞增的數(shù)字,實(shí)現(xiàn)自動(dòng)編號(hào)

c. EPHEMERAL

// 該znode會(huì)在client斷開(kāi)時(shí)被zookepper自動(dòng)刪除

d. EPHEMERAL_SEQUENTIAL

// 該znode會(huì)在client斷開(kāi)時(shí)被zookepper自動(dòng)刪除,

// 且znode的名字后綴會(huì)添加上單調(diào)遞增的數(shù)字,實(shí)現(xiàn)自動(dòng)編號(hào)

4.EPHEMERAL節(jié)點(diǎn)不能有子節(jié)點(diǎn)目錄

5.znode有版本概念

6.znode可以被client監(jiān)控,當(dāng)該節(jié)點(diǎn)發(fā)生變化時(shí),zookepper將向client發(fā)送通知(但不會(huì)把修改后的數(shù)據(jù)發(fā)給client,client要想獲取修改后的數(shù)據(jù),必須重新讀取該目錄下的數(shù)據(jù))

7. Watcher接口,Client向Zookepper注冊(cè)某個(gè)znode節(jié)點(diǎn)的監(jiān)控,并傳入Watcher的實(shí)現(xiàn)類(lèi)(如class WatcherImpl implments Watcher),當(dāng)該znode節(jié)點(diǎn)發(fā)生變更時(shí),Zookepper就會(huì)通過(guò)回調(diào)執(zhí)行WatcherImpl.process()方法,以進(jìn)行下一步的操作。

1. 數(shù)據(jù)訂閱/發(fā)布

使用Zookepper的訂閱/場(chǎng)景可以實(shí)現(xiàn)配置中心,即數(shù)據(jù)發(fā)布/訂閱系統(tǒng)

例如,項(xiàng)目的配置數(shù)據(jù)放在了/com/lance/zk目錄下,n臺(tái)機(jī)器實(shí)現(xiàn)對(duì)/com/lance/zk目錄的監(jiān)控,即注冊(cè)一個(gè)Watcher監(jiān)控(implments Watcher),當(dāng)/com/lance/zk節(jié)點(diǎn)發(fā)生數(shù)據(jù)變更時(shí),n臺(tái)機(jī)器將獲得變更通知,從而n臺(tái)機(jī)器重新獲取/com/lance/zk目錄下的數(shù)據(jù)。

2. 心跳檢測(cè)

在分布式系統(tǒng)中,各機(jī)器之間需要知道其他機(jī)器是否運(yùn)行正常,最原始的方法是通過(guò)固定時(shí)間間隔的PING或建立長(zhǎng)連接的方式檢測(cè)心跳。如果基于Zookepper的話,在Zookeeper指定目錄下每臺(tái)機(jī)器都創(chuàng)建EPHEMERAL臨時(shí)子節(jié)點(diǎn),這樣不同的機(jī)器就根據(jù)這些臨時(shí)子節(jié)點(diǎn)判斷其他機(jī)器是否正常,這樣各機(jī)器之間不再直接耦合關(guān)聯(lián)。

3. 負(fù)載均衡

假如我們?cè)?com/lance/zk為域名節(jié)點(diǎn),3個(gè)provider將自己的機(jī)器IP和端口號(hào)192.168.0.1:8001、192.168.0.2:8001、192.168.0.3:8001都注冊(cè)到/com/lance/zk節(jié)點(diǎn),當(dāng)有一個(gè)consumer向zookepper獲取/com/lance/zk目錄下的IP列表,通過(guò)hash,輪詢(xún)或隨機(jī)方式獲取其中一個(gè)IP,然后調(diào)用。

心跳檢測(cè):client使用固定時(shí)間間隔,如3秒,向zookepper發(fā)送服務(wù)其狀態(tài)是否正常信息,一旦超過(guò)3秒沒(méi)有沒(méi)有收到狀態(tài)信息,那么就認(rèn)為該IP不可用,于是該IP就會(huì)被清理。

典型的實(shí)現(xiàn)例子:alibaba的dubbo服務(wù)

4.全局唯一ID生成服務(wù)

每一個(gè)client根據(jù)自己的屬性,如機(jī)器IP:172.17.110.2,通過(guò)create()接口創(chuàng)建EPHEMERAL_SEQUENTIAL 類(lèi)型的znode,zookepper返回“172.17.110.2-00000000011”,client拿到返回值后,再添加具體的服務(wù)類(lèi)型,如:createData,則就獲取了全局唯一ID:createData-172.17.110.2-00000000011。

5. 任務(wù)進(jìn)度匯總

各服務(wù)機(jī)器將自己的任務(wù)進(jìn)行進(jìn)度寫(xiě)入到Zookepper的指定臨時(shí)節(jié)點(diǎn)中,這樣系統(tǒng)中心和各臺(tái)機(jī)器都能夠獲取其他任務(wù)的進(jìn)度。

6. 集群管理

集群管理中心在Zookepper的/com/lance/clusters節(jié)點(diǎn)上添加一個(gè)Watcher監(jiān)聽(tīng),所有被管理的機(jī)器都在/com/lance/clusters創(chuàng)建臨時(shí)子節(jié)點(diǎn),如/com/lance/clusters/hostName,被管理的機(jī)器需要在指定時(shí)間間隔,如3秒,內(nèi)向/com/lance/clusters/hostName發(fā)起會(huì)話,如果超時(shí)這個(gè)時(shí)間間隔沒(méi)有發(fā)起會(huì)話,者Zookepper認(rèn)為該機(jī)器已經(jīng)宕機(jī),就會(huì)刪除/com/lance/clusters/hostName這個(gè)臨時(shí)子節(jié)點(diǎn),這樣管理中心就能夠檢測(cè)到每臺(tái)機(jī)器的運(yùn)行情況了。

參考資料:

1.《從PAXOS到ZOOKEEPER分布式一致性原理與實(shí)踐》.作者:倪超

2.分布式服務(wù)框架 Zookeeper -- 管理分布式環(huán)境中的數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容