標籤:
原文連結 http://coolxing.iteye.com/blog/1871328
ZooKeeper的資料結構, 與普通的檔案系統極為類似. 見:
圖片引用自developerworks
圖中的每個節點稱為一個znode. 每個znode由3部分組成:
- stat. 此為狀態資訊, 描述該znode的版本, 許可權等資訊.
- data. 與該znode關聯的資料.
- children. 該znode下的子節點.
ZooKeeper命令
在深入znode的各個部分之前, 首先需要熟悉一些常用的ZooKeeper命令.
串連server
Bash代碼
- bin/zkCli.sh -server 10.1.39.43:4180
列出指定node的子node
Bash代碼
- [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節點, 並指定關聯資料
Bash代碼
- create /hello world
建立節點/hello, 並將字串"world"關聯到該節點中.
擷取znode的資料和狀態資訊
Bash代碼
- [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
Bash代碼
- [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節點.
Bash代碼
- [zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world
- Created /xing/ei
sequence. 嚴格的說, sequence並非節點類型中的一種. sequence節點既可以是ephemeral的, 也可以是persistent的. 建立sequence節點時, ZooKeeper server會在指定的節點名稱後加上一個數字序列, 該數字序列是遞增的. 因此可以多次建立相同的sequence節點, 而得到不同的節點. 使用-s參數指定建立sequence節點.
Bash代碼
- [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本身的刪除事件.
Bash代碼
- [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的更新和刪除事件.
Bash代碼
- [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的更新和刪除事件.
【轉】ZooKeeper 資料模型