1、zkCli.sh脚本的使用方法
- 官方手册:https://zookeeper.apache.org/doc/current/zookeeperCLI.html
1.1、连接和退出ZooKeeper服务器
1、连接到ZooKeeper服务器
- 使用ZooKeeper客户端(zkCli.sh)连接到ZooKeeper服务器的语法是:
zkCli.sh -timeout 5000 -r -server ip1:port1[,ip2:port2,ip3:port3] -timeout:表示客户端向ZooKeeper服务器发送心跳的时间间隔,单位为毫秒。因为客户端与服务器的连接状态是通过心跳检测来维护的,如果在指定的时间间隔内,客户端没有向服务器发送心跳包,服务器则会断开与客户端的连接。参数5000,表示客户端向服务器发送心跳的间隔为5秒。 -r:表示客户端以只读模式连接 -server:指定客户端要连接的服务器IP与端口,服务器默认的端口为2181
示例:
]# zkCli.sh #相当于zkCli.sh -server 127.0.0.1:2181 ]# zkCli.sh -timeout 5000 -r -server 10.1.1.10:2181 --会随机连接到后面三个ZooKeeper服务器之一 ]# zkCli.sh -server 10.1.1.10:2181,10.1.1.11:2181,10.1.1.12:2181
2、关闭连接
- close命令会关闭当前客户端连接
[zk: localhost:2181(CONNECTED) 0] close WATCHER:: WatchedEvent state:Closed type:None path:null 2021-12-26 21:48:31,454 [myid:] - INFO [main:ZooKeeper@1422] - Session: 0x100001117980000 closed 2021-12-26 21:48:31,459 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@524] - EventThread shut down for session: 0x100001117980000
3、连接到ZooKeeper服务器
connect [host:port] host:port:ZooKeeper服务器IP和端口
示例:
[zk: localhost:2181(CLOSED) 1] connect 127.0.0.1:2181
4、退出zkCli.sh终端
[zk: 127.0.0.1:2181(CONNECTED) 2] quit WATCHER:: WatchedEvent state:Closed type:None path:null 2021-12-26 21:49:06,266 [myid:] - INFO [main:ZooKeeper@1422] - Session: 0x100001117980001 closed 2021-12-26 21:49:06,269 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@524] - EventThread shut down for session: 0x100001117980001
1.2、查询znode
1、查询子znode列表
ls [-s] [-w] [-R] path path:znode路径 -s:显示path状态(元数据)的详细信息 -w:监听path的子znode列表变化(如果path下子znode的数量有变化,就会触发监视点) -R:递归显示子znode --ls2已弃用 ls2 path [watch]
示例:
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 1] 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 [zk: localhost:2181(CONNECTED) 2] ls -R / / /zookeeper /zookeeper/config /zookeeper/quota [zk: localhost:2181(CONNECTED) 3] ls -w / [zookeeper]
2、获取znode状态
stat [-w] path path:znode路径 -w:监听path znode的状态(元数据)变化
示例:
[zk: localhost:2181(CONNECTED) 8] stat /test1 cZxid = 0x100000011 --cZxid:创建znode的事务id ctime = Sun Dec 26 19:33:43 CST 2021 --ctime:创建znode的时间 mZxid = 0x100000011 --mZxid:修改znode的事务id mtime = Sun Dec 26 19:33:43 CST 2021 --mtime:修改znode的时间 pZxid = 0x100000011 --pZxid:子znode列表最后一次修改的事务id。删除或添加子znode,不包含修改子znode的数据。 cversion = 0 --cversion:子znode的版本号,删除或添加子znode,版本号会自增 dataVersion = 0 --dataVersion:znode数据版本号,数据写入操作,版本号会递增 aclVersion = 0 --aclVersion:znode ACL权限版本,权限写入操作,版本号会递增 ephemeralOwner = 0x0 --ephemeralOwner:临时znode创建时的事务id,如果是永久znode,则它的值为0 dataLength = 0 --dataLength:znode数据长度(单位:byte),中文占3个byte numChildren = 0 --numChildren:子znode数量
1.3、创建、删除znode
1、创建znode
create [-s] [-e] [-c] [-t ttl] path [data] [acl] path:znode路径 -s:创建有序znode。(自动为有序znode加上编号) -e:创建临时znode,默认是持久znode。(会话断开时,该会话的临时znode被删除) -c:创建容器znode。当容器的最后一个子容器被删除时,该容器将被删除 -t:创建TTL节点。需要在zoo.cfg中设置zookeeper.extendedTypesEnabled=true data:存储在znode中的数据 acl:设置子znode访问权限,默认所有人都可以对该znode进行读写操作
示例:
--创建持久znode [zk: localhost:2181(CONNECTED) 0] create /test1 Created /test1 --创建临时znode [zk: localhost:2181(CONNECTED) 1] create -e /test2 Created /test2 --创建持久有序的znode [zk: localhost:2181(CONNECTED) 2] create -s /test3 Created /test30000000001 --创建临时有序的znode [zk: localhost:2181(CONNECTED) 3] create -e -s /test4 Created /test40000000001
2、删除znode
--删除znode,该znode不能有子znode delete [-v version] path path:znode路径 -v:znode版本号(znode状态cversion的值)。如果传递了版本号,则必须保证和服务器上的版本号一致,否则会报错:version No is not valid --删除znode,包含其子znode(会递归删除子znode,再删除znode本身) deleteall path --已弃用 rmr path
示例:
[zk: localhost:2181(CONNECTED) 0] delete /test1 [zk: localhost:2181(CONNECTED) 1] delete /test2 Node not empty: /test2 [zk: localhost:2181(CONNECTED) 2] deleteall /test2
1.4、查看、设置znode数据
1、获取znode数据
get [-s] [-w] path path:znode路径 -s:显示path状态(元数据)的详细信息 -w:监视path znode中的数据变化
2、设置znode数据
set [-s] [-v version] path data path:znode路径 data:znode数据 -s:显示path状态(元数据)的详细信息 -v:数据版本号(znode状态dataVersion的值)。如果传递了版本号,则必须保证和服务器上的版本号一致,否则会报错。
1.5、znode配额
1、查询znode配额
listquota path path:znode路径
2、设置znode配额
- znode可以存储数据,也可以创建子znode,但是如果不做控制,znode数据可以无限大,子znode数量也可以创建无数个,所以在有些场景下需要对znode的数据和子znode的数量需要做一些限制,zk为我们提供了setauota命令实现对子znode的限制功能。但是,zk并不是真正在的物理上对znode做了限制,而是如果超过了znode限制,会在zk的日志文件中记录配额超限的警告信息。
setquota -n|-b val path path:znode路径 -n:限制子znode的数量 -b:限制znode的数据长度 val:如果参数是-n,val表示限制子znode的数量。如果参数是-b,val表示限制znode的数据长度
3、删除znode配额
delquota [-n|-b] path path:znode路径 -n:删除子znode数量配额限制 -b:删除znode数据长度配额限制
示例:
[zk: localhost:2181(CONNECTED) 0] create /test1 Created /test1 --查看/test1的配额 [zk: localhost:2181(CONNECTED) 1] listquota /test1 absolute path is /zookeeper/quota/test1/zookeeper_limits quota for /test1 does not exist. --设置/test1的配额 [zk: localhost:2181(CONNECTED) 2] setquota -n 2 /test1 [zk: localhost:2181(CONNECTED) 3] listquota /test1 absolute path is /zookeeper/quota/test1/zookeeper_limits Output quota for /test1 count=2,bytes=-1 --表示znode的配额信息,限制该znode最多有2个子znode,znode数据为-1,表示不限制 Output stat for /test1 count=1,bytes=0 --表示当前znode的状态信息,该znode有1个子znode,znode数据长度为0 --删除/test1的配额 [zk: localhost:2181(CONNECTED) 4] delquota /test1 [zk: localhost:2181(CONNECTED) 5] listquota /test1 absolute path is /zookeeper/quota/test1/zookeeper_limits quota for /test1 does not exist.
1.6、znode的ACL
1、获取znode ACL
getAcl [-s] path path:znode路径 -s:显示path状态(元数据)的详细信息
2、设置znode ACL
- 创建znode时如果没有设置acl权限,默认为所有用户都可以对该znode进行读写操作。
setAcl [-s] [-v version] [-R] path acl path:znode路径 acl:设置子znode访问权限,默认所有人都可以对该znode进行读写操作 -s:显示path状态(元数据)的详细信息 -v:acl版本号(znode状态aclVersion的值)。如果传递了版本号,则必须保证和服务器上的版本号一致,否则会报错。 -R:递归设置acl
示例:
[zk: localhost:2181(CONNECTED) 0] create /test1 Created /test1 [zk: localhost:2181(CONNECTED) 1] getAcl /test1 'world,'anyone : cdrwa [zk: localhost:2181(CONNECTED) 2] setAcl /test1 ip:10.1.1.12:cdrwa [zk: localhost:2181(CONNECTED) 3] getAcl /test1 --要操作该znode,需要登录zkCli.sh -server 10.1.1.12:2181 Authentication is not valid : /test1
1.7、历史命令
1、查看历史命令
history
2、执行历史命令
redo cmdno cmdno:历史命令编号
示例:
[zk: localhost:2181(CONNECTED) 0] ls / [test1, zookeeper] [zk: localhost:2181(CONNECTED) 1] get /zookeeper ss [zk: localhost:2181(CONNECTED) 2] history --查看历史命令 0 - ls / 1 - get /zookeeper 2 - history [zk: localhost:2181(CONNECTED) 3] redo 0 --执行历史命令 [test1, zookeeper]
1.8、服务器配置
1、配置信息
- 显示仲裁成员的配置
config [-c] [-w] [-s]
2、重新配置信息
- 在运行时更改集群的成员。
- 先决条件:
- 在zoo.cfg中设置reconfigEnabled=true
- 添加超级用户或skipAcl,否则将得到“权限不足”。(e.g. addauth digest zookeeper:admin)
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] -s: -v:如果传递了版本号,则必须保证和服务器上的版本号一致,否则会报错。 -file:使用文件进行重配置。 -members:全量重配置。 -add...-remove:增量重配置。
示例:
--将服务器2改为观察者,并将其端口从2182更改为12182;将服务器5添加到集群中,并设置为观察者;将服务器4从集群中移除。 reconfig --add 2=localhost:2781:2786:observer;12182 --add 5=localhost:2781:2786:observer;2185 -remove 4 --全量重配置 reconfig -members server.1=localhost:2780:2785:participant;0.0.0.0:2181,server.2=localhost:2781:2786:observer;0.0.0.0:12182,server.3=localhost:2782:2787:participant;0.0.0.0:12183 --将当前配置更改为myNewConfig.txt中的配置 reconfig -file /data/software/zookeeper/zookeeper-test/conf/myNewConfig.txt /data/software/zookeeper/zookeeper-test/conf/myNewConfig.txt server.1=localhost:2780:2785:participant;0.0.0.0:2181 server.2=localhost:2781:2786:observer;0.0.0.0:12182 server.3=localhost:2782:2787:participant;0.0.0.0:2183 server.5=localhost:2784:2789:observer;0.0.0.0:2185
1.9、其他命令
1、给当前客户端添加授权信息
addauth scheme auth scheme:授权方式 auth:权限
2、与leader同步数据
- 在leader和follower之间同步一个节点的数据(异步同步)
sync path path:znode路径
3、打开或关闭监听日志
- 在获取znode数据、子znode列表等操作时,都可以添加watch参数监听znode的变化,从而znode数据更改、子znode列表变更时收到通知,并输出到控制台。默认是打开,可以设置参数将其关闭。
printwatches on|off on:打开 off:关闭
4、删除监听器
removewatches path [-c|-d|-a] [-l]
2、四字母命令
- 四字母命令提供了一种简单的方法来对系统进行各种检查。它的主要目的是提供一个非常简单的协议,可以与简单的工具(如telnet和nc)一起使用,以检查系统健康状况和诊断问题。
1、ruok
- 提供(有限的)服务器的状态信息。如果服务器正在运行,就会返回"imok"的响应信息。事实上"OK"状态只是一个相对的概念,例如,服务器运行中,虽无法与集群中其他服务器进行通信,然而该服务器返回的状态仍然是"OK" 。对于更详细更可靠的健康状态检查,需要使用stat命令。
2、stat
- 提供了服务器的状态信息和当前活动的连接情况。状态信息包括一些基本的统计信息,还包括该服务器当前是否处于活动状态(如果它是leader或follower),该服务器所知的最后的zxid信息。某些统计信息为累计值,我们可以使用srst命令进行重置。
3、srvr
- 提供的信息与stat一样,只是忽略了连接信息。
4、mntr
- 提供了比stat命令更加详细的统计数据。每行输出的格式为:key<tab>value。(leader还将列出只用于leader的附加参数)
5、dump
- 提供会话信息,列出当前活动的会话信息以及这些会话的过期时间。该命令只能在leader上运行。
6、conf
- 列出该服务器启动时所使用的基本配置参数。
7、envi
- 列出各种Java环境参数。
8、wchs
- 列出服务器跟踪的监视点的简短摘要信息。
9、wchc
- 列出服务器跟踪的监视点的详细信息,根据会话进行分组。
10、wchp
- 列出服务器跟踪的监视点的详细信息,根据监视的znode路径进行分组。
11、cons, crst
- cons命令列出服务器上每个连接的详细统计信息。crst将所有连接计数器重置为零。
示例:
- 在没有开启可以执行四字母命令前,服务器会拒绝执行命令。
]# echo conf | nc 127.0.0.1 2181 conf is not executed because it is not in the whitelist.
- 开启执行四字母命令的权限,在zoo.cfg文件里加入配置项:
#开启四字母命令,要重启服务 4lw.commands.whitelist=*
- 使用与nc命令结合使用
]# echo ruok | nc 127.0.0.1 2181 imok
- 使用与telnet命令结合使用
]# telnet 127.0.0.1 2181 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ruok --四字母命令 imok --命令的输出 Connection closed by foreign host.