文章目录
本文将介绍zookeeper的客户端命令,并对命令进行归类,方便以后查阅。由于权限控制和配置相关涉及内容较多,这两块独立出来,可通过文章内的链接查看。本文命令使用和实验对象为zookeeper3.5。
1.1 网络相关命令
网络相关主要包括以下三个命令:
- connect host:port:连接指定host:port zk服务,连接过程中状态为CONNECTING,连接成功后状态转变为CONNECTED
- close :关闭当前连接,即关闭当前session。使用close命令后,连接状态转变为CLOSED
- quit :退出当前客户端
[root@VM_147_78_centos /data/zookeeper/bin]# ./zkCli.sh -server 127.0.0.1:2181
/usr/local/jdk1.8.0_231/bin/java
Connecting to 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is enabled
# 关闭连接
[zk: 127.0.0.1:2181(CONNECTED) 15] close
WATCHER::
WatchedEvent state:Closed type:None path:null
# 建立连接
[zk: 127.0.0.1:2181(CLOSED) 16] connect 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTING) 17]
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
# 退出客户端
[zk: 127.0.0.1:2181(CONNECTED) 17] quit
WATCHER::
WatchedEvent state:Closed type:None path:null
[root@VM_147_78_centos /data/zookeeper/bin]#
1.2 节点操作相关命令
节点操作包括9个命令:create,stat,get,set,ls,ls2,delete,deleteall,rmr
1.2.1 创建znode节点:create
节点创建命令:
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
节点创建选项说明:
- path : znode节点路径
- data : 节点存储的数据,可选参数,默认数据为空
- acl :节点权限列表,可选参数,默认所有客户端都可以操作该节点
- -s : 待创建的节点为顺序节点,创建节点时,zk会自动在节点名称后添加序号,序号相对于该节点的父节点是唯一的。
- -e:指定当前创建的节点为临时节点,当创建该节点的session断开之后,该节点自动消失。
- -t:指定节点ttl,当前节点到达ttl指定的时间(单位为ms)之后将会被自动删除。注意:该功能只有在设置extendedTypesEnabled属性之后才能使用;zookeeper扫描ttl节点的频率默认为1分钟,所以ttl的误差范围为1分钟。
节点创建实例:
# 创建节点,并将节点内容初始化为data
[zk: 127.0.0.1:2181(CONNECTED) 0] create /test_create data
Created /test_create
[zk: 127.0.0.1:2181(CONNECTED) 1]
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test_create/test1 123
Created /test_create/test1
[zk: 127.0.0.1:2181(CONNECTED) 2] get /test_create/test1
123
# 创建顺序节点,节点序号从0000000001开始
[zk: 127.0.0.1:2181(CONNECTED) 3] create -s /test_create/seq
Created /test_create/seq0000000001
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /test_create
[seq0000000001, test1]
# 创建带有ttl的节点,
[zk: 127.0.0.1:2181(CONNECTED) 5] create /test_create/test_ttl -t 1
Created /test_create/test_ttl
[zk: 127.0.0.1:2181(CONNECTED) 6] ls /test_create
[seq0000000001, test1, test_ttl]
# 过期后ttl节点自动消失
[zk: 127.0.0.1:2181(CONNECTED) 7] ls /test_create
[seq0000000001, test1]
# 创建临时节点
[zk: 127.0.0.1:2181(CONNECTED) 8] create -e /test
test test%10d0000000039 test3 test4 test_create
[zk: 127.0.0.1:2181(CONNECTED) 8] create -e /test_create/test_e
Created /test_create/test_e
[zk: 127.0.0.1:2181(CONNECTED) 9] ls /test_create
[seq0000000001, test1, test_e]
# 关闭当前会话
[zk: 127.0.0.1:2181(CONNECTED) 10] close
WATCHER::
WatchedEvent state:Closed type:None path:null
# 重新连接
[zk: 127.0.0.1:2181(CLOSED) 11] connect 127.0.0.1:2181
[zk: 127.0.0.1:2181(CONNECTING) 12]
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
# 重新连接后临时节点消失
[zk: 127.0.0.1:2181(CONNECTED) 12] ls /test_create
[seq0000000001, test1]
1.2.2 查看节点状态:stat
查看节点状态命令:
stat [-w] path
查看节点状态参数说明:
- -w : 给指定节点设置监视器。该监视器在 修改节点数据(set)/删除当前节点(delete/deleteall/rmr)的时候触发,注意增删子节点以及修改子节点数据不会出发当前监视器。
查看节点状态实例:
[zk: 127.0.0.1:2181(CONNECTED) 25] stat -w /test_create
cZxid = 0xd0000003b
ctime = Sun Dec 22 17:56:35 CST 2019
mZxid = 0xd00000047
mtime = Sun Dec 22 18:10:03 CST 2019
pZxid = 0xd00000046
cversion = 8
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 2
[zk: 127.0.0.1:2181(CONNECTED) 26]
[zk: 127.0.0.1:2181(CONNECTED) 26] deleteall /test_create
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/test_create
1.2.3 获取节点数据:get
获取节点数据命令:
get [-s] [-w] path
获取节点数据选项说明:
- -s : 除了获取节点存储的数据外,并查看当前节点的stat状态
- -w: 给指定节点设置监视器。该监视器在 修改节点数据(set)/删除当前节点(delete/deleteall/rmr)的时候触发,注意增删子节点以及修改子节点数据不会出发当前监视器。
获取节点数据实例:
[zk: 127.0.0.1:2181(CONNECTED) 39] get /test
123
[zk: 127.0.0.1:2181(CONNECTED) 40] get -s /test
123
cZxid = 0x900000003
ctime = Tue Dec 17 15:10:36 CST 2019
mZxid = 0xd00000050
mtime = Sun Dec 22 18:16:52 CST 2019
pZxid = 0xa00000048
cversion = 6
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 6
[zk: 127.0.0.1:2181(CONNECTED) 41] get -w /test
123
[zk: 127.0.0.1:2181(CONNECTED) 42] set /test 123
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/test
1.2.4 设置节点数据:set
设置节点数据命令
set [-s] [-v version] path data
设置节点数据选项:
- -s : 设置节点内容之后,输出当前节点的stat信息
- -v:设置节点时指定数据版本,若当前节点版本与指定版本不一致,则设置节点数据失败。该选项在多个客户端同时操作同一个数据的时候有很大用处,防止不同客户端相互覆盖导致节点数据最终不是想要的状态。添加版本号保证了不同客户端设置节点数据的顺序性。
- path:待设置的节点路径
- data:指定节点数据
设置节点数据实例:
[zk: 127.0.0.1:2181(CONNECTED) 45] set /test -s 456
cZxid = 0x900000003
ctime = Tue Dec 17 15:10:36 CST 2019
mZxid = 0xd00000053
mtime = Sun Dec 22 18:19:51 CST 2019
pZxid = 0xa00000048
cversion = 6
dataVersion = 4
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 6
[zk: 127.0.0.1:2181(CONNECTED) 46] get /test
456
# 设置数据版本号错误,报错
[zk: 127.0.0.1:2181(CONNECTED) 47] set -v 3 /test 789
version No is not valid : /test
[zk: 127.0.0.1:2181(CONNECTED) 49] set -v 4 /test 789
[zk: 127.0.0.1:2181(CONNECTED) 50] get /test
789
1.2.5 查看子节点数据:ls
查看子节点数据命令:
ls [-s] [-w] [-R] path
查看子节点数据选项说明:
- -s : 查看当前子节点并输出当前节点的状态
- -w : 给当前节点设置监视器。当 该节点下创建子节点或者删除子节点,删除当前节点的时候 触发该监视器。注意子节点下创建子节点,不触发当前监视器。
- -R : 递归查询当前节点下的子节点信息。
查看子节点数据实例:
[zk: 127.0.0.1:2181(CONNECTED) 65] ls /test
[10000000001, 123, 2]
# 查看子节点并显示当前节点的状态
[zk: 127.0.0.1:2181(CONNECTED) 66] ls -s /test
[10000000001, 123, 2]cZxid = 0xd00000064
ctime = Sun Dec 22 18:29:47 CST 2019
mZxid = 0xd00000064
mtime = Sun Dec 22 18:29:47 CST 2019
pZxid = 0xd00000067
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 3
# 查看节点并创建监视器
[zk: 127.0.0.1:2181(CONNECTED) 67] ls -w /test
[10000000001, 123, 2]
[zk: 127.0.0.1:2181(CONNECTED) 68] create /test/1/1
Node does not exist: /test/1/1
# 创建子节点 监视器被触发
[zk: 127.0.0.1:2181(CONNECTED) 69] create /test/4
Created /test/4
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/test
1.2.6 查看子节点数据以及当前节点状态:ls2(已废弃)
该命令已经废弃,官方不建议使用,使用ls -s 命令替代
1.2.7 删除znode节点:delete
删除znode节点命令:
# 注意当znode节点下有子节点,该命令出错,使用deleteall替代
delete [-v version] path
删除znode节点命令选项:
- -v : 指定删除节点的版本,若当前节点版本与指定版本不一致,删除失败。该参数有效的保证了多个客户端操作同一个znode的顺序性。
删除znode节点实例:
[zk: 127.0.0.1:2181(CONNECTED) 74] ls /test
[10000000001, 123, 2, 4]
[zk: 127.0.0.1:2181(CONNECTED) 75] delete /test
Node not empty: /test
[zk: 127.0.0.1:2181(CONNECTED) 76] ls /test3
[]
[zk: 127.0.0.1:2181(CONNECTED) 77] delete /test3
[zk: 127.0.0.1:2181(CONNECTED) 78] ls /
[test, test%10d0000000039, test4, zookeeper]
1.2.8 递归删除znode节点:deleteall
递归删除znode节点命令:
deleteall path
删除znode节点实例:
[zk: 127.0.0.1:2181(CONNECTED) 79] ls /test
[10000000001, 123, 2, 4]
[zk: 127.0.0.1:2181(CONNECTED) 80] deleteall /test
[zk: 127.0.0.1:2181(CONNECTED) 81] ls /
[test%10d0000000039, test4, zookeeper]
1.2.9 递归删除znode节点:rmr(已废弃)
该命令已经废弃,官方不建议使用,使用deleteall命令替代
1.3 配额相关命令
节点配额类型:
在zookeeper中,我们可以对znode节点进行两个维度的限制,这个限制也较多znode节点的配额。分别是从namespace和bytes两方面对znode进行限制。
- namespace配额:该配额表示当前节点的子节点个数不能超过n,该限制包括当前节点本身、当前节点的子节点、以及递归的所有子节点个数。
- bytes配额:该配额表示当前节点下的数据不能超过b,该限制为当前节点数据、当前节点的子节点以及递归的所有子节点数据量之和。
节点配额的相关特点:
- 1、对指定节点设置配额之后,该配额信息存储在zookeeper的固定目录/zookeeper/quota下
- 2、当节点的数据超过该节点设置的配额之后,客户端依然可以对当前节点进行操作,但是zookeeper将会在服务端日志中打印warning信息
- 3、不能在同一个session中对节点同时设置两种配额,同时设置两种配额会报错。
1.3.1 设置znode配额:setquota
设置znode配额命令:
setquota -n|-b val path
设置znode配额选项:
- -n val :设置namespace 配额属性,表示当前节点下的子节点数量不能超过val(包括节点本身)
- -b val:设置 bytes配额属性,表示当前节点下的数据量总和不能超过val(包括节点本身)
设置znode配额实例:
# 设置配额当前节点下的子节点数不能超过3
[zk: 127.0.0.1:2181(CONNECTED) 1] setquota /test_namespace -n 3
# 查看节点配额
[zk: 127.0.0.1:2181(CONNECTED) 2] listquota /test_namespace
absolute path is /zookeeper/quota/test_namespace/zookeeper_limits
Output quota for /test_namespace count=3,bytes=-1
Output stat for /test_namespace count=1,bytes=0
# 查看zk中配额配置相关文件
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /zookeeper/quota/test_namespace
[zookeeper_limits, zookeeper_stats]
[zk: 127.0.0.1:2181(CONNECTED) 4] get /zookeeper/quota/test_namespace/zookeeper_limits
count=3,bytes=-1
[zk: 127.0.0.1:2181(CONNECTED) 5] get /zookeeper/quota/test_namespace/zookeeper_stats
count=1,bytes=0
[zk: 127.0.0.1:2181(CONNECTED) 6] create /test_namespace/123
Created /test_namespace/123
# 可以看到 我们只创建了一个子节点,当前配额状态为2,说明包括了节点本身
[zk: 127.0.0.1:2181(CONNECTED) 7] listquota /test_namespace
absolute path is /zookeeper/quota/test_namespace/zookeeper_limits
Output quota for /test_namespace count=3,bytes=-1
Output stat for /test_namespace count=2,bytes=0
# 设置配额最大为12个字节
[zk: 127.0.0.1:2181(CONNECTED) 1] setquota -b 12 /test_bytes
# 查看配额生效
[zk: 127.0.0.1:2181(CONNECTED) 2] listquota /test_bytes
absolute path is /zookeeper/quota/test_bytes/zookeeper_limits
Output quota for /test_bytes count=-1,bytes=12
Output stat for /test_bytes count=1,bytes=0
[zk: 127.0.0.1:2181(CONNECTED) 3] set /test_bytes 1234
[zk: 127.0.0.1:2181(CONNECTED) 4] listquota /test_bytes
absolute path is /zookeeper/quota/test_bytes/zookeeper_limits
Output quota for /test_bytes count=-1,bytes=12
Output stat for /test_bytes count=1,bytes=4
[zk: 127.0.0.1:2181(CONNECTED) 5] create /test_bytes/12 123
Created /test_bytes/12
[zk: 127.0.0.1:2181(CONNECTED) 6] listquota /test_bytes
absolute path is /zookeeper/quota/test_bytes/zookeeper_limits
Output quota for /test_bytes count=-1,bytes=12
Output stat for /test_bytes count=2,bytes=7
注意事项:
在同一个session中对不同节点分别设置namespace和bytes配额,设置第一个节点成功,但是设置第二个节点的时候会报错,目前还不清楚原因,必现。
org.apache.commons.cli.AlreadySelectedException: The option 'n' was specified but an option from this group has already been selected: 'b'
1.3.2 查看znode节点配额:listquota
查看znode节点配额命令:
listquota path
查看znode节点配额实例:
[zk: 127.0.0.1:2181(CONNECTED) 4] listquota /test_bytes
absolute path is /zookeeper/quota/test_bytes/zookeeper_limits
Output quota for /test_bytes count=-1,bytes=12
Output stat for /test_bytes count=1,bytes=4
1.3.3 删除znode节点配额:delquota
删除znode节点配额命令:
delquota [-n|-b] path
删除znode节点配额选项说明:
- -n:删除节点namespace配额。
- -b:删除节点bytes配额。
删除配额实例:
[zk: 127.0.0.1:2181(CONNECTED) 9] delquota /test_namespace
[zk: 127.0.0.1:2181(CONNECTED) 10] listquota /test_namespace
absolute path is /zookeeper/quota/test_namespace/zookeeper_limits
quota for /test_namespace does not exist.
1.4 权限相关命令
由于zookeeper权限控制涉及的内容比较复杂,本节讲单独出一篇文章进行讲解。
1.5 配置相关命令
zookeeper配置数据信息存储在/zookeeper/config目录中,它是zookeeper中的一个节点,节点中保存了当前zookeeper集群服务中的服务器相关信息。zookeeper提供了相关命令对服务器配置进行操作。其中包括查看和重新配置等命令。
从3.5版本之前,zookeeper的配置都是静态的,若需要对集群中的服务器进行调整(增加或者减少集群中的服务器),需要手动修改每个zk节点中的配置zoo.cfg,然后逐一对集群中的每个节点进行滚动重启。在3.5版本之后,zookeeper通过引入reconfig命令支持对zookeeper集群配置的动态更新,对服务器进行升级不需要滚动重启,而通过一个命令就可以搞定。
注意zookeeper配置中包括了一份静态配置zoo.cfg以及zookeeper服务生成的动态配置zoo.cfg.dynamic.next。我们此处命令操作的是其动态配置信息,而不是静态配置信息。
1.5.1 查看当前集群服务器配置:config
查看服务器配置命令:
config [-c] [-w] [-s]
查看服务器配置选项说明:
- -w :设置监视器。当服务器动态配置信息发生改变的时候该监视器被触发。
- -s :因为配置信息在zookeeper中也是一个znode节点,所以此参数表示返回当前配置对应的znode节点的状态信息。
查看服务器配置实例:
[zk: 127.0.0.1:2181(CONNECTED) 16] ls /zookeeper/config
[]
[zk: 127.0.0.1:2181(CONNECTED) 17] config
server.1=9.134.147.1:2888:3888:participant
server.2=9.134.147.2:2888:3888:participant
server.3=9.134.147.3:2888:3888:participant
version=0
[zk: 127.0.0.1:2181(CONNECTED) 18] config -s
server.1=9.134.147.1:2888:3888:participant
server.2=9.134.147.2:2888:3888:participant
server.3=9.134.147.3:2888:3888:participant
version=0
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Sat Dec 14 23:00:03 CST 2019
pZxid = 0x0
cversion = 0
dataVersion = -1
aclVersion = -1
ephemeralOwner = 0x0
dataLength = 142
numChildren = 0
1.5.2 动态修改服务器配置:reconfig
动态修改服务器配置命令:
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
该命令具体用法会在后续的zk集群扩扩缩容文章中详细讲解。
1.6 监视器相关命令
1.6.1 是否输出watch事件开关:printwatches
是否输出watch事件开关命令:
printwatches on|off
是否输出watch事件开关实例:
# 查看当前输出watch事件状态为开启中
[zk: localhost:2181(CONNECTED) 38] printwatches
printwatches is on
[zk: localhost:2181(CONNECTED) 39] get -w /test
124
# 开启状态下watch事件将会打印
[zk: localhost:2181(CONNECTED) 40] set /test 12
WATCHER::
[zk: localhost:2181(CONNECTED) 41]
WatchedEvent state:SyncConnected type:NodeDataChanged path:/test
# 关闭输出watch事件状态
[zk: localhost:2181(CONNECTED) 41] printwatches off
[zk: localhost:2181(CONNECTED) 42] printwatches
printwatches is off
[zk: localhost:2181(CONNECTED) 43] get -w /test
12
# 触发事件时无打印输出
[zk: localhost:2181(CONNECTED) 44] set /test 2
1.6.2 删除监视器:removewatches
删除监视器命令:
removewatches path [-c|-d|-a] [-l]
使用实例:
[zk: localhost:2181(CONNECTED) 2] get -w /test
12
# 正常情况下,设置节点内容,监视器生效
[zk: localhost:2181(CONNECTED) 3] set /test 1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/test
[zk: localhost:2181(CONNECTED) 4]
[zk: localhost:2181(CONNECTED) 4] get -w /test
1
# 删除监视器
[zk: localhost:2181(CONNECTED) 5] removewatches /test -l
WATCHER::
[zk: localhost:2181(CONNECTED) 6]
WatchedEvent state:SyncConnected type:DataWatchRemoved path:/test
# 删除监视器之后,设置节点内容不再触发。
[zk: localhost:2181(CONNECTED) 6] set /test 1
1.7 其他命令
1.7.1 强制数据同步:sync
在进行更新命令的时候,由于在更新半数服务器以上的生效,就算当前更新命令完成,这样可能导致半数以上服务器之外的服务器数据还没有进行同步,在客户端获取数据之前执行该命令,可以强制同步客户端为最新数据,使得拿到的数据一定是最新数据。
强制同步数据命令:
sync path
强制同步命令实例:
[zk: localhost:2181(CONNECTED) 9] sync /test
Sync is OK
[zk: localhost:2181(CONNECTED) 10] get /test
1
1.7.2 显示历史之行命令:history
[zk: localhost:2181(CONNECTED) 12] history
2 - get -w /test
3 - set /test 1
4 - get -w /test
5 - removewatches /test -l
6 - set /test 1
7 - get -w /test
8 - removewatches /test
9 - sync /test
10 - get /test
11 - hisitory
12 - history
1.7.3 重新之行指定命令:redo
[zk: localhost:2181(CONNECTED) 12] history
2 - get -w /test
3 - set /test 1
4 - get -w /test
5 - removewatches /test -l
6 - set /test 1
7 - get -w /test
8 - removewatches /test
9 - sync /test
10 - get /test
11 - hisitory
12 - history
[zk: localhost:2181(CONNECTED) 13] redo 9
Sync is OK