Zookeeper 的視圖結構跟標准的 Unix 文件系統很像,都有一個根節點 / 。在根節點下面就是一個個的子節點,我們稱為 ZNode。ZNode 是 Zookeeper 中最小數據單位,在 ZNode 下面又可以再掛 ZNode,這樣一層層下去就形成了一個層次化命名空間 ZNode 樹,我們稱為 ZNode Tree。對於 ZNode 節點,我們可以增刪改查操作,其實有很多的開源緩存框架和 Zookeeper 相似,只是數據結構不一樣。像 Redis、Memcache 等,都有自己的數據操作命令,以及自己的數據存儲結構。
一、【數據結構】
我們先來看看 Zookeeper 的數據模型圖
在 Zookeeper 中,每一個數據節點都是一個 ZNode,上圖根目錄下有兩個節點,分別是:app1 和 app2,其中 app1 下面又有三個子節點。那么我們來看看 ZNode 數據結構到底是什么樣子的呢。首先我們來了解 ZNode 的類型。
ZNode 的類型有哪些?
Zookeeper 節點類型可以分為三大類:持久性節點(Persistent)、臨時性節點(Ephemeral)、順序性節點(Sequential)。現實開發中在創建節點的時候通過組合可以生成以下四種節點類型:持久節點、持久順序節點、臨時節點、臨時順序節點。
持久節點就是節點被創建后會一直存在服務器,直到刪除操作主動清除,這種節點也是最常見的類型。
持久順序節點就是有順序的持久節點,節點特性和持久節點是一樣的,只是額外特性表現在順序上。順序特性實質是在創建節點的時候,會在節點名后面加上一個數字后綴,來表示其順序。
臨時節點就是會被自動清理掉的節點,它的生命周期和客戶端會話綁在一起,客戶端會話結束,節點會被刪除掉。與持久性節點不同的是,臨時節點不能創建子節點。
臨時書序節點就是有順序的臨時節點,和持久順序節點相同,在其創建的時候會在名字后面加上數字后綴。
ZNode 的數據結構是怎么樣的呢?
我們看看結構圖
整個 ZNode 節點內容包括兩部分:節點數據內容和節點狀態信息。圖中 app1 是數據內容,其他的屬於狀態信息。那么這些狀態信息都有什么含義呢?
cZxid 就是 Create ZXID,表示節點被創建時的事務 ID。
mZxid 就是 Modified ZXID,表示節點最后一次被修改時的事務 ID。
ctime 就是 Create Time,表示節點創建時間。
mtime 就是 Modified Time,表示節點最后一次被修改的時間。
pZxid 表示該節點的子節點列表最后一次被修改時的事務 ID。只有子節點列表變更才會更新 pZxid,子節點內容變更不會更新。
cversion 表示子節點的版本號。
dataVersion 表示內容版本號。
dataLength 表示數據長度。
numChildren 表示子節點數。
ephemeralOwner 表示創建該臨時節點時的會話 sessionID,如果是持久性節點那么值為 0。
二、【操作命令】
通過 Help 命令我們看到 Zookeeper 提供很多的操作命令,我們不去一一介紹,選幾個我們經常用的吧。
get path [watch] 命令
path 是路徑 [watch] 是監視器,一般我們用 API 編程的時候,在 getData、exists、getChildren 時候會自己去實現一個 watcher,或者用默認的 watcher。在這里 get 命令的用法可以默認 watch 就好了,例如 get /app1。如下圖:
大家注意 dataVersion = 0,這個是數據內容的版本號,Zookeeper 保證一致性,基本上都會有個版本控制。
set path data [version] 命令
path 是路徑 data 是數據內容 [version] 是版本號,我們可以通過 set /app1 newapp1 來更新節點 /app1 的內容,也可以自己設置版本號,不過通過命令行去設置版本號通過 set /app1 newapp1 2。
如下圖:
大家可以發現 dataVersion = 1,版本號默認加 1。
delete path [version] 命令
path 是節點路徑 [version] 版本號,如下圖:
我們再去 get 看看
Node does not exists:/app1,app1 節點不存在了。
create [-s] [-e] path data acl 命令
這個命令后面的參數比較多,[-s] 順序節點,[-e] 臨時性節點,path 路徑,data 數據內容,acl 權限。我們創建一個持久性節點。
大家發現沒有,節點名后面加上了一串數字,這個就是 Zookeeper 順序標識。而且是持久性節點。
臨時性節點 app2,關閉客戶端會話斷開會自動清除。
謝謝大家觀看!