首頁技術(shù)文章正文

zookeeper怎樣實現(xiàn)分布鎖?Zookeeper分布式鎖機制

更新時間:2023-09-25 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

zookeeper是CP架構(gòu)的集群,采用 zab 一致性協(xié)議確保數(shù)據(jù)的強一致。對zookeeper中的數(shù)據(jù)進行修改,其內(nèi)部會自動將所有節(jié)點數(shù)據(jù)進行修改后才提供查詢服務(wù),不會出現(xiàn)redis那種異步同步導(dǎo)致數(shù)據(jù)丟失的問題。

zookeeper 數(shù)據(jù)是目錄樹的形式,每個目錄稱為znode,znode中可存儲數(shù)據(jù)(一般不超過 1M),還可以在其中增加子節(jié)點。

zookeeper中的節(jié)點有兩種,分別為臨時節(jié)點和永久節(jié)點。

(1)永久節(jié)點: 客戶端與zookeeper斷開連接后,該節(jié)點依舊存在。

(2)臨時節(jié)點: 客戶端與zookeeper斷開連接后,該節(jié)點會被刪除。臨時節(jié)點下不能創(chuàng)建子節(jié)點。

SEQUENTIAL屬性: ZooKeeper允許用戶為每個節(jié)點添加一個特殊的屬性:SEQUENTIAL,一旦節(jié)點被標記上這個屬性,那么在這個節(jié)點被創(chuàng)建的時候,ZooKeeper 會自動在其節(jié)點名后面追加上一個整型數(shù)字,這個整型數(shù)字是一個由父節(jié)點維護的自增數(shù)字。

Zookeeper分布式鎖機制

依賴于zk節(jié)點路徑唯一的機制來實現(xiàn)的(利用zk同一目錄下不能創(chuàng)建多個相同名稱的節(jié)點這個特性,來實現(xiàn)分布式鎖的功能。對于同一個路徑,只能有一個客戶端能創(chuàng)建成功,其它的都創(chuàng)建失敗)。

分布式鎖機制

簡易版zookeeper鎖

節(jié)點唯一性:對于同一個路徑,只能有一個客戶端能創(chuàng)建成功,其它的都創(chuàng)建失敗。

創(chuàng)建臨時節(jié)點:客戶端與zookeeper斷開連接后,該節(jié)點會被刪除,不必設(shè)置鎖超時時間。

基于臨時節(jié)點的zk鎖(請求排隊)

基于臨時節(jié)點實現(xiàn),會產(chǎn)生驚群效應(yīng),性能稍差。

簡易版zookeeper鎖

基于臨時順序節(jié)點的zk鎖(請求排隊)

臨時順序節(jié)點的zk鎖
釋放鎖

用curator實現(xiàn)zk鎖

Curator是Netflix公司開源的?套zookeeper客戶端框架,封裝了大部分Zookeeper的功能,例如Leader選舉、分布式鎖等,減少了技術(shù)人員在使用Zookeeper時的底層細節(jié)開發(fā)工作。

Curator中封裝了以下幾種鎖:

InterProcessMutex:分布式可重入排它鎖
InterProcessSemaphoreMutex:分布式不可重入排它鎖
InterProcessReadWriteLock:分布式讀寫鎖
InterProcessMultiLock:多重共享鎖,將多個鎖作為單個實體管理的容器
InterProcessSemaphoreV2:共享信號量

實際開發(fā)中,可以直接使用 Curator客戶端中的各種官方實現(xiàn)的分布式鎖,沒必要重復(fù)造輪子。


分享到:
在線咨詢 我要報名
和我們在線交談!