Java分佈式:分佈式鎖之Zookeeper

Java分佈式:分佈式鎖之Zookeeper

分佈式鎖系列教程重點分享鎖實現原理

引入ZooKeeper

ZooKeeper是什麼呢?

  ZooKeeper 是一個開源的分佈式協調服務,它可以在分佈式系統中共享配置,協調鎖資源,提供命名服務等。ZooKeeper 的設計目標是將那些複雜且容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的原語集,並以一系列簡單易用的接口提供給用戶使用。

原語: 操作系統或計算機網絡用語範疇。是由若干條指令組成的,用於完成一定功能的一個過程。具有不可分割性·即原語的執行必須是連續的,在執行過程中不允許被中斷。

ZooKeeper的數據模型

  ZooKeeper 允許分佈式進程通過共享的層次結構命名空間進行相互協調,這與標準文件系統類似。 名稱空間由 ZooKeeper 中的數據寄存器組成 - 稱爲znode,這些類似於文件和目錄。 與爲存儲設計的典型文件系統不同,ZooKeeper數據保存在內存中,這意味着ZooKeeper可以實現高吞吐量和低延遲。

  

  這樣的層級結構,讓每一個Znode節點擁有唯一的路徑,每一個Znode節點主要由四個部分註冊:

  • data:Znode存儲的數據信息。 
  • ACL:記錄Znode的訪問權限,即哪些人或哪些IP可以訪問本節點。
  • stat:包含Znode的各種元數據,比如事務ID、版本號、時間戳、大小等等。
  • child:當前節點的子節點引用,類似於二叉樹的左孩子右孩子。

說明:Zookeeper是爲讀多寫少的場景所設計。Znode並不是用來存儲大規模業務數據,而是用於存儲少量的狀態和配置信息,每個節點的數據最大不能超過1MB。

 

ZooKeeper分佈式鎖機制

  在描述算法流程之前,先看下zookeeper中幾個關於節點的有趣的性質:

  • 有序節點:假如當前有一個父節點爲/lock,我們可以在這個父節點下面創建子節點;zookeeper提供了一個可選的有序特性,例如我們可以創建子節點“/lock/node-”並且指明有序,那麼zookeeper在生成子節點時會根據當前的子節點數量自動添加整數序號,也就是說如果是第一個創建的子節點,那麼生成的子節點爲/lock/node-0000000000,下一個節點則爲/lock/node-0000000001,依次類推。

  • 臨時節點:客戶端可以建立一個臨時節點,在會話結束或者會話超時後,zookeeper會自動刪除該節點

  • 事件監聽:在讀取數據時,我們可以同時對節點設置事件監聽,當節點數據或結構變化時,zookeeper會通知客戶端。當前zookeeper有如下四種事件:1)節點創建;2)節點刪除;3)節點數據修改;4)子節點變更。

算法描述

  • 客戶端連接zookeeper,並在/lock下創建臨時的且有序的子節點,第一個客戶端對應的子節點爲/lock/lock-0000000000,第二個爲/lock/lock-0000000001,以此類推;

  • 客戶端獲取/lock下的子節點列表,判斷自己創建的子節點是否爲當前子節點列表中序號最小的子節點,如果是則認爲獲得鎖,否則監聽剛好在自己之前一位的子節點刪除消息,獲得子節點變更通知後重復此步驟直至獲得鎖;

  • 執行業務代碼;

  • 完成業務流程後,刪除對應的子節點釋放鎖。

圖解

  

參考資料

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章