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