今天藉助ZK實現領導者選舉,畫時序圖過程當中發現,準確控制一次選舉從開始到結束,很是得困難。甚至準備在ZK額外記錄一系列的狀態信息來肯定選舉開始和結束的邊界,邏輯複雜且難以100%保證狀態一致。併發
細想一下,是缺乏一個惟一標記集羣變化的標識。來處理屢次變化重疊、單次變化各節點是否完成同步。less
發現忽略了ZK帶給咱們的一個頗有用的特性,可使用ZNode的版原本標記一次集羣節點的變化。ZK不只有節點數據變動的版本信息還有一個父節點版本(感知子節點的增刪變化)。分佈式
背景
ZK 中,ZNode 都有一個
版本號
,spa
- 版本號,都有哪些?
- 版本號,如何修改?
- 版本號,什麼做用?
版本號
版本號,都有哪些?
每一個 ZNode 都有 3 類版本信息:code
- version:數據內容,版本
- cversion:子節點列表,版本
- aversion:ACL 權限,版本
特別說明:事務
- ZK 中
版本
就是修改次數
:即便修改先後,內容不變,但版本
仍會+1
:version=0
表示節點建立以後,修改的次數爲 0。cversion
子節點列表:ZNode,其中 cversion 只會感知子節點列表
變動信息,新增子節點、刪除子節點,而不會感知子節點數據內容的變動。版本號,如何修改?
下述狀況,版本號會自動更新:get
- 版本自增:每次變化,版本就加一;
版本號,什麼做用?
目標:解決 ZNode 的
併發更新
問題,實現 CAS(Compare And Switch)樂觀鎖。同步補充:樂觀鎖事務,分爲 3 個典型階段:it
- 數據讀取
- 寫入校驗
- 數據寫入
參考資料
- 從Paxos到Zookeeper分佈式一致性原理與實踐 第7章 7.1.3
- ZooKeeper-Distributed Process Coordination 第2章 2.1.4
from: http://ningg.top/zookeeper-lesson-7-zookeeper-version/io