ZooKeeper系列(3):znode說明和znode狀態

ZooKeeper系列文章:http://www.javashuo.com/article/p-waqydwdc-bt.htmlhtml

 


1.znode

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
    客戶端可在znode上設置watchs。每當該znode發生改變時,就會觸發設置在這個znode上的watch。當觸發了watch,ZooKeeper會發送一個通知給客戶端。關於ZooKeeper的watch詳細內容,見:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#ch_zkWatches
  • Data Access
    在每一個znode名稱空間中存儲的數據的讀、寫操做都是原子性的。讀操做將獲取與znode關聯的全部數據(包括數據的狀態信息),寫操做將替換該znode所攜帶的全部數據。每一個節點都有一個訪問控制列表(ACL)來限制誰能夠作什麼。服務器

    ZooKeeper並無被設計成通常的數據庫或大型對象存儲。相反,它只是管理協調數據。這些數據能夠以配置、狀態信息等形式出現。各類形式的協調數據的一個共同特色是它們相對較小,通常以kb做爲度量度量。ZooKeeper客戶端和服務器實現都有完整的檢查功能,以確保znode的數據少於1M,通常來講,協調數據佔用的空間都遠遠小於1M。在相對較大的數據大小上操做會致使一些操做比其餘操做花費更多的時間,而且會影響一些操做的延遲,由於它要在網絡上傳輸更多數據。若是須要存儲較大數據,能夠將它們存儲在大型存儲系統(如NFS或HDFS)上,而後在ZooKeeper中使用指針指向這些較大數據。網絡

  • Ephemeral Nodes
    ZooKeeper容許使用臨時(ephemeral)節點。只要建立臨時znode的會話還存在,臨時znode就存在。會話退出,這個會話上建立的臨時節點都會刪除。所以,臨時節點上不容許出現子節點。
  • Sequence Nodes -- Unique Naming
    建立znode時,還能夠請求ZooKeeper將單調遞增的計數器追加到znode路徑的末尾。這個計數器是父znode獨有的。計數器的格式爲%010d,即便用0來填充的10位數字(計數器以這種方式進行格式化以簡化排序),例如<path>0000000001。注意:用於存儲下一個序列號的計數器是由父節點維護的有符號整數(4bytes),當計數器的增量超過2147483647時,計數器將溢出。session

2.ZooKeeper中的時間

時間相關的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#sc_timeInZk數據結構

  • Zxid
    每次更改ZooKeeper的狀態,都會設置到一個zxid(ZooKeeper的事務id)格式的版本戳。zxid暴露了ZooKeeper中全部更改操做的總順序。由於每次更改都會設置一個全局惟一的zxid值,若是zxid1小於zxid2,說明zxid1對應的操做比zxid2對應的事務先發生。
  • Version numbers
    每次對某節點進行更改,都會遞增這個節點的版本號。有三種版本號:
    • dataVersion:znode的更改次數。
    • cversion:子節點的更改次數。
    • aversion:節點的ACL的更改次數。
  • Ticks
    當使用多節點(這個節點表明的是組成ZooKeeper的server,而非znode)的ZooKeeper集羣時,各節點使用ticks來定義事件的時間。例如傳播狀態、會話超時時間、節點間鏈接超時時間等。tick時間間接設置了會話鏈接的最小超時時長(tick的兩倍時長)。若是客戶端在2倍tick時間內尚未成功鏈接server,那麼鏈接失敗。
  • Real time
    除了在建立和修改znode時會將當前實時時間戳放入stat結構以外,ZooKeeper根本不使用實時時間或時鐘時間。

3.znode的狀態

狀態相關的官方說明: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 直系子節點的數量(不會遞歸計算孫節點)
相關文章
相關標籤/搜索