Zookeeper 分佈式鎖原理

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分佈式一致性原理與實踐》事務

相關文章
相關標籤/搜索