[轉載請註明做者和原文連接, 若有謬誤, 歡迎在評論中指正. ] node
ZooKeeper的數據結構, 與普通的文件系統極爲相似. 見下圖:git
圖片引用自developerworksgithub
圖中的每一個節點稱爲一個znode. 每一個znode由3部分組成:session
- stat. 此爲狀態信息, 描述該znode的版本, 權限等信息.
- data. 與該znode關聯的數據.
- children. 該znode下的子節點.
ZooKeeper命令
在深刻znode的各個部分以前, 首先須要熟悉一些經常使用的ZooKeeper命令.數據結構
鏈接serverspa
- bin/zkCli.sh -server 10.1.39.43:4180
列出指定node的子node命令行
- [zk: 10.1.39.43:4180(CONNECTED) 9] ls /
- [hello, filesync, zookeeper, xing, server, group, log]
- [zk: 10.1.39.43:4180(CONNECTED) 10] ls /hello
- []
建立znode節點, 並指定關聯數據code
- create /hello world
建立節點/hello, 並將字符串"world"關聯到該節點中.server
獲取znode的數據和狀態信息blog
- [zk: 10.1.39.43:4180(CONNECTED) 7] get /hello
- world
- cZxid = 0x10000042c
- ctime = Fri May 17 17:57:33 CST 2013
- mZxid = 0x10000042c
- mtime = Fri May 17 17:57:33 CST 2013
- pZxid = 0x10000042c
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x0
- dataLength = 5
- numChildren = 0
刪除znode
- [zk: localhost:4180(CONNECTED) 13] delete /xing/item0000000001
- [zk: localhost:4180(CONNECTED) 14] delete /xing
- Node not empty: /xing
使用delete命令能夠刪除指定znode. 當該znode擁有子znode時, 必須先刪除其全部子znode, 不然操做將失敗. rmr命令可用於代替delete命令, rmr是一個遞歸刪除命令, 若是發生指定節點擁有子節點時, rmr命令會首先刪除子節點.
znode節點的狀態信息
使用get命令獲取指定節點的數據時, 同時也將返回該節點的狀態信息, 稱爲Stat. 其包含以下字段:
- czxid. 節點建立時的zxid.
- mzxid. 節點最新一次更新發生時的zxid.
- ctime. 節點建立時的時間戳.
- mtime. 節點最新一次更新發生時的時間戳.
- dataVersion. 節點數據的更新次數.
- cversion. 其子節點的更新次數.
- aclVersion. 節點ACL(受權信息)的更新次數.
- ephemeralOwner. 若是該節點爲ephemeral節點, ephemeralOwner值表示與該節點綁定的session id. 若是該節點不是ephemeral節點, ephemeralOwner值爲0. 至於什麼是ephemeral節點, 請看後面的講述.
- dataLength. 節點數據的字節數.
- numChildren. 子節點個數.
zxid
znode節點的狀態信息中包含czxid和mzxid, 那麼什麼是zxid呢?
ZooKeeper狀態的每一次改變, 都對應着一個遞增的Transaction id
, 該id稱爲zxid. 因爲zxid的遞增性質, 若是zxid1小於zxid2, 那麼zxid1確定先於zxid2發生. 建立任意節點, 或者更新任意節點的數據, 或者刪除任意節點, 都會致使Zookeeper狀態發生改變, 從而致使zxid的值增長.
session
在client和server通訊以前, 首先須要創建鏈接, 該鏈接稱爲session. 鏈接創建後, 若是發生鏈接超時, 受權失敗, 或者顯式關閉鏈接, 鏈接便處於CLOSED狀態, 此時session結束.
節點類型
講述節點狀態的ephemeralOwner字段時, 提到過有的節點是ephemeral節點, 而有的並非. 那麼節點都具備哪些類型呢? 每種類型的節點又具備哪些特色呢?persistent
. persistent節點不和特定的session綁定, 不會隨着建立該節點的session的結束而消失, 而是一直存在, 除非該節點被顯式刪除.ephemeral
. ephemeral節點是臨時性的, 若是建立該節點的session結束了, 該節點就會被自動刪除. ephemeral節點不能擁有子節點. 雖然ephemeral節點與建立它的session綁定, 但只要該該節點沒有被刪除, 其餘session就能夠讀寫該節點中關聯的數據. 使用-e參數指定建立ephemeral節點.
- [zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world
- Created /xing/ei
sequence
. 嚴格的說, sequence並不是節點類型中的一種. sequence節點既能夠是ephemeral的, 也能夠是persistent的. 建立sequence節點時, ZooKeeper server會在指定的節點名稱後加上一個數字序列, 該數字序列是遞增的. 所以能夠屢次建立相同的sequence節點, 而獲得不一樣的節點. 使用-s參數指定建立sequence節點.
- [zk: localhost:4180(CONNECTED) 0] create -s /xing/item world
- Created /xing/item0000000001
- [zk: localhost:4180(CONNECTED) 1] create -s /xing/item world
- Created /xing/item0000000002
- [zk: localhost:4180(CONNECTED) 2] create -s /xing/item world
- Created /xing/item0000000003
- [zk: localhost:4180(CONNECTED) 3] create -s /xing/item world
- Created /xing/item0000000004
watch
watch的意思是監聽感興趣的事件. 在命令行中, 如下幾個命令能夠指定是否監聽相應的事件.
ls命令. ls命令的第一個參數指定znode, 第二個參數若是爲true, 則說明監聽該znode的子節點的增減, 以及該znode自己的刪除事件.
- [zk: localhost:4180(CONNECTED) 21] ls /xing true
- []
- [zk: localhost:4180(CONNECTED) 22] create /xing/item item000
- WATCHER::
- WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/xing
- Created /xing/item
get命令. get命令的第一個參數指定znode, 第二個參數若是爲true, 則說明監聽該znode的更新和刪除事件.
- [zk: localhost:4180(CONNECTED) 39] get /xing true
- world
- cZxid = 0x100000066
- ctime = Fri May 17 22:30:01 CST 2013
- mZxid = 0x100000066
- mtime = Fri May 17 22:30:01 CST 2013
- pZxid = 0x100000066
- cversion = 0
- dataVersion = 0
- aclVersion = 0
- ephemeralOwner = 0x0
- dataLength = 5
- numChildren = 0
- [zk: localhost:4180(CONNECTED) 40] create /xing/item item000
- Created /xing/item
- [zk: localhost:4180(CONNECTED) 41] rmr /xing
- WATCHER::
- WatchedEvent state:SyncConnected type:NodeDeleted path:/xing
stat命令. stat命令用於獲取znode的狀態信息. 第一個參數指定znode, 若是第二個參數爲true, 則監聽該node的更新和刪除事件.