基於 Zookeeper 的分散式鎖實現
連結:
1. 背景
最近在學習 Zookeeper,在剛開始接觸 Zookeeper 的時候,完全不知道 Zookeeper 有什麼用。且很多資料都是將 Zookeeper 描述成一個“類 Unix/Linux 檔案系統”的中介軟體,導致我很難將類 Unix/Linux 檔案系統的 Zookeeper 和分散式應用聯絡在一起。後來在粗讀了《ZooKeeper 分散式過程協同技術詳解》和《從Paxos到Zookeeper 分散式一致性原理與實踐》兩本書,並動手寫了一些 CURD demo 後,初步對 Zookeeper 有了一定的瞭解。不過比較膚淺,為了進一步加深對 Zookeeper 的認識,我利用空閒時間編寫了本篇文章對應的 demo – 基於 Zookeeper 的分散式鎖實現。透過編寫這個分散式鎖 demo,使我對 Zookeeper 的 watcher 機制、Zookeeper 的用途等有了更進一步的認識。不過我所編寫的分散式鎖還是比較簡陋的,實現的也不夠優美,僅僅是個練習,僅供參考使用。好了,題外話就說到這裡,接下來我們就來聊聊基於 Zookeeper 的分散式鎖實現。
2. 獨佔鎖和讀寫鎖的實現
在本章,我將分別說明獨佔鎖和讀寫鎖詳細的實現過程,並配以相應的流程圖幫助大家瞭解實現的過程。這裡先說說獨佔鎖的實現。
2.1 獨佔鎖的實現
獨佔鎖又稱排它鎖,從字面意思上很容易理解他們的用途。即如果某個操作 O1 對訪問資源 R1 的過程加鎖,在操作 O1 結束對資源 R1 訪問前,其他操作不允許訪問資源 R1。以上算是對獨佔鎖的簡單定義了,那麼這段定義在 Zookeeper 的“類 Unix/Linux 檔案系統”的結構中是怎樣實現的呢?在鎖答案前,我們先看張圖:
圖1 獨佔鎖的 Zookeeper 節點結構
如上圖,對於獨佔鎖,我們可以將資源 R1 看做是 lock 節點,操作 O1 訪問資源 R1 看做建立 lock 節點,釋放資源 R1 看做刪除 lock 節點。這樣我們就將獨佔鎖的定義對應於具體的 Zookeeper 節點結構,透過建立 lock 節點獲取鎖,刪除節點釋放鎖。詳細的過程如下:
多個客戶端競爭建立 lock 臨時節點 其中某個客戶端成功建立 lock 節點,其他客戶端對 lock 節點設定 watcher 持有鎖的客戶端刪除 lock 節點或該客戶端崩潰,由 Zookeeper 刪除 lock 節點 其他客戶端獲得 lock 節點被刪除的通知 重複上述4個步驟,直至無客戶端在等待獲取鎖了
2.2 讀寫鎖的實現
自己建立的節點序號排在所有其他子節點前面 自己建立的節點前面無寫鎖節點
讀寫鎖的第一種實現
所有客戶端建立自己的鎖節點 從 Zookeeper 端獲取 /share_lock 下所有的子節點,並對 /share_lock 節點設定 watcher 判斷自己建立的鎖節點是否可以獲取鎖,如果可以,持有鎖。 否則繼續等待
持有鎖的客戶端刪除自己的鎖節點,其他客戶端收到 /share_lock 子節點變動的通知 重複步驟2、3、4,直至無客戶端在等待獲取鎖了
讀寫鎖的第二種實現
所有客戶端建立自己的鎖節點 從 Zookeeper 端獲取 /share_lock 下所有的子節點 判斷自己建立的鎖節點是否可以獲取鎖,如果可以,持有鎖。 否則對自己關心的鎖節點設定 watcher
持有鎖的客戶端刪除自己的鎖節點,某個客戶端收到該節點被刪除的通知,並獲取鎖 重複步驟4,直至無客戶端在等待獲取鎖了
3. 寫在最後
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558358/viewspace-2669762/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於快取或zookeeper的分散式鎖實現快取分散式
- 基於redis和zookeeper的分散式鎖實現方式Redis分散式
- ZooKeeper分散式鎖的實現分散式
- 基於資料庫、redis和zookeeper實現的分散式鎖資料庫Redis分散式
- 分散式鎖之Zookeeper實現分散式
- 分散式鎖實現(二):Zookeeper分散式
- 6 zookeeper實現分散式鎖分散式
- 基於redis的分散式鎖實現Redis分散式
- zookeeper 分散式鎖的原理及實現分散式
- 基於redis實現分散式鎖Redis分散式
- 基於ZK實現分散式鎖分散式
- 基於zookeeper實現分散式配置中心(二)分散式
- 二十二、zookeeper實現分散式鎖分散式
- Zookeeper分散式鎖實現Curator十一問分散式
- 分散式鎖實現方案(REDIS,ZOOKEEPER,TAIR)分散式RedisAI
- 使用redis和zookeeper實現分散式鎖Redis分散式
- 【zookeeper】zookeeper分散式鎖分散式
- 基於 Redis 實現簡單的分散式鎖Redis分散式
- 跟著小白學zookeeper: 分散式鎖的實現分散式
- 分散式鎖與實現(一)基於Redis實現!分散式Redis
- 基於redis分散式鎖實現“秒殺”Redis分散式
- 基於Redis實現一個分散式鎖Redis分散式
- Redis、Zookeeper實現分散式鎖——原理與實踐Redis分散式
- 基於Redis的分散式鎖的簡單實現Redis分散式
- zookeeper分散式鎖分散式
- ZooKeeper 分散式鎖分散式
- 十九、Redis分散式鎖、Zookeeper分散式鎖Redis分散式
- java 實現開箱即用基於 redis 的分散式鎖JavaRedis分散式
- 面試必問:分散式鎖實現之zk(Zookeeper)面試分散式
- 關於分散式鎖原理的一些學習與思考-redis分散式鎖,zookeeper分散式鎖分散式Redis
- Zookeeper-分散式鎖分散式
- Zookeeper(5)---分散式鎖分散式
- zookeeper 分散式鎖解析分散式
- Golang 基於單節點 Redis 實現的分散式鎖GolangRedis分散式
- zookeeper分散式鎖,你用php是如何實現的呀分散式PHP
- 基於Redisson實現分散式鎖原始碼解讀Redis分散式原始碼
- 基於zookeeper的分散式配置中心(一)分散式
- 基於 Redis 的分散式鎖Redis分散式