Zookeeper系列(2):客户端基本命令与监听机制

2021-04-28 11:20:20 浏览数 (1)

客户端基本命令
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官方文档

0 人点赞