zookeeper客户端shell命令详解


​ 本文将介绍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
发布了130 篇原创文章 · 获赞 40 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/u014630623/article/details/103749028