zookeeper分布式鎖原理

2021-09-01 15:04:24 字數 1611 閱讀 8398

一、分布式鎖介紹

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

二、架構介紹

在介紹使用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分布式鎖原理

一 分布式鎖介紹 分布式鎖主要用於在分布式環境中保護跨程序 跨主機 跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。二 架構介紹 在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖 解釋 左邊的整個區域表示乙個zookeeper集群,locker是zookeeper的乙個持久...

Zookeeper分布式鎖原理

關於分布式鎖,在網際網路行業的使用場景還是比較多的,比如電商的庫存扣減,秒殺活動,集群定時任務執行等需要程序互斥的場景。而實現分布式鎖的手段也很多,大家比較常見的就是redis跟zookeeper,今天我們主要介紹的是基於zookeeper實現的分布式鎖。這篇文章主要借用curator框架對zk分布...

zookeeper分布式鎖

方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...