在zookeeper應用場景有關於分布式集群配置檔案同步問題的描述,設想一下如果有100臺機器同時對同一臺機器上某個檔案進行修改,如何才能保證文字不會被寫亂,這就是最簡單的分布式鎖,本文介紹利用zk實現分布式鎖。下面是寫鎖的實現步驟
分布式寫鎖
create乙個persistent型別的znode,/locks/write_lock
1.客戶端建立sequence|ephemeral型別的znode,名字是lockid開頭,建立的znode是/locks/write_lock/lockid0000000001
2.呼叫getchildren()不要設定watcher獲取/locks/write_lock下的znode列表
3.判斷自己步驟2建立znode是不是znode列表中最小的乙個,如果是就代表獲得了鎖,如果不是往下走
4.呼叫exists()判斷步驟2自己建立的節點編號小1的znode節點(也就是獲取的znode節點列表中最小的znode),並且設定watcher,如果exists()返回false,執行步驟3
5.果exists()返回true,那麼等待zk通知,從而在回掉函式裡返回執行步驟3
如果首先介紹一下,zookeeper中有一種節點叫做順序節點,故名思議,假如我們在/lock/目錄下建立節3個點,zookeeper集群會按照提起建立的順序來建立節點,節點分別為/lock/0000000001、/lock/0000000002、/lock/0000000003。
zookeeper中還有一種名為臨時節點的節點,臨時節點由某個客戶端建立,當客戶端與zookeeper集群斷開連線,則開節點自動被刪除。
利用上面這兩個特性,我們來看下獲取實現分布式鎖的基本邏輯:
客戶端呼叫create()方法建立名為「locknode/guid-lock-」的節點,需要注意的是,這裡節點的建立型別需要設定為ephemeral_sequential。(臨時有序節點)
客戶端呼叫getchildren(「locknode」)方法來獲取所有已經建立的子節點,同時在這個節點上註冊上子節點變更通知的watcher。
客戶端獲取到所有子節點path之後,如果發現自己在步驟1中建立的節點是所有節點中序號最小的,那麼就認為這個客戶端獲得了鎖。
如果在步驟3中發現自己並非是所有子節點中最小的,說明自己還沒有獲取到鎖,就開始等待,直到下次子節點變更通知的時候,再進行子節點的獲取,判斷是否獲取鎖。
釋放鎖的過程相對比較簡單,就是刪除自己建立的那個子節點即可。exists()返回true,那麼等待zk通知,從而在回掉函式裡返回執行步驟3
釋放鎖就是刪除znode節點或者斷開連線就行
*注意:上面步驟2中getchildren()不設定watcher的原因是,防止羊群效應,如果getchildren()設定了watcher,那麼集群一抖動都會收到通知。在整個分布式鎖的競爭過程中,大量重複執行,並且絕大多數的執行結果都是判斷出自己並非是序號最小的節點,從而繼續等待下一次通知—,這個顯然看起來不怎麼科學。客戶端無端的接受到過多的和自己不相關的事件通知,這如果在集群規模大的時候,會對server造成很大的效能影響,並且如果一旦同一時間有多個節點的客戶端斷開連線,這個時候,伺服器就會像其餘客戶端傳送大量的事件通知——這就是所謂的羊群效應。
下面是**實現
watcher 觸發條件:
客戶端是通過 getdata、 getchildren 和 exist 三個介面來向 zookeeper 伺服器註冊 watcher,且需要多次註冊
增、刪、改 ( 重複修改也會觸發,因為他只告訴你變更了,不告訴你變更多少,需要 客戶端 自己去拿)
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實現分布式鎖之前,首先看當前的系統架構圖 解釋 左邊的整個區域表示乙個zookeeper集群,locker是zookeeper的乙個持久...