【轉載】zookeeper數據模型

[轉載請註明做者和原文連接,  若有謬誤, 歡迎在評論中指正. ] node

ZooKeeper的數據結構, 與普通的文件系統極爲相似. 見下圖:git

圖片引用自developerworksgithub

圖中的每一個節點稱爲一個znode. 每一個znode由3部分組成:session

  • stat. 此爲狀態信息, 描述該znode的版本, 權限等信息.
  • data. 與該znode關聯的數據.
  • children. 該znode下的子節點.

ZooKeeper命令

在深刻znode的各個部分以前, 首先須要熟悉一些經常使用的ZooKeeper命令.數據結構

鏈接serverspa

Bash代碼   收藏代碼
  1. bin/zkCli.sh -server 10.1.39.43:4180  

列出指定node的子node命令行

Bash代碼   收藏代碼
  1. [zk: 10.1.39.43:4180(CONNECTED) 9] ls /  
  2. [hello, filesync, zookeeper, xing, server, group, log]  
  3. [zk: 10.1.39.43:4180(CONNECTED) 10] ls /hello  
  4. []  

建立znode節點, 並指定關聯數據code

Bash代碼   收藏代碼
  1. create /hello world  

建立節點/hello, 並將字符串"world"關聯到該節點中.server

獲取znode的數據和狀態信息blog

Bash代碼   收藏代碼
  1. [zk: 10.1.39.43:4180(CONNECTED) 7] get /hello  
  2. world  
  3. cZxid = 0x10000042c  
  4. ctime = Fri May 17 17:57:33 CST 2013  
  5. mZxid = 0x10000042c  
  6. mtime = Fri May 17 17:57:33 CST 2013  
  7. pZxid = 0x10000042c  
  8. cversion = 0  
  9. dataVersion = 0  
  10. aclVersion = 0  
  11. ephemeralOwner = 0x0  
  12. dataLength = 5  
  13. numChildren = 0  

刪除znode

Bash代碼   收藏代碼
  1. [zk: localhost:4180(CONNECTED) 13] delete /xing/item0000000001  
  2. [zk: localhost:4180(CONNECTED) 14] delete /xing                 
  3. 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代碼   收藏代碼
  1. [zk: localhost:4180(CONNECTED) 4] create -e /xing/ei world     
  2. Created /xing/ei  

sequence. 嚴格的說, sequence並不是節點類型中的一種. sequence節點既能夠是ephemeral的, 也能夠是persistent的. 建立sequence節點時, ZooKeeper server會在指定的節點名稱後加上一個數字序列, 該數字序列是遞增的. 所以能夠屢次建立相同的sequence節點, 而獲得不一樣的節點. 使用-s參數指定建立sequence節點.

Bash代碼   收藏代碼
  1. [zk: localhost:4180(CONNECTED) 0] create -s /xing/item world  
  2. Created /xing/item0000000001  
  3. [zk: localhost:4180(CONNECTED) 1] create -s /xing/item world  
  4. Created /xing/item0000000002  
  5. [zk: localhost:4180(CONNECTED) 2] create -s /xing/item world  
  6. Created /xing/item0000000003  
  7. [zk: localhost:4180(CONNECTED) 3] create -s /xing/item world  
  8. Created /xing/item0000000004  

 

watch

watch的意思是監聽感興趣的事件. 在命令行中, 如下幾個命令能夠指定是否監聽相應的事件.

ls命令. ls命令的第一個參數指定znode, 第二個參數若是爲true, 則說明監聽該znode的子節點的增減, 以及該znode自己的刪除事件.

Bash代碼   收藏代碼
  1. [zk: localhost:4180(CONNECTED) 21] ls /xing true  
  2. []  
  3. [zk: localhost:4180(CONNECTED) 22] create /xing/item item000  
  4.   
  5. WATCHER::  
  6.   
  7. WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/xing  
  8. Created /xing/item  

get命令. get命令的第一個參數指定znode, 第二個參數若是爲true, 則說明監聽該znode的更新和刪除事件.

Bash代碼   收藏代碼
  1. [zk: localhost:4180(CONNECTED) 39] get /xing true  
  2. world  
  3. cZxid = 0x100000066  
  4. ctime = Fri May 17 22:30:01 CST 2013  
  5. mZxid = 0x100000066  
  6. mtime = Fri May 17 22:30:01 CST 2013  
  7. pZxid = 0x100000066  
  8. cversion = 0  
  9. dataVersion = 0  
  10. aclVersion = 0  
  11. ephemeralOwner = 0x0  
  12. dataLength = 5  
  13. numChildren = 0  
  14. [zk: localhost:4180(CONNECTED) 40] create /xing/item item000  
  15. Created /xing/item  
  16. [zk: localhost:4180(CONNECTED) 41] rmr /xing  
  17.   
  18. WATCHER::  
  19.   
  20. WatchedEvent state:SyncConnected type:NodeDeleted path:/xing  

stat命令. stat命令用於獲取znode的狀態信息. 第一個參數指定znode, 若是第二個參數爲true, 則監聽該node的更新和刪除事件.

相關文章
相關標籤/搜索