ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk
1.znode
znode的官方說明:http://zookeeper.apache.org/doc/r3.4.12/zookeeperProgrammers.html#sc_zkDataModel_znodes
ZooKeeper以一種類似於文件系統的樹形數據結構實現名稱空間。名稱空間中的每個節點都是一個znode。znode和文件系統的路徑不一樣,在文件系統中,路徑只是一個名稱,不包含數據。而znode不僅是一個路徑,還攜帶數據。

需要注意,雖然是樹形數據結構,但ZooKeeper是內存數據庫,節點的信息全都存放在內存中(在寫操作達到一定次數后,會對內存數據庫拍快照,將其序列化到磁盤上),所以在文件系統中是看不到這個樹形結構的,不過可以借助ZooKeeper的第三方web工具來查看。
此外,znode還維護了包括版本號和時間戳的狀態信息。通過版本號和時間戳信息,可以讓ZooKeeper驗證緩存、協調每次的更改操作。每當znode數據發生更改時,版本號都會遞增。客戶端檢索znode時,同時也會收到關於該節點的狀態信息。當客戶端執行更改、刪除操作時,它必須提供它正在更改的znode數據的版本,如果它提供的版本與數據的實際版本不匹配,則更新將失敗。
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時,計數器將溢出。
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 | 直系子節點的數量(不會遞歸計算孫節點) |
