一、Zookeeper常用命令
1、服务端常见命令
前面使用 Docker安装了 Zookeeper。我们可以通过
/bin/zkServer.sh
这个脚本进行服务器的相关操作:
- 启动 ZK 服务: sh bin/zkServer.sh start
- 查看 ZK 服务状态: sh bin/zkServer.sh status
- 停止 ZK 服务: sh bin/zkServer.sh stop
- 重启 ZK 服务: sh bin/zkServer.sh restart
docker进入启动好的 Zookeeper服务:
[root@centos7 ~]# docker exec -it 9bb8ce0a893f /bin/bash
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin#
2、zkCli客户端常见命令
我们可以通过
/bin/zkCli.sh
这个脚本进行与服务器之间的相关操作。
2.1 连接 zk服务端
使用
zkCli.sh -server ip:端口
连接到 ZooKeeper服务。
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin/bin# zkCli.sh -server 192.168.198.110:2181
Connecting to 192.168.198.110:2181
连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 便可以使用命令与 ZK服务进行交互了。比如:
- help:帮助命令,查看 ZK支持的所有命令
- quit:退出客户端
- ls path:查看目录下的节点
- ls -s path:查看目录下的节点和状态信息
- stat:它是status单词的缩写,主要是查看节点的状态信息。
2.2 ls命令
ls命令:查看目录下的节点信息
命令格式:ls [-s] [-w] [-R] path
- -s:显示节点详情,包括状态信息
- -w:添加一个watch监视器
- -R:列举出节点的级联节点
- path:显示某目录下节点/文件
[zk: 192.168.198.110:2181(CONNECTED)9]ls /zookeeper
[config, quota][zk: 192.168.198.110:2181(CONNECTED)10]ls -s /zookeeper
[config, quota]
cZxid = 0x0
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x0
cversion = -2
dataVersion =0
aclVersion =0
ephemeralOwner = 0x0
dataLength =0
numChildren =2[zk: 192.168.198.110:2181(CONNECTED)11]ls -R /zookeeper
/zookeeper
/zookeeper/config
/zookeeper/quota
2.2 stat命令
stat命令:查看节点状态。
命令格式:stat [-w] path
- -w:添加watch
- path:查看某目录下节点的状态
[zk: 192.168.198.110:2181(CONNECTED)12]stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x0
cversion = -2
dataVersion =0
aclVersion =0
ephemeralOwner = 0x0
dataLength =0
numChildren =2
2.3 create命令
create命令:创建节点,默认持久节点
命令格式:create [-s] [-e] [-c] [-t ttl] path [data] [acl]
- -s:有序节点
- -e:临时节点,不加默认是持久节点
- -t ttl:带过期时间节点,比如:create ‐t 10 /ttl
Znode一般分为 4种类型:
- 持久的(persistent)
- 临时的(ephemeral)
- 持久有序的(persistent_sequential)
- 临时有序的(ephemeral_sequential)
1)创建持久节点
[zk: 192.168.198.110:2181(CONNECTED)12] create /p_node1
Created /p_node1
2)创建临时节点
[zk: 192.168.198.110:2181(CONNECTED) 5] create -e /p_node1/e_node1
Created /p_node1/e_node1
[zk: 192.168.198.110:2181(CONNECTED) 7] create -e /p_node1/e_node2 "node data"
Created /p_node1/e_node2
- 临时节点,ephemeralOwner 字段状态不为空
3)创建顺序节点
注意:
可设置的节点路径会被重命名为序列数。不设置时节点序列数前缀0开始
[zk: 192.168.198.110:2181(CONNECTED)13] create -s /p_node2/
Node does not exist: /p_node2/
[zk: 192.168.198.110:2181(CONNECTED)15] create /p_node2
Created /p_node2
[zk: 192.168.198.110:2181(CONNECTED)16] create -s /p_node2/
Created /p_node2/0000000000
[zk: 192.168.198.110:2181(CONNECTED)17] create -s /p_node2/
Created /p_node2/0000000001
[zk: 192.168.198.110:2181(CONNECTED)18] create -s /p_node2/seq_
Created /p_node2/seq_0000000002
[zk: 192.168.198.110:2181(CONNECTED)19] create -s /p_node2/seq_
Created /p_node2/seq_0000000003
4)创建ttl节点
语法:create create ‐t 过期时间 /节点路径 节点数据
- 默认禁用,需要在 zoo.cfg中添加 extendedTypesEnabled=true 开启。 注意:ttl不能用于临时节点 。
[zk: 192.168.198.110:2181(CONNECTED)25] create -t 10 /p_node1/ttl_node
KeeperErrorCode = Unimplemented for /p_node1/ttl_node
[zk: 192.168.198.110:2181(CONNECTED)27]ls -R /p_node1
/p_node1
/p_node1/e_node1
/p_node1/e_node2
2.4 set命令
set命令:修改节点内容
命令格式:set [-s] [-v version] path data
- -s:更新节点数据并显示节点状态信息
- -v 指定数据版本号,如果指定的数据版本号和数据当前版本号不一致,则更新失败。
[zk: 192.168.198.110:2181(CONNECTED)36]set /p_node1/e_node1 "set data1"[zk: 192.168.198.110:2181(CONNECTED)37]set -s /p_node1/e_node1 "set data2"
cZxid = 0x6c
ctime = Fri May 13 09:55:49 UTC 2022
mZxid = 0x80
mtime = Fri May 1310:15:46 UTC 2022
pZxid = 0x6c
cversion =0
dataVersion =6
aclVersion =0
ephemeralOwner = 0x100002513c80001
dataLength =9
numChildren =0
2.5 get命令
get命令:获取节点/文件内容
命令格式:get [-s] [-w] path
- -s:查看节点数据以及节点状态信息
- -w 添加一个watch,节点数据变更时,会通知客户端(通知是一次性的)。
[zk: 192.168.198.110:2181(CONNECTED)38] get /p_node1/e_node1
set data2
[zk: 192.168.198.110:2181(CONNECTED)39] get -s /p_node1/e_node1
set data2
cZxid = 0x6c
ctime = Fri May 13 09:55:49 UTC 2022
mZxid = 0x80
mtime = Fri May 1310:15:46 UTC 2022
pZxid = 0x6c
cversion =0
dataVersion =6
aclVersion =0
ephemeralOwner = 0x100002513c80001
dataLength =9
numChildren =0
2.6 删除节点
1)delete命令
delete命令:只能删除没有子节点的节点。如果其有子节点时,无法删除
命令格式:delete [-v version] path
2)deleteall命令
deleteall命令:级联删除该节点和子节点。
命令格式:deleteall path [-b batch size]
[zk: 192.168.198.110:2181(CONNECTED)43] delete /p_node2/seq_0000000002
[zk: 192.168.198.110:2181(CONNECTED)44]ls -R /p_node2
/p_node2
/p_node2/0000000000
/p_node2/0000000001
/p_node2/seq_0000000003
[zk: 192.168.198.110:2181(CONNECTED)45] deleteall /p_node2
[zk: 192.168.198.110:2181(CONNECTED)46]ls -R /p_node2
Node does not exist: /p_node2
其他命令:
- history:显示最近执行的11条命令的历史记录
- getAllChildrenNumber:获取节点下的所有子孙节点数量
- getEphemerals:获取当前客户端创建的所有临时节点
- ACL命令和监听命令单独来讲。
二、ACL命令
Zookeeper采用 ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制。目的为了保障数据安全性
1、ACL总体构成
Zookeeper 的 ACL(Access Control List),分为三个维度:scheme、id、permission。
通常表示为:
scheme:id:permission
来构成权限列表。
- scheme:代表采用某种权限机制
- id:代表允许访问的用户
- permissions:代表权限(组合字符串)
1)scheme:权限策略
- world : world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone:[permissions]。 world:anyone 代表任何人,zookeeper 中对所有人有权限的结点就是属于 world:anyone 的。
- auth:代表认证登录,需要注册用户有权限就可以,使用的是明文密码,形式为auth:user:password:[permissions]。 它不需要 id, 只要是通过 authentication 的 user 都有权限(zookeeper 支持通过 kerberos来进行 authencation,也支持 username/password 形式的 authentication)。
- digest:需要对密码加密才能访问,使用的是加密密码,组合形式为 digest: username:BASE64(SHA1(password)) :[permissions]。
- ip:它对应的 id 为客户机的 IP 地址,设置的时候可以设置一个 ip 段,此时限制ip进行访问。比如ip:192.168.1.1:[permissions]
- super:代表超级管理员,拥有所有的权限
2) id:用户
id 是验证模式,不同的 scheme,id 的值也不一样。默认为anyone。
- scheme 为 auth 时,id为:username:password
- scheme 为 digest 时,id为:username:BASE64(SHA1(password))
- scheme 为 ip 时,id为:客户端的 ip 地址。
- scheme 为 world 时,id为:anyone。
3)permission:权限
Zookeeper定义了五种权限:
- CREATE©:创建子节点的权限。允许创建子节点;
- DELETE(d):删除节点的权限。允许删除子节点;
- READ®:读取节点数据的权限。允许从节点获取数据并列出其子节点;
- WRITE(w):修改节点数据的权限。允许为节点设置数据;
- ADMIN(a):设置子节点权限的权限,允许为节点设置权限。
CREATE、READ、WRITE、DELETE、ADMIN 也就是增、删、改、查、管理权限,这 5 种权限简写为
crwda
(即单词的首字符缩写)。
2、ACL命令操作
2.1 getAcl命令
getAcl命令:查看指定节点 ACL信息
命令格式:getAcl [-s] path
- -s:查看节点详细信息
[zk: 192.168.198.110:2181(CONNECTED)15] getAcl /p_node1
'world,'anyone
: cdrwa
[zk: 192.168.198.110:2181(CONNECTED)17] getAcl -s /p_node1
'world,'anyone
: cdrwa
cZxid = 0x67
ctime = Fri May 13 09:53:38 UTC 2022
mZxid = 0x67
mtime = Fri May 13 09:53:38 UTC 2022
pZxid = 0x83
cversion =6
dataVersion =0
aclVersion =0
ephemeralOwner = 0x0
dataLength =0
numChildren =0
2.2 setAcl命令
setAcl命令:设置指定节点的ACL 信息
命令格式:setAcl [-s] [-v version] [-R] path acl
[zk: 192.168.198.110:2181(CONNECTED)21] create /testAcl
Created /testAcl
# 设置该节点的 acl 权限[zk: 192.168.198.110:2181(CONNECTED)22] setAcl /testAcl world:anyone:crwa
[zk: 192.168.198.110:2181(CONNECTED)23] getAcl /testAcl
'world,'anyone
: crwa
# 创建子节点[zk: 192.168.198.110:2181(CONNECTED)24] create /testAcl/xyz " xyz-data"
Created /testAcl/xyz
# 由于没有 d 权限,所以提示无法删除[zk: 192.168.198.110:2181(CONNECTED)25] delete /testAcl/xyz
Insufficient permission : /testAcl/xyz
2.3 addauth命令
addauth命令:添加认证用户
命令格式:addauth scheme auth
- scheme:(digest:是授权方式)格式为:digest username:password
- auth:就是分配权限, crwda。如果不写时表示创建用户,可以通过setAcl命令来设置权限
我们创建一个用户,并分配权限:
[zk: 192.168.198.110:2181(CONNECTED)27] addauth digest charge_admin:123456 crwda
[zk: 192.168.198.110:2181(CONNECTED)28] addauth digest charge_crw:123456 crw
给某个节点,设置用户,用户只能在分配的权限内操作。
# 添加一个用户[zk: 192.168.198.110:2181(CONNECTED)13] addauth digest user1:123456
# 给节点设置用户权限[zk: 192.168.198.110:2181(CONNECTED)14] setAcl /testAcl auth:user1:123456:crwa
# 查看节点权限,密码是以密文的形式存储的[zk: 192.168.198.110:2181(CONNECTED)15] getAcl /testAcl
'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=: crwa
[zk: 192.168.198.110:2181(CONNECTED)16] create /testAcl/ztest "data"
Created /testAcl/ztest
# 由于用户没有 d 权限,所以提示无法删除[zk: 192.168.198.110:2181(CONNECTED)17] delete /testAcl/ztest
Insufficient permission : /testAcl/ztest
没有权限,我们 quit退出,重新进入客户端,操作 /testAcl节点。
#没有用户权限无法访问[zk: 192.168.198.110:2181(CONNECTED)0]ls /testAcl
Insufficient permission : /testAcl
[zk: 192.168.198.110:2181(CONNECTED)1] create /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
# 重新新增权限后可以访问了[zk: 192.168.198.110:2181(CONNECTED)2] addauth digest user1:123456
[zk: 192.168.198.110:2181(CONNECTED)3] create /testAcl/ztest2
Created /testAcl/ztest2
[zk: 192.168.198.110:2181(CONNECTED)4]ls -R /testAcl
/testAcl
/testAcl/xyz
/testAcl/ztest
/testAcl/ztest2
# 由于用户没有 d 权限,所以提示无法删除[zk: 192.168.198.110:2181(CONNECTED)5] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
# 由于用户没有该节点的权限,所以提示无法删除[zk: 192.168.198.110:2181(CONNECTED)7] addauth digest charge_crw:123456
[zk: 192.168.198.110:2181(CONNECTED)8] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
[zk: 192.168.198.110:2181(CONNECTED)9] addauth digest charge_admin:123456
[zk: 192.168.198.110:2181(CONNECTED)10] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
权限策略 scheme相关命令,查看参考文章。
三、监听命令
Zookeeper中一个常用的功能是 Watcher(事件监听器),它允许用户在指定节点上注册 Watcher(可针对感兴趣的事件注册监听),并且在一些感兴趣的特定事件发生的时候,Watcher会被触发,Zookeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。
监听机制:客户端可以监听节点的变化,当节点发生改变时,将触发相应的事件。当事件被触发时,客户端会收到一个数据包,说明节点已经改变。
1、一次性监听
1.1 监听节点目录变化
监听节点目录变化:监听节点的子节点变化,当子节点发生改变时触发。
命令格式:ls -w path
#创建节点[zk: 192.168.198.110:2181(CONNECTED)13] create /watch_node
Created /watch_node
#监听节点目录变化[zk: 192.168.198.110:2181(CONNECTED)14]ls -w /watch_node
[][zk: 192.168.198.110:2181(CONNECTED)15] create /watch_node/w1 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node
Created /watch_node/w1
[zk: 192.168.198.110:2181(CONNECTED)17] create /watch_node/w2 data2
Created /watch_node/w2
一次性监听,触发后会被删除,无法再次触发。
1.2 监听节点数据变化
监听节点数据变化:当该节点数据发生改变时触发。子节点的数据变化不会触发。
命令格式:get -w path
# 监听节点数据变化[zk: 192.168.198.110:2181(CONNECTED)18] get -w /watch_node
null
[zk: 192.168.198.110:2181(CONNECTED)19]set /watch_node data
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node
[zk: 192.168.198.110:2181(CONNECTED)20]set /watch_node data2
一次性监听,触发后会被删除,无法再次触发。
2、永久监听
在 Zookeeper 3.6.0版本之后,客户端可以在节点上创建永久监听,永久监听在被触发后不会被删除。
命令格式:addWatch [-m mode] path
永久监听在创建时可以通过 -m 指定模式,模式分为两种:
- PERSISTENT
- PERSISTENT_RECURSIVE,不指定默认使用 PERSISTENT_RECURSIVE模式。
2.1 PERSISTENT
- PERSISTENT:该节点的数据变化以及子节点的变化会触发相应事件,子节点的数据变化不会触发。
[zk: 192.168.198.110:2181(CONNECTED)29] create /watch_node2
# 监听节点 PERSISTENT [zk: 192.168.198.110:2181(CONNECTED)30] addWatch -m PERSISTENT /watch_node2
[zk: 192.168.198.110:2181(CONNECTED)31]set /watch_node2 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node2
[zk: 192.168.198.110:2181(CONNECTED)32] create /watch_node2/w1 data
WATCHER::Created /watch_node2/w1
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node2
#子节点的数据变化不会触发[zk: 192.168.198.110:2181(CONNECTED)33]set /watch_node2/w1 data1
[zk: 192.168.198.110:2181(CONNECTED)34] delete /watch_node2/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node2
2.2 PERSISTENT_RECURSIVE
- PERSISTENT_RECURSIVE:该节点的数据变化以及所有子孙节点的目录或者数据变化都会触发相应事件。
[zk: 192.168.198.110:2181(CONNECTED)39] create /watch_node3
# 监听节点 PERSISTENT_RECURSIVE [zk: 192.168.198.110:2181(CONNECTED)40] addWatch -m PERSISTENT_RECURSIVE /watch_node3
[zk: 192.168.198.110:2181(CONNECTED)41]set /watch_node3 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node3
[zk: 192.168.198.110:2181(CONNECTED)42] create /watch_node3/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/watch_node3/w1
Created /watch_node3/w1
#子节点的数据变化也会触发[zk: 192.168.198.110:2181(CONNECTED)43]set /watch_node3/w1 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node3/w1
[zk: 192.168.198.110:2181(CONNECTED)44] delete /watch_node3/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/watch_node3/w1
四、ZooKeeper常用四字命令
Zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提交相应的命令。
四字命令格式:echo [command] | nc [ip] [port]
需要开启四字命令和安装 nc。
1)开启四字命令
如果出现 stat is not executed because it is not in the whitelist. 白名单问题表示有可能配置中未开启四字命令。
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin# ls /conf/
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
在 zoo.cfg 文件里加入配置项让这些指令放行
#开启四字命令
4lw.commands.whitelist=*
2)安装 nc
# centos
yum installnc
ZooKeeper 常用四字命令主要如下:
参考文章:
- zkCli 命令查看官方文档: - https://zookeeper.apache.org/doc/r3.8.0/zookeeperCLI.html- https://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_4lw
- ZooKeeper之常用命令大全(ACL机制/四字命令):https://blog.csdn.net/yearingforthefuture/article/details/117574486
– 求知若饥,虚心若愚。
版权归原作者 Charge8 所有, 如有侵权,请联系我们删除。