客户端基本命令
version
查看Zookeeper客户端版本:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 28] version
ZooKeeper CLI version: 3.6.3--6401e4ad2087061bc6b9f80dec2d69f2e3c8660a, built on 04/08/2021 16:35 GMT
ls
语法:
代码语言:javascript复制ls [-s] [-w] [-R] path
显示指定节点的子节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 25] ls /
[zookeeper]
显示指定节点的子节点以及指定节点的状态信息:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 33] ls -s /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
递归显示所有子孙节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 35] ls -R /
/
/zookeeper
/zookeeper/config
/zookeeper/quota
/zookeeper/temp1
create
默认不带参数就是创建持久节点,节点数据是可选的,可以创建节点时指定,也可以不指定。
语法:
代码语言:javascript复制create [-s] [-e] [-c] [-t ttl] path [data] [acl]
创建持久节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 46] create /p_node mydata
Created /p_node
创建临时节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 57] create -e /e_node mydata
Created /e_node
创建持久顺序节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 59] create -s /ps_node mydata
Created /ps_node0000000005
创建临时顺序节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 61] create -s -e /es_node mydata
Created /es_node0000000006
创建容器节点:
当容器节点的最后一个子元素被删除时,该容器节点将会被删除。
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 9] create -c /container_node mydata
Created /container_node
stat
查看节点状态信息:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 46] stat /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x18
cversion = 6
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 4
cZxid:创建节点的zxid。
ctime:创建节点的时间(从1970年开始)。
mZxid:节点最后更新的zxid。
mtime:节点最后更新的时间(从1970年开始)。
pZxid:节点最后更新的子节点zxid。
cversion:子节点被更改的次数,子节点的变化都会导致该值递增。
dataVersion:数据被更改的次数,每次数据变化都会导致该值递增。
aclVersion:ACL更改次数,每次ACL的变更都会导致该值递增。
ephemeralOwner:如果节点是一个临时节点,则该值为会话ID。如果节点不是临时节点,则该值为0。
dataLength:节点数据长度。
numChildren:节点的子节点数量。
get
语法:
代码语言:javascript复制get [-s] [-w] path
查看节点数据:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 1] get /p_node
mydata
查看节点数据以及节点状态信息:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 5] get -s /p_node
mydata
cZxid = 0x3
ctime = Thu Apr 22 15:56:50 CST 2021
mZxid = 0x3
mtime = Thu Apr 22 15:56:50 CST 2021
pZxid = 0x3
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
set
语法:
代码语言:javascript复制set [-s] [-v version] path data
更新节点数据:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 7] set /p_node data1
[zk: localhost:2181(CONNECTED) 8] get /p_node
data1
更新节点数据并显示节点状态信息:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 11] set -s /p_node data3
cZxid = 0x3
ctime = Thu Apr 22 15:56:50 CST 2021
mZxid = 0x9
mtime = Thu Apr 22 16:04:26 CST 2021
pZxid = 0x3
cversion = 0
dataVersion = 4
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 12] get /p_node
data3
使用CAS更新节点数据:
-v 指定数据版本号,如果指定的数据版本号和数据当前版本号不一致,则更新失败。
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 16] set -v 4 /p_node data0
[zk: localhost:2181(CONNECTED) 17] get /p_node
data0
delete
delete命令只能删除没有子节点的节点。
语法:
代码语言:javascript复制delete [-v version] path
删除节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 27] delete /temp
[zk: localhost:2181(CONNECTED) 28] get /temp
Node does not exist: /temp
delete也支持指定版本删除:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 27] delete -v 0 /temp
[zk: localhost:2181(CONNECTED) 28] get /temp
Node does not exist: /temp
deleteall
删除节点以及所有子孙节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 35] deleteall /temp
history
显示最近执行的11条命令的历史记录:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 37] history
27 - delete -v 0 /temp
28 - get /temp
29 - ls /
...
getAllChildrenNumber
获取节点下的所有子孙节点数量:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 39] getAllChildrenNumber /
5
getEphemerals
获取当前客户端创建的所有临时节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 42] create -e /temp1 mydata1
Created /temp1
[zk: localhost:2181(CONNECTED) 43] create -e /temp2 mydata2
Created /temp2
[zk: localhost:2181(CONNECTED) 44] getEphemerals
[/temp2, /temp1]
获取当前客户端在指定节点下创建的所有临时节点:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 49] getEphemerals /
[/temp2, /temp1]
sync
在leader和follower之间同步一个节点的数据(异步执行):
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 5] sync /
Sync is OK
quit
退出当前客户端
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 6] quit
监听机制
客户端可以监听节点的变化,当节点发生改变时,将触发相应的事件。当事件被触发时,客户端会收到一个数据包,说明节点已经改变。
监听节点目录变化
监听节点的子节点变化,当子节点发生改变时触发。
语法:
代码语言:javascript复制ls -w path
创建/watchtest节点的目录监听:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 71] ls -w /watchtest
创建/watchtest节点的子节点来触发事件:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 73] create /watchtest/w1 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
Created /watchtest/w1
一次性监听,触发后会被删除,无法再次触发:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 74] create /watchtest/w2 data1
Created /watchtest/w2
监听节点数据变化
监听节点数据变化,当节点数据发生改变时触发。
语法:
代码语言:javascript复制get -w path
创建/watchtest节点的数据监听:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 94] get -w /watchtest
mydata2
更新/watchtest节点数据来触发事件:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 95] set /watchtest mydata3
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
一次性监听,触发后会被删除,无法再次触发:
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 96] set /watchtest mydata4
[zk: localhost:2181(CONNECTED) 97]
永久监听
在Zookeeper 3.6.0版本之后,客户端可以在节点上创建永久监听,永久监听在被触发后不会被删除。
语法:
代码语言:javascript复制addWatch [-m mode] path
永久监听在创建时可以通过 -m 指定模式,模式分为两种:PERSISTENT和PERSISTENT_RECURSIVE,不指定默认使用PERSISTENT_RECURSIVE模式。
PERSISTENT:节点的数据变化以及子节点的变化会触发相应事件,子节点的数据变化不会触发。
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 124] addWatch -m PERSISTENT /watchtest
[zk: localhost:2181(CONNECTED) 125] set /watchtest mydata100
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
[zk: localhost:2181(CONNECTED) 126] create /watchtest/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
Created /watchtest/w1
[zk: localhost:2181(CONNECTED) 127] delete /watchtest/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watchtest
PERSISTENT_RECURSIVE:节点的数据变化以及所有子孙节点的目录或者数据变化都会触发相应事件。
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 129] addWatch -m PERSISTENT_RECURSIVE /watchtest
[zk: localhost:2181(CONNECTED) 130] ls /watchtest
[]
[zk: localhost:2181(CONNECTED) 131] set /watchtest mydata101
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest
[zk: localhost:2181(CONNECTED) 132] create /watchtest/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/watchtest/w1
Created /watchtest/w1
[zk: localhost:2181(CONNECTED) 133] create /watchtest/w1/w1_1
WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/watchtest/w1/w1_1
Created /watchtest/w1/w1_1
[zk: localhost:2181(CONNECTED) 134] set /watchtest/w1/w1_1 data101
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watchtest/w1/w1_1
删除节点的监听
语法:
代码语言:javascript复制removewatches path [-c|-d|-a] [-l]
无论是一次性监听还是永久监听都可以removewatches删除。
代码语言:javascript复制[zk: localhost:2181(CONNECTED) 116] removewatches /watchtest
WATCHER::
WatchedEvent state:SyncConnected type:PersistentWatchRemoved path:/watchtest
参考资料:
Zookeeper官方文档