zk實現分布式鎖

2021-08-11 11:02:06 字數 1618 閱讀 4566

前言:2016春節之後一直比較忙,因此部落格n個沒有更新,現在也是忙裡偷閒,偷偷的更新一篇!

一、分布式鎖介紹

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

二、架構介紹

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

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

三、分布式鎖獲取思路 1.

獲取分布式鎖的總體思路

在獲取分布式鎖的時候在locker節點下建立臨時順序節點,釋放鎖的時候刪除該臨時節點。客戶端呼叫createnode方法在locker下建立臨時順序節點,

然後呼叫getchildren(「locker」)來獲取locker下面的所有子節點,注意此時不用設定任何watcher。客戶端獲取到所有的子節點path之後,如果發現自己在之

前建立的子節點序號最小,那麼就認為該客戶端獲取到了鎖。如果發現自己建立的節點並非locker所有子節點中最小的,說明自己還沒有獲取到鎖,

此時客戶端需要找到比自己小的那個節點,然後對其呼叫exist()方法,同時對其註冊事件***。之後,讓這個被關注的節點刪除,則客戶端的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的分布式鎖的**實現

參考:**實現:github

ZK分布式鎖

分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。如果不同的系統或者是同乙個系統的不同主機之間共享了乙個或者一組資源,那麼訪問這些資源的時候,往往需要一些互斥手段來防止彼此之間的干擾,以保證一致性,在這種情況下,就需要分布式鎖了 zookeeper中有一種節點叫做順序節點,假如我們在 lock...

zk分布式鎖

zk 分布式鎖,其實可以做的比較簡單,就是某個節點嘗試建立臨時 znode,此時建立成功了就獲取了這個鎖 這個時候別的客戶端來建立鎖會失敗,只能註冊個 監聽這個鎖。釋放鎖就是刪除這個 znode,一旦釋放掉就會通知客戶端,然後有乙個等待著的客戶端就可以再次重新加鎖。zookeepersession ...

redis與zk實現分布式鎖

概述 那麼這個時候,如果你需要加個鎖,讓多個分布式的機器在訪問共享資源的時候序列起來 那麼這個時候,那個鎖,多個不同機器上的服務共享的鎖,就是分布式鎖 分布式鎖當然有很多種不同的實現方案,redis分布式鎖,zookeeper分布式鎖對比 資料庫鎖 優點 直接使用資料庫,使用簡單。缺點 分布式系統大...