Zookeeper實現分布式鎖

2021-08-28 20:31:38 字數 1591 閱讀 4643

一、分布式鎖介紹

分布式鎖主要用於在分布式環境中保護跨程序、跨主機、跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。

二、架構介紹

在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖

解釋:左邊的整個區域表示乙個zookeeper集群,locker是zookeeper的乙個持久節點,node_1、node_2、node_3是locker這個持久節點下面的臨時順序節點。client_1、client_2、client_n表示多個客戶端,service表示需要互斥訪問的共享資源

三、分布式鎖獲取思路

1.獲取分布式鎖的總體思路

a、在獲取分布式鎖的時候在locker節點下建立臨時順序節點,釋放鎖的時候刪除該臨時節點。

b、客戶端呼叫createnode方法在locker下建立臨時順序節點,然後呼叫getchildren(「locker」)來獲取locker下面的所有子節點,注意此時不用設定任何watcher。

c、客戶端獲取到所有的子節點path之後,如果發現自己建立的子節點序號最小,那麼就認為該客戶端獲取到了鎖。

d、如果發現自己建立的節點並非locker所有子節點中最小的,說明自己還沒有獲取到鎖,此時客戶端需要找到比自己小的那個節點,然後對其呼叫exist()方法,同時對其註冊事件***。

e、之後,讓這個被關注的節點刪除,則客戶端的watcher會收到相應通知,此時再次判斷自己建立的節點是否是locker子節點中序號最小的,如果是則獲取到了鎖,如果不是則重複以上步驟繼續獲取到比自己小的乙個節點並註冊監聽。

2.獲取分布式鎖的核心演算法流程

下面同個乙個流程圖來分析獲取分布式鎖的完整演算法,如下:

解釋:客戶端a要獲取分布式鎖的時候首先到locker下建立乙個臨時順序節點(node_n),然後立即獲取locker下的所有(一級)子節點。

此時因為會有多個客戶端同一時間爭取鎖,因此locker下的子節點數量就會大於1。對於順序節點,特點是節點名稱後面自動有乙個數字編號,

先建立的節點數字編號小於後建立的,因此可以將子節點按照節點名稱字尾的數字順序從小到大排序,這樣排在第一位的就是最先建立的順序節點,

此時它就代表了最先爭取到鎖的客戶端!

此時判斷最小的這個節點是否為客戶端a之前建立出來的node_n,如果是則表示客戶端a獲取到了鎖,

如果不是則表示鎖已經被其它客戶端獲取,因此客戶端a要等待它釋放鎖,也就是等待獲取到鎖的那個客戶端b把自己建立的那個節點刪除。

此時就通過監聽比node_n次小的那個順序節點的刪除事件來知道客戶端b是否已經釋放了鎖,如果是,此時客戶端a再次獲取locker下的所有子節點,

再次與自己建立的node_n節點對比,直到自己建立的node_n是locker的所有子節點中順序號最小的,此時表示客戶端a獲取到了鎖!

複製自

Zookeeper實現分布式鎖

zookeeper實現分布式鎖 實現分布式環境下同步鎖的實現 author hao.wang date 2017 1 20 15 43 public class distributelockdemo implements watcher catch ioexception e catch inter...

Zookeeper實現分布式鎖

curatorframework提供的方法 方法名描述 create 開始建立操作,可以呼叫額外的方法 比如方式mode 或者後台執行background 並在最後呼叫forpath 指定要操作的znode delete 開始刪除操作.可以呼叫額外的方法 版本或者後台處理version or bac...

Zookeeper實現分布式鎖

zookeeper分布式鎖 1 分布式鎖 分布式鎖在一組程序之間提供互斥機制,任何時刻只有乙個程序可以持有鎖,持有鎖的程序就是系統的 領導者 分布式鎖分為兩種 獨佔鎖和共享鎖 獨佔鎖 所有嘗試獲取鎖的客戶端,最終只有乙個可以成功獲得鎖 共享鎖 所有嘗試獲取鎖的客戶度,最終都會被執行,只是有個全域性時...