1. 程式人生 > >Zookeeper詳解(三):Zookeeper中的Znode特性

Zookeeper詳解(三):Zookeeper中的Znode特性

zookeeper數據模型 znode 節點數據

數據模型

ZK擁有一個命名空間就像一個精簡的文件系統,不同的是它的命名空間中的每個節點擁有它自己或者它下面子節點相關聯的數據。ZK中必須使用絕對路徑也就是使用“/”開頭。

Znode:

ZK目錄樹中每個節點對應一個Znode。每個Znode維護這一個屬性,當前版本、數據版本、建立時間和修改時間等,看下圖:

技術分享圖片

ZK就是使用這些屬性來實現特殊功能的。當一個客戶端要對某個節點進行修改時,必須提供該數據的版本號,當節點數據發生變化是其版本號就會增加。如下圖:

技術分享圖片

Znode具有如下特性:

  • Watches:客戶端可以在節點上設置Watches(可以叫做監視器)。當節點狀態發生變化時,就會觸發監視器對應的操作,當監視器被觸發時,ZK服務器會向客戶端發送且只發送一個通知

  • 數據訪問:ZK上存儲的數據需要被原子性的操作(要麽修改成功要麽回到原樣),也是就讀操作將會讀取節點相關所有數據,寫操作也會修改節點相關所有數據,,而且每個節點都有自己的ACL。

節點類型:ZK中有幾種節點類型,節點類型在節點創建的時候就被確定且不可改變

  • 臨時節點(EPHEMERAL):臨時創建的,會話結束節點自動被刪除,也可以手動刪除,臨時節點不能擁有子節點

  • 臨時順序節點(EPHEMERAL_SEQUENTIAL):具有臨時節點特征,但是它會有序列號,分布式鎖中會用到該類型節點

  • 持久節點(PERSISTENT):創建後永久存在,除非主動刪除。

  • 持久順序節點(PERSISTENT_SEQUENTIAL):該節點創建後持久存在,相對於持久節點它會在節點名稱後面自動增加一個10位數字的序列號,這個計數對於此節點的父節點是唯一,如果這個序列號大於2^32-1就會溢出。

創建順序節點

create -s /NODE_NAME DATA    # -e參數為創建臨時節點,如果不帶參數則創建持久節點

技術分享圖片

ZK中的時間和版本號:

zxid:ZK節點狀態改變會導致該節點收到一個zxid格式的時間戳,這個時間戳是全局有序的,每次更新都會產生一個新的。如果zxid1的值小於zxid2,那麽說明zxid2發生的改變在zxid1之後。當然zxid只是一種格式,具體時間有3個cZxid(節點創建時間)、mZxid(該節點修改時間,與子節點無關)、pZxid(該節點或者該節點的子節點的最後一次創建或者修改時間,孫子節點無關)

version:對節點的每次操作都會使節點的版本號增加,有三個版本號dataversion(數據版本號)、cversion(子節點版本號)、aclversion(節點所擁有的ACL版本號)

技術分享圖片


Zookeeper詳解(三):Zookeeper中的Znode特性