ZooKeeper系列文章:http://www.javashuo.com/article/p-waqydwdc-bt.htmlhtml
znode的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#sc_zkDataModel_znodesnode
ZooKeeper以一種相似於文件系統的樹形數據結構實現名稱空間。名稱空間中的每一個節點都是一個znode。znode和文件系統的路徑不同,在文件系統中,路徑只是一個名稱,不包含數據。而znode不只是一個路徑,還攜帶數據。web
須要注意,雖然是樹形數據結構,但ZooKeeper是內存數據庫,節點的信息全都存放在內存中(在寫操做達到必定次數後,會對內存數據庫拍快照,將其序列化到磁盤上),因此在文件系統中是看不到這個樹形結構的,不過能夠藉助ZooKeeper的第三方web工具來查看。數據庫
此外,znode還維護了包括版本號和時間戳的狀態信息。經過版本號和時間戳信息,可讓ZooKeeper驗證緩存、協調每次的更改操做。每當znode數據發生更改時,版本號都會遞增。客戶端檢索znode時,同時也會收到關於該節點的狀態信息。當客戶端執行更改、刪除操做時,它必須提供它正在更改的znode數據的版本,若是它提供的版本與數據的實際版本不匹配,則更新將失敗。apache
znode有幾個須要關注的點:緩存
Watches
:Data Access
:
在每一個znode名稱空間中存儲的數據的讀、寫操做都是原子性的。讀操做將獲取與znode關聯的全部數據(包括數據的狀態信息),寫操做將替換該znode所攜帶的全部數據。每一個節點都有一個訪問控制列表(ACL)來限制誰能夠作什麼。服務器
ZooKeeper並無被設計成通常的數據庫或大型對象存儲。相反,它只是管理協調數據。這些數據能夠以配置、狀態信息等形式出現。各類形式的協調數據的一個共同特色是它們相對較小,通常以kb做爲度量度量。ZooKeeper客戶端和服務器實現都有完整的檢查功能,以確保znode的數據少於1M,通常來講,協調數據佔用的空間都遠遠小於1M。在相對較大的數據大小上操做會致使一些操做比其餘操做花費更多的時間,而且會影響一些操做的延遲,由於它要在網絡上傳輸更多數據。若是須要存儲較大數據,能夠將它們存儲在大型存儲系統(如NFS或HDFS)上,而後在ZooKeeper中使用指針指向這些較大數據。網絡
Ephemeral Nodes
:Sequence Nodes -- Unique Naming
建立znode時,還能夠請求ZooKeeper將單調遞增的計數器追加到znode路徑的末尾。這個計數器是父znode獨有的。計數器的格式爲%010d
,即便用0來填充的10位數字(計數器以這種方式進行格式化以簡化排序),例如<path>0000000001
。注意:用於存儲下一個序列號的計數器是由父節點維護的有符號整數(4bytes),當計數器的增量超過2147483647時,計數器將溢出。session
時間相關的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#sc_timeInZk數據結構
Zxid
:Version numbers
:Ticks
:Real time
狀態相關的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#sc_zkStatStructure
field | description |
---|---|
czxid | 建立znode的zxid |
mzxid | 最近一次修改znode的zxid(建立、刪除、set直系子節點、set自身節點都會計數) |
pzxid | 最近一次修改子節點的zxid(建立、刪除直系子節點都會計數,set子節點不會計數) |
ctime | 建立znode的時間,單位毫秒 |
mtime | 最近一次修改znode的時間,單位毫秒 |
version | 修改znode的次數 |
cversion | 修改子節點的次數(建立、刪除直系子節點都會計數,set子節點不會計數) |
aversion | 該znode的ACL修改次數 |
ephemeralOwner | 臨時znode節點的session id,若是不是臨時節點,值爲0 |
dataLength | znode攜帶的數據長度,單位字節 |
numChildren | 直系子節點的數量(不會遞歸計算孫節點) |