zookeeper 與redis 分布式鎖對比
zookeeper的資料模型類似於資料結構中的樹
,也很像檔案系統
。
zookeeper的資料模型基於節點,稱為znode。不同於樹的節點的是,znode的引用方式通過路徑
引用,類似於檔案系統。資料都儲存在記憶體中。
znode分為四種型別:
所謂順序節點,就是在建立節點時,zookeeper 根據建立的時間順序給該節點名稱進行編號。
zookeeper 分布式鎖是利用臨時順序節點
實現的。
首先建立乙個持久節點,作為鎖的父節點(lockparent)。當有客戶端需要獲取鎖時,在父節點下新增臨時順序節點
。
示意圖如下:
之後,客戶端查詢 lockparent 下面所有的臨時順序節點並排序,判斷自己所建立的節點 lock1 是不是編號最小的乙個。如果是,則成功獲得鎖。
這時,如果再有乙個客戶端2 來獲取鎖,則在 lockparent下再建立乙個臨時順序節點 lock2。同樣對 lockparent 下面所有的臨時順序節點排序,發現 lock2 不是編號最小的節點,於是客戶端2向排序在它前乙個節點
lock1 註冊 watcher,用於監聽 lock1 節點是否存在。這意味著客戶端2獲取鎖失敗,進入了等待狀態。
釋放鎖分為兩種情況:
操作完成,顯示釋放
當客戶端完成資料的操作後,顯示刪除自己建立的臨時節點。
例如:客戶端完成資料操作,顯示刪除lock1。此時,由於客戶端2對 lock1 註冊了 watcher ,那麼客戶端2就會收到 lock1 節點刪除的事件通知,然後客戶端2查詢 lockparent 下面所有的臨時順序節點並排序,判斷自己所建立的節點 lock2 是不是編號最小的乙個。如果是,則成功獲得鎖。如果不是,則向排序在它前乙個節點
註冊 watcher 。
宕機當客戶端運算元據中途宕機了,那麼就會斷開與 zookeeper 伺服器的連線,那麼根據臨時順序節點的特性,節點會被自動刪除。之後的操作就同顯示刪除一樣了。
分布式鎖實現
優點缺點
zookeeper
1. 有封裝好的框架,容易實現
2. 有等待鎖的佇列,提公升獲取鎖效率
新增、刪除臨時節點效率低
redis
set和del執行執行效率高
1. 實現複雜,需要考慮原子性、超時、誤刪等情況
2. 沒有等待鎖的佇列,需要客戶端自旋獲取鎖,效率低
注:等待鎖的佇列是指 lockparent 下的臨時節點按照編號排序形成的列表,總是編號小(先建立)的先刪除,類似佇列fifo特性。
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的乙個持久...