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í)踐》.作者:倪超