更新時間:2023-09-25 來源:黑馬程序員 瀏覽量:
zookeeper是CP架構(gòu)的集群,采用 zab 一致性協(xié)議確保數(shù)據(jù)的強(qiáng)一致。對zookeeper中的數(shù)據(jù)進(jìn)行修改,其內(nèi)部會自動將所有節(jié)點(diǎn)數(shù)據(jù)進(jìn)行修改后才提供查詢服務(wù),不會出現(xiàn)redis那種異步同步導(dǎo)致數(shù)據(jù)丟失的問題。
zookeeper 數(shù)據(jù)是目錄樹的形式,每個目錄稱為znode,znode中可存儲數(shù)據(jù)(一般不超過 1M),還可以在其中增加子節(jié)點(diǎn)。
zookeeper中的節(jié)點(diǎn)有兩種,分別為臨時節(jié)點(diǎn)和永久節(jié)點(diǎn)。
(1)永久節(jié)點(diǎn): 客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在。
(2)臨時節(jié)點(diǎn): 客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)會被刪除。臨時節(jié)點(diǎn)下不能創(chuàng)建子節(jié)點(diǎn)。
SEQUENTIAL屬性: ZooKeeper允許用戶為每個節(jié)點(diǎn)添加一個特殊的屬性:SEQUENTIAL,一旦節(jié)點(diǎn)被標(biāo)記上這個屬性,那么在這個節(jié)點(diǎn)被創(chuàng)建的時候,ZooKeeper 會自動在其節(jié)點(diǎn)名后面追加上一個整型數(shù)字,這個整型數(shù)字是一個由父節(jié)點(diǎn)維護(hù)的自增數(shù)字。
依賴于zk節(jié)點(diǎn)路徑唯一的機(jī)制來實(shí)現(xiàn)的(利用zk同一目錄下不能創(chuàng)建多個相同名稱的節(jié)點(diǎn)這個特性,來實(shí)現(xiàn)分布式鎖的功能。對于同一個路徑,只能有一個客戶端能創(chuàng)建成功,其它的都創(chuàng)建失敗)。
節(jié)點(diǎn)唯一性:對于同一個路徑,只能有一個客戶端能創(chuàng)建成功,其它的都創(chuàng)建失敗。
創(chuàng)建臨時節(jié)點(diǎn):客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)會被刪除,不必設(shè)置鎖超時時間。
基于臨時節(jié)點(diǎn)的zk鎖(請求排隊(duì))
基于臨時節(jié)點(diǎn)實(shí)現(xiàn),會產(chǎn)生驚群效應(yīng),性能稍差。
基于臨時順序節(jié)點(diǎn)的zk鎖(請求排隊(duì))
Curator是Netflix公司開源的?套zookeeper客戶端框架,封裝了大部分Zookeeper的功能,例如Leader選舉、分布式鎖等,減少了技術(shù)人員在使用Zookeeper時的底層細(xì)節(jié)開發(fā)工作。
Curator中封裝了以下幾種鎖:
InterProcessMutex:分布式可重入排它鎖 InterProcessSemaphoreMutex:分布式不可重入排它鎖 InterProcessReadWriteLock:分布式讀寫鎖 InterProcessMultiLock:多重共享鎖,將多個鎖作為單個實(shí)體管理的容器 InterProcessSemaphoreV2:共享信號量
實(shí)際開發(fā)中,可以直接使用 Curator客戶端中的各種官方實(shí)現(xiàn)的分布式鎖,沒必要重復(fù)造輪子。