zookeeper分布式操作的實現(3)

2021-10-05 11:08:29 字數 1527 閱讀 5555

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

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

分布式5 zookeeper分布式

一 為什麼需要zookeeper 大部分分布式應用需要乙個主控 協調器或控制器來管理物理分布的子程序 如資源 任務分配等 大部分應用需要開發私有的協調程式,缺乏乙個通用的機制 協調程式的反覆編寫浪費,且難以形成通用 伸縮性好的協調器 zookeeper可以提供通用的分布式鎖服務,用以協調分布式應用,...

zookeeper分布式鎖

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

zookeeper偽分布式

wget解壓 tar zxvf zookeeper 3.4.5 cdh5.9.3.tar.gz c opt 進入 opt 目錄修改檔名 mv zookeeper 3.4.5 cdh5.9.3 zookeeper01進入 opt zookeeper01 conf目錄設定配置檔案 cp zoo samp...