天天看點

zookeeper 操作

[轉載請注明作者和 原文連結

, 如有謬誤, 歡迎在評論中指正. ]

ZooKeeper的資料結構, 與普通的檔案系統極為類似. 見下圖:

zookeeper 操作

image

圖檔引用自

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

  • stat. 此為狀态資訊, 描述該znode的版本, 權限等資訊.
  • data. 與該znode關聯的資料.
  • children. 該znode下的子節點.

https://github.com/xing4git/blog/blob/master/zookeeper/ZooKeeper--%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.md#zookeeper ZooKeeper指令

在深入znode的各個部分之前, 首先需要熟悉一些常用的ZooKeeper指令.

連接配接server

Bash代碼 [圖檔上傳失敗...(image-7732dd-1544256505618)]

  1. bin/zkCli.sh -server 10.1.39.43:4180

列出指定node的子node

Bash代碼 [圖檔上傳失敗...(image-4f4fc1-1544256505618)]z

  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節點, 并指定關聯資料

Bash代碼 [圖檔上傳失敗...(image-8338f4-1544256505618)]

  1. create /hello world

建立節點/hello, 并将字元串"world"關聯到該節點中.

擷取znode的資料和狀态資訊

Bash代碼 [圖檔上傳失敗...(image-5022ef-1544256505618)]

  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代碼 [圖檔上傳失敗...(image-55566d-1544256505618)]

  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指令會首先删除子節點.

https://github.com/xing4git/blog/blob/master/zookeeper/ZooKeeper--%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.md#znode znode節點的狀态資訊

使用get指令擷取指定節點的資料時, 同時也将傳回該節點的狀态資訊, 稱為Stat. 其包含如下字段:

  • czxid. 節點建立時的zxid.
  • mzxid. 節點最新一次更新發生時的zxid.
  • ctime. 節點建立時的時間戳.
  • mtime. 節點最新一次更新發生時的時間戳.
  • dataVersion. 節點資料的更新次數.
  • cversion. 其子節點的更新次數.
  • aclVersion. 節點ACL(授權資訊)的更新次數.
  • ephemeralOwner. 如果該節點為ephemeral節點, ephemeralOwner值表示與該節點綁定的session id. 如果該節點不是ephemeral節點, ephemeralOwner值為0. 至于什麼是ephemeral節點, 請看後面的講述.
  • dataLength. 節點資料的位元組數.
  • numChildren. 子節點個數.

https://github.com/xing4git/blog/blob/master/zookeeper/ZooKeeper--%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.md#zxid zxid

znode節點的狀态資訊中包含czxid和mzxid, 那麼什麼是zxid呢?

ZooKeeper狀态的每一次改變, 都對應着一個遞增的

Transaction id

, 該id稱為zxid. 由于zxid的遞增性質, 如果zxid1小于zxid2, 那麼zxid1肯定先于zxid2發生. 建立任意節點, 或者更新任意節點的資料, 或者删除任意節點, 都會導緻Zookeeper狀态發生改變, 進而導緻zxid的值增加.

https://github.com/xing4git/blog/blob/master/zookeeper/ZooKeeper--%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.md#session session

在client和server通信之前, 首先需要建立連接配接, 該連接配接稱為session. 連接配接建立後, 如果發生連接配接逾時, 授權失敗, 或者顯式關閉連接配接, 連接配接便處于CLOSED狀态, 此時session結束.

節點類型

講述節點狀态的ephemeralOwner字段時, 提到過有的節點是ephemeral節點, 而有的并不是. 那麼節點都具有哪些類型呢? 每種類型的節點又具有哪些特點呢?

persistent

. persistent節點不和特定的session綁定, 不會随着建立該節點的session的結束而消失, 而是一直存在, 除非該節點被顯式删除.

ephemeral

. ephemeral節點是臨時性的, 如果建立該節點的session結束了, 該節點就會被自動删除. ephemeral節點不能擁有子節點. 雖然ephemeral節點與建立它的session綁定, 但隻要該該節點沒有被删除, 其他session就可以讀寫該節點中關聯的資料. 使用-e參數指定建立ephemeral節點.

Bash代碼 [圖檔上傳失敗...(image-cd9361-1544256505618)]

  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代碼 [圖檔上傳失敗...(image-6ae7c8-1544256505618)]

  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

https://github.com/xing4git/blog/blob/master/zookeeper/ZooKeeper--%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B.md#watch watch

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

ls指令. ls指令的第一個參數指定znode, 第二個參數如果為true, 則說明監聽該znode的子節點的增減, 以及該znode本身的删除事件.

Bash代碼 [圖檔上傳失敗...(image-4391ab-1544256505618)]z

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

get指令. get指令的第一個參數指定znode, 第二個參數如果為true, 則說明監聽該znode的更新和删除事件.

Bash代碼 [圖檔上傳失敗...(image-d69606-1544256505617)]

  1. [zk: localhost:4180(CONNECTED) 39] get /xing true
  2. cZxid = 0x100000066
  3. ctime = Fri May 17 22:30:01 CST 2013
  4. mZxid = 0x100000066
  5. mtime = Fri May 17 22:30:01 CST 2013
  6. pZxid = 0x100000066
  7. [zk: localhost:4180(CONNECTED) 40] create /xing/item item000
  8. [zk: localhost:4180(CONNECTED) 41] rmr /xing
  9. WatchedEvent state:SyncConnected type:NodeDeleted path:/xing

stat指令. stat指令用于擷取znode的狀态資訊. 第一個參數指定znode, 如果第二個參數為true, 則監聽該node的更新和删除事件.