ZooKeeper的數據模型及其API支持以下九個基本操作:
操作 | 描述 |
---|---|
create | 在ZooKeeper命名空間的指定路徑中創建一個znode |
delete | 從ZooKeeper命名空間的指定路徑中刪除一個znode |
exists | 檢查路徑中是否存在znode |
getChildren | 獲取znode的子節點列表 |
getData | 獲取與znode相關的數據 |
setData | 將數據設置/寫入znode的數據字段 |
getACL | 獲取znode的訪問控制列表(ACL)策略 |
setACL | 在znode中設置訪問控制列表(ACL)策略 |
sync | 將客戶端的znode視圖與ZooKeeper同步 |
我們來使用ZooKeeper Java shell對上面中提到的ZooKeeper操作進行演示:
- 用
ThisIsTheRootNode
作為數據創建一個名為root
的znode:
[zk: localhost(CONNECTED) 0] create /root "ThisIsTheRootNode"
Created /root
- 獲取剛創建的
root
的znode的內容:
[zk: localhost(CONNECTED) 1] get /root
"ThisIsTheRootNode"
…… ……
…… ……
- 用
ThisIsChild-1
作為數據為root
創建一個名為child-1
的子節點:
[zk: localhost(CONNECTED) 2] create /root/child-1 "ThisIsChild-1"
Created /root/child-1
- 用
ThisIsChild-2
作為數據為root
創建一個名為child-2
的子節點:
[zk: localhost(CONNECTED) 3] create /root/child-2 "ThisIsChild-2"
Created /root/child-2
- 列出
root
的子節點:
[zk: localhost(CONNECTED) 4] ls /root
[child-2, child-1]
- 獲取
root
的訪問控制列表:
[zk: localhost(CONNECTED) 5] getAcl /root
'world,'anyone
: cdrwa
- 由于
root
擁有2個子節點,所以不允許刪除roo
t:
[zk: localhost(CONNECTED) 6] delete /root
Node not empty: /root
- 刪除子節點
child-1
:
[zk: localhost(CONNECTED) 7] delete /root/child-1
- 刪除子節點
child-2
:
[zk: localhost(CONNECTED) 8] delete /root/child-2
- 列出
root
的內容:
[zk: localhost(CONNECTED) 9] ls2 /root
[]
…… ……
…… ……
- 刪除
root
:
[zk: localhost(CONNECTED) 10] delete /root
除了上述描述的操作外,ZooKeeper還支持使用稱為multi
的操作對znodes進行批量更新。 這將多個原始操作組合在一起成為一個單元。 一個multi
操作本質上也是原子的,這意味著要么所有的更新成功,要么整個更新整個失敗。
ZooKeeper不允許部分寫入或讀取znode數據。 設置znode的數據或讀取時,znode的內容將被替換或完全讀取。 ZooKeeper中的更新操作(如delete
或setData
操作)必須指定正在更新的znode的版本號。 版本號可以通過使用exists()
方法調用來獲得。 如果指定的版本號與znode中的版本號不匹配,則更新操作將失敗。 另外,需要注意的另一件重要的事情是ZooKeeper中的更新是非阻塞(non-blocking)操作。
ZooKeeper中的讀寫操作如下圖所示:
從前面的圖片中,需要注意這些操作兩個關鍵地方:
- Read requests:這些在客戶端當前連接的ZooKeeper服務器上進行局部處理
- Write requests:這些被轉發給領導者,并在生成響應之前通過多數協商一致