Zookeeper 的數據模型
1. 前言
開始學習 Zookeeper 的第一步,我們首先來學習 Zookeeper 的數據模型。那么我們為什么要先學習 Zookeeper 的數據模型呢?Zookeeper 的數據模型又是什么樣的呢?Zookeeper 的數據模型又有什么樣的特點呢?接下來我們就帶著這幾個問題開始 Zookeeper 的數據模型學習之旅。
2. Zookeeper 數據模型的結構
Zookeeper 數據模型的結構是基于節點的,我們把這種節點叫做 Znode ,具體結構我們來看下圖:
我們可以看見,這種結構和數據結構中的樹類似,也和文件系統的目錄類似。我們知道文件系統的引用是非常方便的,那么我們想引用 Zookeeper 某個節點,那么我們該如何引用呢?
我們可以通過路徑引用的方式來訪問 Znode 節點:
/電腦/戴爾
/手機/華為
我們來說明一下書寫規則:第 1 個 /
為根節點,電腦
為根節點的子節點,第 2 個 /
是對下一個子節點的引用,后面跟上哪個節點的名稱,就是對哪個節點的引用。
Tips: 我們對節點的引用,必須書寫全路徑,也就是說必須要從根節點開始。在 Zookeeper 底層的實現中,把 Znode 的絕對路徑作為 key ,Znode 本身作為 value 來保存的。使用絕對路徑來查詢也提高了 Zookeeper 的性能。
介紹完 Zookeeper 數據模型的結構,也了解了如何引用 Znode 節點,接下來我們對 Znode 節點進行詳細的講解。
3. Znode 的元素組成
我們先來了解 Znode 節點中由哪些元素組成,請看下圖:
我們可以看到,Znode 節點中由 4 種元素組成,接下來我們來分別介紹一下每個元素具體是什么。
Znode 節點元素介紹:
- data : Znode 存儲的數據信息,這里的數據指用戶保存的數據;
- ACL : 對節點進行權限控制,記錄了哪些用戶或者哪些 IP 地址可以訪問本節點;
- child : 當前節點的子節點引用,通過這個節點來找到它的子節點;
- stat : 包含 Znode 的各種元數據,比如事務 ID、版本號、時間戳、大小等 Znode 本身的數據。
Tips: Znode 的 data 元素存儲的信息最大不能超過 1MB 。太大的數據會影響 Zookeeper 的同步性能。
在了解了 Znode 的元素組成,每個元素的具體作用之后,我們接下來學習 Znode 節點有哪些類型,以及他們的特點。
4. Znode 的類型
本節我們來學習 Znode 的類型以及它們各自的特點。Znode 的類型分為一下 4 種:
- 持久節點: 持久節點是 Zookeeper 的默認節點,持久節點被創建后會一直存在,除非進行手動刪除;
- 持久順序節點: 持久順序節點是在持久節點的基礎上,增加了順序性。也就是說,持久順序節點被創建時,會根據創建的時間進行編號,根據編號我們就可以判斷它們的順序;
- 臨時節點: 臨時節點與持久節點的特點相反,臨時節點被創建之后,如果與創建它的客戶端斷開連接,臨時節點就會被銷毀;
- 臨時順序節點: 臨時順序節點就是在臨時節點的基礎上,增加了順序性。
學習了 Znode 節點的類型以及它們的特點,那么我們可以利用節點的特點做什么事情呢?接下來我們來了解節點的應用。
5. Znode 的應用
根據節點的類型以及它們的特點,我們可以實現以下功能:
-
我們可以使用臨時節點來實現服務注冊與發現。在某個服務注冊到 ZooKeeper 時,我們可以讓這個這個服務創建一個臨時節點,并把它的訪問信息交給到 Zookeeper 維護。當這個服務與 Zookeeper 斷開連接時,這個臨時節點就會被銷毀,這時 Zookeeper 發現這個服務離線了,就會移除它的訪問地址,避免出現 404 的情況。我們也可以手動刪除某個臨時節點讓相對應的服務下線;
-
當我們有大量的服務時,一旦配置信息需要修改,會消耗我們大量的時間去每個服務中修改,而且還有可能會出錯,這種情況我們就可以使用持久節點來保存全局的配置信息。當某個服務注冊到 ZooKeeper 時,可以去保存配置信息的節點讀取配置信息。當我們修改配置時,Zookeeper 會通知這些服務,服務就會重新去讀取配置信息;
-
我們可以使用臨時順序節點來實現分布式鎖。當多個服務同時對一個資源進行修改時,會出現數據錯誤,所以我們要避免這種情況。我們這里采取的方式就是為這個資源加鎖,想要獲取這個資源的服務會創建一個臨時順序節點,根據它的順序判斷這個臨時順序節點是否為第一個,如果是第一個則成功獲得鎖,這時這個服務就可以對這個資源進行修改了。完成操作后或者這個服務斷線了都會刪除這個節點,也就是釋放了鎖。后面的服務會根據它創建的臨時順序節點的順序來依次對資源進行操作。
根據 Znode 特點的來實現的應用還有很多,后面的文章我們再詳細介紹。了解了節點的一些應用,那么我們該如何對節點進行操作呢?接下來我們就來介紹 Znode 節點的操作命令。
6. Znode 節點的操作
使用 Zookeeper 客戶端,我們可以通過以下命令來操作 Znode 節點。
-
創建節點:
create
# 創建一個持久節點 create /persistent_node # 創建一個持久的順序節點 create -s /persistent_sequential_node # 創建一個臨時節點 create -e /ephemeral_node # 創建一個臨時的順序節點 create -s -e /ephemeral_sequential_node
-
刪除節點:
delete
delete /config/topics/test
-
獲得一個節點的數據:
get
get /persistent_node
-
設置一個節點的數據:
set
set /brokers myNewData
-
獲取子節點:
ls
# 獲取根節點下的子節點 ls / # 根節點下的子節點有 zk-watcher-2,zookeeper [zk-watcher-2, zookeeper]
Tips: 我們在使用這些命令操作節點時,后面的節點必須是全路徑引用。
7. 總結
經過上面的講解,我們知道了很多功能的實現都是基于 Zookeeper 的結構以及 Znode 的類型和它們的特點,所以學習 Zookeeper 的數據模型還是很有必要的。現在我們來對本節的內容進行總結:
- Zookeeper 數據模型的結構為樹形節點。
- Znode 的元素組成有 4 種:data(用戶數據)、ACL(權限信息)、child(子節點引用)、stat(元數據)。
- Znode 的類型有 4 種:持久節點、持久順序節點、臨時節點、臨時順序節點。
- 我們可以根據 Znode 的特點來實現各種功能,比如服務注冊與發現、配置中心、分布式鎖等。
- Zookeeper 客戶端操作節點的常用命令。