Zookeeper實現分佈式鎖

zookeeper分佈式鎖原理

一、分佈式鎖介紹
分佈式鎖主要用於在分佈式環境中保護跨進程、跨主機、跨網絡的共享資源實現互斥訪問,以達到保證數據的一致性。

二、架構介紹
在介紹使用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獲取到了鎖!

複製自https://www.cnblogs.com/linjiqin/p/6052031.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章