ZooKeeper的數據模型

  • ZooKeeper的數據模型

    ZooKeeper提供的命名空間與標準的文件系統的命名空間很是相似;名稱是由斜槓(/)分隔的一系列路徑元素;ZooKeeper命名空間中的每一個節點都由路徑標識,以下圖;node

    

 

     ZooKeeper命名空間中的每一個節點均可以具備與其關聯的數據以及子節點。就像擁有一個文件系統同樣,該文件系統也容許文件成爲目錄(ZooKeeper中的每一個節點會存儲一些自身的數據:狀態信息,配置,位置信息等,所以存儲在每一個節點上的數據一般很小,在字節到千字節範圍內);緩存

    在ZooKeeper樹形結構中的每一個節點均可以稱爲znode;znode維持了一個stat結構,它包括數據變化的版本號、訪問控制列表變化、和時間戳,容許緩存驗證和協調更新;每當znode的數據有變化,版本號就會增長(例如,每當客戶端檢索數據時同時它也獲取數據的版本信息);bash

 

  • Znode類型
    • 持久節點(PERSISTENT)

      持久節點的存活時間不依賴於客戶端會話,只有客戶端在顯式執行刪除節點操做時,節點才消失;app

建立了一個持久節點/module,且其數據爲」demo」
create /module demo

 

    • 持久順序節點(PERSISTENT_SEQUENTIAL)

      該節點建立後持久存在,相對於持久節點它會在節點名稱後面自動增長一個10位數字的序列號,這個計數對於此節點的父節點是惟一,若是這個序列號大於2^32-1就會溢出;分佈式

create加上-s參數,能夠建立持久順序節點
create -s /module/app app

      上面的命令便建立了一個持久順序節點/module/app0000000001;若是再執行此命令,則會生成節點 /module/app0000000002;spa

 

    • 臨時節點(EPHEMERAL)

      臨時節點的存活時間依賴於客戶端會話,當會話結束,臨時節點將會被自動刪除(固然也能夠手動刪除臨時節點);利用臨時節點的這一特性,咱們可使用臨時節點來進行集羣管理,包括髮現服務的上下線等; ZooKeeper規定,臨時節點不能擁有子節點;blog

建立了一個臨時節點 /module/app,數據爲」app」,會話關閉後,臨時節點會被刪除
create /module/app app

    

    • 臨時順序節點(EPHEMERAL_SEQUENTIAL)

    具備臨時節點特徵,可是它會有序列號,分佈式鎖中會用到該類型節點事務

create加上-s參數,能夠建立順序節點
create -s -e /module/app app

 

 

    • 節點屬性

     使用 get /module/app20000000001 獲取節點的數據,以下圖;get

    

 

 

 

cZxid 建立節點時的事務ID
ctime 建立節點時的時間
mZxid 最後修改節點的事務ID
mtime 最後修改節點時的時間
pZxid 表示該節點的子節點列表最後一次修改的事務ID,添加子節點或刪除子節點就會影響子節點列表,可是修改子節點的數據內容則不影響該ID
cversion 子節點版本號,子節點每次修改版本號加1
dataversion 數據版本號,數據每次修改該版本號加1
aclversion 權限版本號,權限每次修改該版本號加1
ephemeralOwner   用於臨時節點,表示建立該臨時節點的事務id,若是當前的節點不是臨時
節點,該字段值爲
0  
 numChildren 該節點擁有子節點的數量 

    

     Zookeeper裏面的版本號它表示的是對數據節點的內容、子節點列表或者ACL信息的修改次數;節點建立時dataversion、aclversion,cversion都爲0;io

     Zookeeper中的版本號就是樂觀鎖,修改節點數據以前會讀取這個數據並記錄該數據版本號,當須要更新時會攜帶這個版本號去提交,若是此時攜帶的版本號(上次讀取出來的)和當前節點的版本號相同,則說明該數據沒有被修改過,那麼數據修改就會成功提交,若是數據修改失敗,說明該數據在你讀取以後和提交以前這段時間內被修改了。 

 

     經過set命令並攜帶正確的版本號提交更新,版本號相同更新就會成功,並將dataversion的值加1;

      

 

 

     

    再次更新並使用以前的版本號那麼就會失敗;

    

相關文章
相關標籤/搜索