文章目录
- [ZooKeeper 实战(二) 命令行操作篇](#ZooKeeper 实战(二) 命令行操作篇)
-
- [1. 服务端命令](#1. 服务端命令)
-
- [1.1. 服务启动](#1.1. 服务启动)
- [1.2. 查看服务](#1.2. 查看服务)
- [1.3. 重启服务](#1.3. 重启服务)
- [1.4. 停止服务](#1.4. 停止服务)
- [2. 客户端命令](#2. 客户端命令)
-
- [2.1. 启动客户端](#2.1. 启动客户端)
- [2.2. 查看节点信息](#2.2. 查看节点信息)
-
- [查看根节点详情 `ls -s /`](#查看根节点详情
ls -s /
) - [添加一个watch监视器 `ls -w /`](#添加一个watch监视器
ls -w /
) - [列举出节点的级联节点 `ls -R /`](#列举出节点的级联节点
ls -R /
)
- [查看根节点详情 `ls -s /`](#查看根节点详情
- [2.3. 查看节点状态](#2.3. 查看节点状态)
- [2.4. 创建节点](#2.4. 创建节点)
-
- [创建有序节点`create -s /test/name`](#创建有序节点
create -s /test/name
) - [创建临时节点`create -e /test/temporary`](#创建临时节点
create -e /test/temporary
) - [创建TTL节点`create -t 10000 /test/temporary`](#创建TTL节点
create -t 10000 /test/temporary
) - [创建带数据的持久节点`create /test/data "测试"`](#创建带数据的持久节点
create /test/data "测试"
)
- [创建有序节点`create -s /test/name`](#创建有序节点
- [2.5. 修改节点内容](#2.5. 修改节点内容)
-
- [更新节点数据并显示节点状态信息`set -s /test/data "new value"`](#更新节点数据并显示节点状态信息
set -s /test/data "new value"
) - [指定数据版本号`set -s -v 1 /test/data "new new value"`](#指定数据版本号
set -s -v 1 /test/data "new new value"
)
- [更新节点数据并显示节点状态信息`set -s /test/data "new value"`](#更新节点数据并显示节点状态信息
- [2.6. 查看节点内容](#2.6. 查看节点内容)
- [2.7. 删除节点](#2.7. 删除节点)
- [2.8. 级联删除节点(删除包含子节点的节点)](#2.8. 级联删除节点(删除包含子节点的节点))
- [2.9. 关闭连接](#2.9. 关闭连接)
- [2.10. 建立连接](#2.10. 建立连接)
- [2.11. 操作记录](#2.11. 操作记录)
- [2.12. 其他操作命令](#2.12. 其他操作命令)
- [3. Watcher事件监听器](#3. Watcher事件监听器)
-
- [3.1. 一次性监听](#3.1. 一次性监听)
- [3.2. 永久监听](#3.2. 永久监听)
- [4. ACL权限控制](#4. ACL权限控制)
-
- [4.1. 添加权限](#4.1. 添加权限)
- [4.2. 设置权限](#4.2. 设置权限)
- [4.3. 查看权限](#4.3. 查看权限)
ZooKeeper 实战(二) 命令行操作篇
1. 服务端命令
在学习以下执行命令前,请先创建一个单机版的zookeeper实例,详细过程参考上一篇博客。cd
进入zookeeper安装包解压文件夹的bin目录下。在博主电脑上执行cd /Users/admin/zk/standalone/bin
。
1.1. 服务启动
sh
./zkServer.sh start
1.2. 查看服务
sh
./zkServer.sh status
1.3. 重启服务
sh
./zkServer.sh restart
1.4. 停止服务
sh
./zkServer.sh stop
2. 客户端命令
2.1. 启动客户端
sh
# 如果是本地执行可以省略 -server ip:port. 直接./zkCli.sh
./zkCli.sh -server ip:port
#./zkCli.sh
2.2. 查看节点信息
sh
ls [-s] [-w] [-R] path
# 参数说明:
# -s:显示节点详情,包括状态信息
# -w:添加watch监视器,节点数据变更时,会通知客户端(通知是一次性的),注意和get中监听器的区别。
# -R:列举出节点的级联节点
# path:显示某目录下节点/文件
查看根节点详情 ls -s /
名称 | 描述 |
---|---|
cZxid | 节点创建时的zxid |
ctime | 节点创建时间 |
mZxid | 节点最近一次更新时的zxid |
mtime | 节点最近一次更新的时间 |
pZxid | 操作当前节点的子节点列表的事物ID(这种操作包含增加子节点,删除子节点) |
cversion | 子节点数据更新次数 |
dataVersion | 本节点数据更新次数 |
aclVersion | 节点ACL(授权信息)的更新次数 |
ephemeralOwner | 如果该节点为临时节点,ephemeralOwner值表示与该节点绑定的session id。如果该节点不是临时节点,ephemeralOwner值为0 |
dataLength | 节点数据长度 |
numChildren | 子节点个数 |
添加一个watch监视器 ls -w /
列举出节点的级联节点 ls -R /
2.3. 查看节点状态
sh
stat [-w] path
# 参数说明
# -w:添加watch监视器
2.4. 创建节点
sh
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
# 参数说明
# -s:有序节点
# -e:临时节点,不加此参数表示默认持久节点
# -c:容器节点
# -t:过期时间,类似于redis的expire设置过期,单位:毫秒
# [data]:节点的数据,可选,如果不使用时,节点数据就为null
# [acl]:权限相关
创建有序节点create -s /test/name
创建临时节点create -e /test/temporary
创建TTL节点create -t 10000 /test/temporary
默认禁用,需要在zoo.cfg中添加 extendedTypesEnabled=true 开启。 注意:ttl不能用于临时节点
如果出现
KeeperErrorCode = Unimplemented for /.....
可能表示禁用
创建带数据的持久节点create /test/data "测试"
2.5. 修改节点内容
sh
set [-s] [-v version] path data
# 参数说明
# -s:更新节点数据并显示节点状态信息
# -v:指定数据版本号,如果指定的数据版本号和数据当前版本号不一致,则更新失败
# data:更新的数据内容
更新节点数据并显示节点状态信息set -s /test/data "new value"
指定数据版本号set -s -v 1 /test/data "new new value"
2.6. 查看节点内容
sh
get [-s] [-w] path
# 参数说明
# -s:查看节点数据以及节点状态信息
# -w:添加watch监视器,节点数据变更时,会通知客户端(通知是一次性的)。ls -w是针对节点(目录)的变化监听,get -w是针对节点中数据的变化监听
2.7. 删除节点
sh
delete [-v version] path
# 参数说明
# -v:指定数据版本号,如果指定的数据版本号和数据当前版本号不一致,则删除失败
注意此方法只能删除不包含子节点的节点
2.8. 级联删除节点(删除包含子节点的节点)
sh
deleteall path [-b batch size]
# 参数说明
# -b:分批删除
# batch size:每批删除数量
2.9. 关闭连接
sh
close
2.10. 建立连接
sh
connect host:port
2.11. 操作记录
sh
history
# 显示最近的11条操作记录
2.12. 其他操作命令
sh
# 退出客户端
quit
# 获取版本信息
version
# 显示当前操作用户和ip
whoami
# 强制同步节点,这需要在ZooKeeper集群中使用,如果对节点数据的实时性要求很高,可以使用该命令。
sync path
# 获取指定节点下的子孙节点数量(不只是直接子节点,也包含间接子节点)
getAllChildrenNumber
3. Watcher事件监听器
Watcher是ZooKeeper的重要功能。ZooKeeper允许用户在指定Znode注册 Watcher(绑定监听事件),当特定事件触发时(节点数据变更、节点删除、子节点状态变更等事件),ZooKeeper服务端会将事件通知到注册过该事件Watcher的客户端,该机制是ZooKeeper实现分布式协调服务的重要特性,通过这个事件机制,可以基于ZooKeeper实现分布式锁、集群管理等功能。
Watcher特性:比如当节点数据发生变化的时候,ZooKeeper会产生一个Watcher事件,并且会发送到客户端,客户端收到监听的节点事件后,就可以进行相应的业务处理了(可以实现发布与订阅)。ZooKeeper的Watcher机制,可以分为三个过程:客户端注册Watcher、服务端处理Watcher和客户端回调。
3.1. 一次性监听
在上一节,客户端命令中会看到 -w
参数,通过这个参数指定的都是一次性监听器,不会重复触发。
ls -w
: 监听节点变化,节点或者子节点发生改变时触发
get -w
:监听节点数据变化,子节点的数据变化不会触发。
3.2. 永久监听
Zookeeper 3.6.0版本之后,客户端可以在节点上创建永久监听,永久监听在被触发后不会被删除。
添加永久监听器
sh
addWatch [-m mode] path
# 参数说明
# -m:监听模式
# mode:[PERSISTENT, PERSISTENT_RECURSIVE]
# PERSISTENT - 表示该节点的数据变化以及子节点的变化会触发相应事件,子节点的数据变化不会触发。
# PERSISTENT_RECURSIVE - 表示该节点的数据变化以及所有子孙节点的目录或者数据变化都会触发相应事件。
PERSISTENT
sh
addWatch -m PERSISTENT /name
PERSISTENT_RECURSIVE
sh
addWatch -m PERSISTENT_RECURSIVE /fi
移除监听器
sh
removewatches path [-c|-d|-a] [-l]
# 参数说明
# -c:表示取消节点变化类型监听器(ls -w)
# -d:表示取消数据更新类型监听器(get -w)
# -a:表示取消对所有子节点的监听
# -l:表示显示当前节点上的所有监听
4. ACL权限控制
在介绍命令之前需要了解以下知识:
ZooKeeper 采用 ACL(Access Control Lists)策略来进行权限控制。ACL权限控制使用 scheme:id:permission
来标识,主要涵盖3个方面:验证模式(scheme),具体内容(Id),权限控制(perms)
验证模式(Scheme)
- world:开放模式,world表示任意客户端都可以访问(默认设置)。
- auth:只有在会话中通过了认证才可以访问,代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)。
- digest:与auth类似,区别在于auth用明文密码,而digest用SHA1+base64加密后的密码(通过addauth命令,实际场景中digest更常见)。
- ip:限定客户端IP防问。
具体内容(Id)
id表示 用户名:密码。不同的模式有不同的表达方式。如下所示,是整个acl表达式的形式,除去验证模式和权限控制剩下的,也就是中间内容表示id。
- world:
word:anyone:[permissions]
- auth:
auth:user:password:[permissions]
- digest:
digest:user:BASE64(SHA1(password)):[permissons]
- ip:
ip:127.0.0.1:[permissions]
权限控制(Permissions)
ZooKeeper 定义了如下5种权限。
-
CREATE: 创建子节点的权限。
-
READ: 获取节点数据和子节点列表的权限。
-
WRITE:更新节点数据的权限。
-
DELETE: 删除子节点的权限。
-
ADMIN: 设置节点ACL的权限。
注意:CREATE 和 DELETE 都是针对子节点的权限控制。
4.1. 添加权限
sh
addauth scheme auth
# 参数说明
# scheme:格式为:digest username:password,其中digest是授权方式
# auth:分配权限,crwda。如果不写时表示创建用户,可以通过setAcl命令来设置权限
4.2. 设置权限
sh
setAcl [-s] [-v version] [-R] path acl
# 参数说明
# -s:查看节点数据以及节点状态信息
# -v:指定数据版本号
# -R:递归遍历节点的子节点(列举出节点的级联节点)
4.3. 查看权限
sh
getAcl [-s] path
# 参数详解
# -s:查看节点数据以及节点状态信息