1. 程式人生 > >ZooKeeper 數據模型

ZooKeeper 數據模型

通過命令 數值 臨時 cti 系列 如果 有一個 種類型 per

ZooKeeper 的數據模型,在結構上和標準文件系統的非常相似,擁有一個層次的命名空間,都是采用樹形層次結構,ZooKeeper 樹中的每個節點被稱為—
Znode。和文件系統的目錄樹一樣,ZooKeeper 樹中的每個節點可以擁有子節點。但也有不同之處:

  1. Znode 兼具文件和目錄兩種特點。既像文件一樣維護著數據、元信息、ACL、時間戳等數據結構,又像目錄一樣可以作為路徑標識的一部分,並可以具有子 Znode。用戶對 Znode 具有增、刪、改、查等操作(權限允許的情況下)。
  2. Znode 具有原子性操作,讀操作將獲取與節點相關的所有數據,寫操作也將替換掉節點的所有數據。另外,每一個節點都擁有自己的 ACL(訪問控制列表),這個列表規定了用戶的權限,即限定了特定用戶對目標節點可以執行的操作。
  3. Znode 存儲數據大小有限制。ZooKeeper 雖然可以關聯一些數據,但並沒有被設計為常規的數據庫或者大數據存儲,相反的是,它用來管理調度數據, 比如分布式應用中的配置文件信息、狀態信息、匯集位置等等。這些數據的共同特性就是它們都是很小的數據,通常以 KB 為大小單位。ZooKeeper 的服務器和客戶端都被設計為嚴格檢查並限制每個 Znode 的數據大小至多 1M,當時常規使用中應該遠小於此值。
  4. Znode 通過路徑引用,如同 Unix 中的文件路徑。路徑必須是絕對的,因此他們必須由斜杠字符來開頭。除此以外,他們必須是唯一的,也就是說每一個路徑只有一個表示,因此這些路徑不能改變。在 ZooKeeper 中,路徑由
    Unicode 字符串組成,並且有一些限制。字符串"/zookeeper"用以保存管理信息,比如關鍵配額信息。

3.1 . 數據結構圖

技術分享圖片
圖中的每個節點稱為一個 Znode。 每個 Znode 由 3 部分組成:
① stat:此為狀態信息, 描述該 Znode 的版本, 權限等信息
② data:與該 Znode 關聯的數據
③ children:該 Znode 下的子節點
3.2 . 節點類型
Znode 有兩種,分別為臨時節點和永久節點。節點的類型在創建時即被確定,並且不能改變。
臨時節點:該節點的生命周期依賴於創建它們的會話。一旦會話結束,臨時節點將被自動刪除,當然可以也可以手動刪除。臨時節點不允許擁有子節點。

永久節點:該節點的生命周期不依賴於會話,並且只有在客戶端顯示執行刪除操作的時候,他們才能被刪除。
Znode 還有一個序列化的特性,如果創建的時候指定的話,該 Znode 的名字後面會自動追加一個不斷增加的序列號。序列號對於此節點的父節點來說是唯一的,這樣便會記錄每個子節點創建的先後順序。它的格式為“%10d”(10 位數字,沒有數值的數位用 0 補充,例如“0000000001”)。

技術分享圖片

這樣便會存在四種類型的 Znode 節點,分別對應:
PERSISTENT:永久節點EPHEMERAL:臨時節點
PERSISTENT_SEQUENTIAL:永久節點、序列化EPHEMERAL_SEQUENTIAL:臨時節點、序列化
3.3 . 節點屬性
每個 znode 都包含了一系列的屬性,通過命令 get,可以獲得節點的屬性。
技術分享圖片
dataVersion:數據版本號,每次對節點進行 set 操作,dataVersion 的值都
會增加 1(即使設置的是相同的數據),可有效避免了數據更新時出現的先後順序問題。
cversion :子節點的版本號。當 znode 的子節點有變化時,cversion 的值就會增加 1。
aclVersion :ACL 的版本號。cZxid :Znode 創建的事務 id。
mZxid :Znode 被修改的事務 id,即每次對 znode 的修改都會更新 mZxid。 對於 zk 來說,每次的變化都會產生一個唯一的事務 id,zxid(ZooKeeper Transaction Id)。通過 zxid,可以確定更新操作的先後順序。例如,如果 zxid1小於 zxid2,說明 zxid1 操作先於 zxid2 發生,zxid 對於整個 zk 都是唯一的,
即使操作的是不同的 znode。
ctime:節點創建時的時間戳.
mtime:節點最新一次更新發生時的時間戳.

ephemeralOwner:如果該節點為臨時節點, ephemeralOwner 值表示與該節點
綁定的 session id. 如果不是, ephemeralOwner 值為 0.
在 client 和 server 通信之前,首先需要建立連接,該連接稱為 session。連接建立後,如果發生連接超時、授權失敗,或者顯式關閉連接,連接便處於 CLOSED 狀態, 此時 session 結束。

ZooKeeper 數據模型