1 新增節點
create [-s] [-e] path data #其中-s 為有序節點,-e 臨時節點
創建持久化節點並寫入數據:
[zk: localhost:2181(CONNECTED) 0] create /hadoop "123456" Created /hadoop [zk: localhost:2181(CONNECTED) 1] get /hadoop 123456 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0x2 mtime = Sat Apr 11 19:15:47 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
退出客戶端在查看,是否能查到:
[zk: localhost:2181(CONNECTED) 3] quit Quitting... 2020-04-11 19:29:52,410 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x17168d c8c420000 closed 2020-04-11 19:29:52,412 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread @519] - EventThread shut down for session: 0x17168dc8c420000 [root@iZ1la3d1xbmukrZ bin]# ./zkCli.sh Connecting to localhost:2181 2020-04-11 19:29:54,955 [myid:] - INFO [main:Environment@100] - Client environm ent:zookeeper.version=3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT 2020-04-11 19:29:54,958 [myid:] - INFO [main:Environment@100] - Client environm ent:host.name=iZ1la3d1xbmukrZ 2020-04-11 19:29:54,958 [myid:] - INFO [main:Environment@100] - Client environm ent:java.version=1.8.0_131 2020-04-11 19:29:54,960 [myid:] - INFO [main:Environment@100] - Client environm ent:java.vendor=Oracle Corporation 2020-04-11 19:29:54,961 [myid:] - INFO [main:Environment@100] - Client environm ent:java.home=/home/zookeeper/jdk1.8.0_131/jre 2020-04-11 19:29:54,961 [myid:] - INFO [main:Environment@100] - Client environm
[zk: localhost:2181(CONNECTED) 0] get /hadoop 123456 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0x2 mtime = Sat Apr 11 19:15:47 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0
創建持久化有序節點,此時創建的節點名為指定節點名 + 自增序號:
[zk: localhost:2181(CONNECTED) 1] create -s /a "a" Created /a0000000001 [zk: localhost:2181(CONNECTED) 2] get /a0000000001 a cZxid = 0x5 ctime = Sat Apr 11 19:35:03 CST 2020 mZxid = 0x5 mtime = Sat Apr 11 19:35:03 CST 2020 pZxid = 0x5 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 1 numChildren = 0 [zk: localhost:2181(CONNECTED) 3] create -s /b "b" Created /b0000000002
創建臨時節點,臨時節點會在會話過期后被刪除:
Created /b0000000002 [zk: localhost:2181(CONNECTED) 4] create -e /tmp "tmp" Created /tmp [zk: localhost:2181(CONNECTED) 5] quit Quitting... 2020-04-11 20:25:24,342 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x17168dc8c420001 closed 2020-04-11 20:25:24,344 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x17168dc8c420001 [root@iZ1la3d1xbmukrZ bin]# ./zkCli.sh WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0] get /tmp Node does not exist: /tmp [zk: localhost:2181(CONNECTED) 1]
創建臨時有序節點,臨時節點會在會話過期后被刪除:
[zk: localhost:2181(CONNECTED) 2] create -s -e /aa 'aaa' Created /aa0000000004 [zk: localhost:2181(CONNECTED) 3] create -s -e /bb 'nnn' Created /bb0000000005 [zk: localhost:2181(CONNECTED) 4]
2 更新節點
更新節點的命令是 set ,可以直接進行修改,如下:
[zk: localhost:2181(CONNECTED) 4] get /hadoop 123456 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0x2 mtime = Sat Apr 11 19:15:47 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0 [zk: localhost:2181(CONNECTED) 5] set /hadoop "3456" cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0xc mtime = Sat Apr 11 20:27:51 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 [zk: localhost:2181(CONNECTED) 6] get /hadoop 3456 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0xc mtime = Sat Apr 11 20:27:51 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 [zk: localhost:2181(CONNECTED) 7]
可以基於版本號進行更改,此時類似於樂觀鎖機制,當你傳入的數據版本號(dataVersion) 和當前節點的數據版本號不符合時,zookeeper 會拒絕本次修改:
[zk: localhost:2181(CONNECTED) 7] set /hadoop "345" 1 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0xd mtime = Sat Apr 11 20:29:15 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 8] set /hadoop "345" 3 version No is not valid : /hadoop [zk: localhost:2181(CONNECTED) 9]
3 刪除節點
刪除節點的語法如下:
delete path [version]
和更新節點數據一樣,也可以傳入版本號,當你傳入的數據版本號 (dataVersion),當前節點的數據版本號不符合時,zookeeper 不會執行刪除操作。
[zk: localhost:2181(CONNECTED) 9] delete /hadoop 3 version No is not valid : /hadoop [zk: localhost:2181(CONNECTED) 10] delete /hadoop 2 [zk: localhost:2181(CONNECTED) 11] get /hadoop Node does not exist: /hadoop [zk: localhost:2181(CONNECTED) 12]
要想刪除某個節點及其所有后代節點,可以使用遞歸刪除,命令為 rmr
[zk: localhost:2181(CONNECTED) 2] create /tmp "123" Created /tmp [zk: localhost:2181(CONNECTED) 3] create /tmp/wgr "123" Created /tmp/wgr [zk: localhost:2181(CONNECTED) 4] create /tmp/wgr/qwer "123" Created /tmp/wgr/qwer [zk: localhost:2181(CONNECTED) 5] create /tmp/wgr/qwer/re "123" Created /tmp/wgr/qwer/re [zk: localhost:2181(CONNECTED) 6] delete /tmp Node not empty: /tmp [zk: localhost:2181(CONNECTED) 7] get /tmp 123 cZxid = 0x15 ctime = Sat Apr 11 20:32:16 CST 2020 mZxid = 0x15 mtime = Sat Apr 11 20:32:16 CST 2020 pZxid = 0x16 cversion = 1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 1 [zk: localhost:2181(CONNECTED) 8] [zk: localhost:2181(CONNECTED) 8] rmr /tmp [zk: localhost:2181(CONNECTED) 9] get /tmp Node does not exist: /tmp [zk: localhost:2181(CONNECTED) 10]
查看節點
get path
[zk: localhost:2181(CONNECTED) 6] get /hadoop 3456 cZxid = 0x2 ctime = Sat Apr 11 19:15:47 CST 2020 mZxid = 0xc mtime = Sat Apr 11 20:27:51 CST 2020 pZxid = 0x2 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0
節點各個屬性如下表。其中一個重要的概念是 Zxid(ZooKeeper TransactionId),ZooKeeper 節點的每一次更改都具有唯一的 Zxid,如果 Zxid1 小於 Zxid2,則Zxid1 的更改發生在 Zxid2 更改之前。
狀態屬性 | 說明 |
cZxid | 數據節點創建時的事務 ID |
ctime | 數據節點創建時的時間 |
mZxid | 數據節點最后一次更新時的事務 ID |
mtime | 數據節點最后一次更新時的時間 |
pZxid | 數據節點的子節點最后一次被修改時的事務 ID |
cversion | 子節點的更改次數 |
dataVersion | 節點數據的更改次數 |
aclVersion | 節點的 ACL 的更改次數 |
ephemeralOwner | 如果節點是臨時節點, 則表示創建該節點的會話的 SessionID; 如果節點是持久節點, 則該屬性值為 0 |
dataLength | 數據內容的長度 |
numChildren | 數據節點當前的子節點個數 |
當創建子節點的時候,pZxid會發生改變
查看節點狀態
可以使用 stat 命令查看節點狀態, 它的返回值和 get 命令類似, 但不會返回節點數據
[zk: localhost:2181(CONNECTED) 11] stat /hadoop cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x1e mtime = Sat Apr 11 20:39:10 CST 2020 pZxid = 0x1e cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 12]
查看節點列表
查看節點列表有 ls path 和 ls2 path 兩個命令,后者是前者的增強,不僅可以查看指定路徑下的所有節點,還可以查看當前節點的信息
[zk: localhost:2181(CONNECTED) 12] ls / [b0000000002, a0000000001, hadoop, zookeeper, tmp0000000006] [zk: localhost:2181(CONNECTED) 13] ls2 / [b0000000002, a0000000001, hadoop, zookeeper, tmp0000000006] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x1e cversion = 13 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 5 [zk: localhost:2181(CONNECTED) 14]
4 監聽器
get path [watch]
使用 get path [watch] 注冊的監聽器能夠在節點內容發生改變的時候,向客戶端發出通知。需要注意的是 zookeeper 的觸發器是一次性的 (One-time trigger),即觸發一次后就會立即失效。
[zk: localhost:2181(CONNECTED) 18] get /hadoop watch 456 cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x1f mtime = Sat Apr 11 20:46:15 CST 2020 pZxid = 0x20 cversion = 1 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 1 [zk: localhost:2181(CONNECTED) 19] set /hadoop 45678 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x21 mtime = Sat Apr 11 20:53:32 CST 2020 pZxid = 0x20 cversion = 1 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 1 [zk: localhost:2181(CONNECTED) 20] set /hadoop 43 cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x22 mtime = Sat Apr 11 20:53:46 CST 2020 pZxid = 0x20 cversion = 1 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 1 [zk: localhost:2181(CONNECTED) 21]
監聽器stat path [watch]
使用 stat path [watch] 注冊的監聽器能夠在節點狀態發生改變的時候,向客戶端發出通知
[zk: localhost:2181(CONNECTED) 0] stat /hadoop watch cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x22 mtime = Sat Apr 11 20:53:46 CST 2020 pZxid = 0x20 cversion = 1 dataVersion = 3 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 1 [zk: localhost:2181(CONNECTED) 1] set /hadoop 112233 WATCHER:: WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop cZxid = 0x1e ctime = Sat Apr 11 20:39:10 CST 2020 mZxid = 0x26 mtime = Sat Apr 11 20:56:48 CST 2020 pZxid = 0x20 cversion = 1 dataVersion = 4 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 1
監聽器ls\ls2 path [watch]
使用 ls path [watch] 或 ls2 path [watch] 注冊的監聽器能夠監聽該節點下所有子節點的增加和刪除操作。
[zk: localhost:2181(CONNECTED) 3] ls /hadoop watch [hbase] [zk: localhost:2181(CONNECTED) 4] create /hadoop/node3 "node3" WATCHER:: Created /hadoop/node3 WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop [zk: localhost:2181(CONNECTED) 5] ls /hadoop watch [node3, hbase] [zk: localhost:2181(CONNECTED) 6] delete /hadoop/node3 WATCHER:: [zk: localhost:2181(CONNECTED) 7] WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop [zk: localhost:2181(CONNECTED) 7]