zookeeper 分散式鎖的原理及實現
zookeeper 分散式鎖的原理及實現
本文的分散式鎖原理介紹部分參考了 七張圖徹底講清楚ZooKeeper分散式鎖的實現原理 ,原文已經介紹的非常詳細有趣。我在原文的基礎上,補充實現了實驗部分,算作我的學習筆記,以備後用。
向原作者表示感謝。
zookeeper 分散式鎖原理
為了防止分散式系統中的多個程式之間相互干擾,我們需要一種分散式協調技術來對這些程式進行排程。而這個分散式協調技術的核心就是分散式鎖。
利用 zookeeper 的順序臨時節點,可以很方便地實現分散式鎖和等待佇列。畢竟 zookeeper 設計的初衷,就是為了實現分散式鎖服務的。
如果有客戶端 A 和客戶端 B 爭搶一把分散式鎖,會是一番怎樣的景象?
兩個客戶端的加鎖請求總有個先來後到吧,我們不妨假設客戶端 A 的請求先到達。
zookeeper 接到請求後,會首先建立相應的鎖節點 dir(例如 /zklock),然後在此目錄下為客戶端 A 建立一個 臨時順序節點 ,臨時順序節點是 zookeeper 的 4 種節點型別之一,大概長這樣:
其命名格式一般遵循如下規範: x - { session id } - { 自動遞增編號 }
因為客戶端 A 的請求是第一個到達的,所以分配給 A 的自動遞增編號是一串 0,在此之後的請求,編號會順序遞增。
建立臨時順序節點不等於將鎖分配給了客戶端 A。判別能否獲得鎖的辦法是 客戶端的節點編號是否在 /zklock 路徑下的節點編號佇列中排在隊首 ,因為目前只有客戶端 A 發起了加鎖請求,A 順利獲得鎖。
此時客戶端 B 的加鎖請求到達,zookeeper 同樣會在 /zklock 路徑下為它建立一個臨時順序節點。
由於客戶端 A 的鎖尚未釋放,所以此時 /zklock 路徑下會存在兩個臨時順序節點:
然後客戶端 B 判斷是否可以加鎖,此時發現自己的順序節點並不在隊首,加鎖失敗了。
那就耐心等待吧,等到什麼時候呢,等到排在我前面的那個節點釋放鎖唄。
為了在第一時間獲悉 A 節點的變化情況,B 向 A 節點新增了監聽器。
A 在一頓操作之後,釋放了鎖,同時刪除了自己的臨時順序節點。
這一訊息在第一時間通過監聽器通知到了客戶端 B:你監聽的那個節點已經刪除了,有人釋放了鎖。
於是客戶端 B 再次判斷自己是否滿足加鎖條件:
自己的編號是 01,排在 /zklock 路徑下順序節點佇列隊首,加鎖成功!
zookeeper 分散式鎖實現
我們嘗試基於 zookeeper 實現分散式鎖,實現兩個客戶端 Runner-1 和 Runner-2 的協同工作。以鞏固上述知識點。
效果如下圖,Runner-1 和 Runner-2 會競爭同一個分散式鎖,獲得鎖之後完成各自的工作。
Runner-1 執行完畢釋放鎖之後,會立刻喚醒 Runner-2,而在此之前 Runner-2 只能等待。
Runner-2 執行完畢釋放鎖之後,會立刻喚醒排在它之後的節點,以此類推。
完整程式碼詳見 GitHub
參考文獻
相關文章
- 分散式鎖的實現及原理分散式
- Redis、Zookeeper實現分散式鎖——原理與實踐Redis分散式
- ZooKeeper分散式鎖的實現分散式
- 分散式鎖之Zookeeper實現分散式
- 分散式鎖實現(二):Zookeeper分散式
- 6 zookeeper實現分散式鎖分散式
- 基於 Zookeeper 的分散式鎖實現分散式
- 二十二、zookeeper實現分散式鎖分散式
- Zookeeper分散式鎖實現Curator十一問分散式
- 分散式鎖實現方案(REDIS,ZOOKEEPER,TAIR)分散式RedisAI
- 使用redis和zookeeper實現分散式鎖Redis分散式
- 【zookeeper】zookeeper分散式鎖分散式
- Redisson實現分散式鎖---原理Redis分散式
- redisson實現分散式鎖原理Redis分散式
- 跟著小白學zookeeper: 分散式鎖的實現分散式
- zookeeper分散式鎖分散式
- ZooKeeper 分散式鎖分散式
- 關於分散式鎖原理的一些學習與思考-redis分散式鎖,zookeeper分散式鎖分散式Redis
- Redis分散式鎖的原理和實現Redis分散式
- 十九、Redis分散式鎖、Zookeeper分散式鎖Redis分散式
- 基於快取或zookeeper的分散式鎖實現快取分散式
- 基於redis和zookeeper的分散式鎖實現方式Redis分散式
- 面試必問:分散式鎖實現之zk(Zookeeper)面試分散式
- Redis分散式鎖的使用與實現原理Redis分散式
- Zookeeper-分散式鎖分散式
- Zookeeper(5)---分散式鎖分散式
- zookeeper 分散式鎖解析分散式
- zookeeper分散式鎖,你用php是如何實現的呀分散式PHP
- 分散式鎖實現原理與最佳實踐分散式
- redisson之分散式鎖實現原理(三)Redis分散式
- 女朋友也能看懂的Zookeeper分散式鎖原理分散式
- 分散式鎖的3種實現(資料庫、快取、Zookeeper)分散式資料庫快取
- 基於資料庫、redis和zookeeper實現的分散式鎖資料庫Redis分散式
- 一文帶你認識zookeeper並探究分散式鎖實現原理(附docker構建zookeeper教程)分散式Docker
- 技術分享| 基於 Etcd 的分散式鎖實現原理及方案分散式
- R2M分散式鎖原理及實踐分散式
- ZooKeeper學習筆記四:使用ZooKeeper實現一個簡單的分散式鎖筆記分散式
- 分散式鎖的實現分散式