Zookeeper節點類型
- 持久節點:PERSISTENT:
- 臨時節點:EPHEMERAL
- 臨時節點的生命週期和客戶端會話綁定。
- 臨時節點不能建立子節點
- 特殊屬性:SEQUENTIAL屬性。
- 節點被建立的時候,Zookeeper自動在節點名後的追加整數數字,由父節點維護的自增節點
- 所以有能夠劃分出兩類:
- 持久順序節點:PERSISTENT_SEQUENTIAL
- 臨時順序節點:EPHEMERAL_SEQUENTIAL
zookeeper分佈式鎖的原理
鎖分:排它鎖(X 鎖),共享鎖(S 鎖);分佈式
示例:/exclusive_lock/lock 該節點被定義爲鎖字體
- 排它鎖(X 鎖)的核心:保證當前有且只有一個事務得到鎖,而且鎖被釋放後,全部正在等待鎖的事務能被通知到。
- X鎖獲取過程:全部客戶端經過create()建立鎖,在該鎖位置下建立臨時節點/exclusive_lock/lock。但有且只有一個可以建立成功。該客戶端得到鎖,其餘客戶端到該節點上註冊節點變動Watcher監聽。
- X鎖釋放過程:因爲是臨時節點,經過2種方式釋放鎖
- 當前獲取鎖的客戶端會話失效,Zookeeper刪除該臨時節點
- 正常執行完業務邏輯,客戶端主動刪除該臨時節點
- 當鎖釋放後,通知全部註冊Watcher的客戶端,從新開始競爭鎖
注:紅色字體已避免"羊羣效應"spa
- 共享鎖 (S 鎖)的核心:不一樣的事務能夠同時對一個數據對象進行讀取操做,而更新操做必須在當前沒有事務進行讀寫狀況下進行。
示例:/shared_lock/[hostname]-請求類型-序列對象
- S鎖獲取過程:全部客戶端在/shared_lock/該節點建立臨時順序節點。
- 若是是讀操做,建立相似/shared_lock/192.168.0.1-R-0000000001
- 若是是寫操做,建立相似/shared_lock/192.168.0.1-W-0000000001
- getChildren()獲取全部已建立的子節點信息,肯定本身在該子節點所在的位置
- 對於讀操做:若是沒有比本身序列小,或者全部比本身小的序列都是讀操做,標明能夠獲取S鎖,開始執行讀取操做;若是碰到有比本身序列小的寫操做,進入等待狀態。若是進入等待狀態,調用exist()對比本身小的最後一個寫節點進行Watcher監視。
- 對於寫操做:若是本身不是序列中最小的,進入等待狀態。若是進入等待狀態,向比本身序列小的最後一個寫節點註冊Watcher監視。
- S鎖釋放過程:與X鎖釋放過程一致
參考資料:生命週期
《從PAXOS到ZOOKEEPER分佈式一致性原理與實踐》事務