1. wiki
1.1. 数据结构
ZK
包含文件系统,类似Unix
的树形结构,每个节点称为ZNode
,默认存储 1MB 数据,通过路径来唯一标识
1.2. 应用场景和通知机制
- 统一配置管理
- 统一集群管理
- 分布式锁
- 服务器节点动态上下线
- 软负载均衡
2. 常用命令
2.1. 服务启停
- 启动
ZK
服务:sh bin/zkServer.sh start
- 查看
ZK
服务状态:sh bin/zkServer.sh status
- 停止
ZK
服务:sh bin/zkServer.sh stop
- 重启
ZK
服务:sh bin/zkServer.sh restart
2.2. 客户端命令
./zkCli.sh
:连接本地客户端./zkCli.sh -server ip:port
:连接远端客户端help
:查看可以使用的客户端命令quit
:退出客户端
节点信息:
1 | cZxid = 0x5000a9a4b |
含义:
1 | czxid:创建该节点的事务ID |
2.2.1. 节点操作命令
创建节点
1
2
3
4
5create [-s] [-e] PATH DATA ACL`
// 参数
-s:顺序节点,会自动在后面添加一串数字
-e:临时节点,若不指定,则表示持久节点;
ACL:权限控制读取节点
1
2
3
4ls PATH:列出目录
ls2 PATH:列出目录,并显示了数据的一些状态信息,等于 ls 加 stat
stat PATH:获取指定节点的状态信息
get PATH:获取节点数据内容和属性信息更新节点
1
2
3set PATH DATA [VERSION]
// 参数
VERSION:指定数据版本,需要和当前节点的数据版本一致删除节点
1
2delete PATH [VERSION]:若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。
rmr PATH [VERSION]:删除当前路径节点及其所有子节点
3. 一些命令
1. 四字命令 The Four Letter Words
使用4个字母的短命令,利用 telnet 或 nc 监听向客户端端口发出,主要提供一些集群和连接信息。在 3.5.3 之后需要使用 4lw.commands.whitelist=*
显示开启。
四字命令 | 功能描述 |
---|---|
conf | 3.3.0版本引入的。打印出服务相关配置的详细信息 |
cons | 3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括”接受/发送”的包数量、会话id、操作延迟、最后的操作执行等等信息 |
crst | 3.3.0版本引入的。重置所有连接的连接和会话统计信息 |
dump | 列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用 |
envi | 打印出服务环境的详细信息 |
reqs | 列出未经处理的请 |
ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回”imok”,否则不做任何相应 |
stat | 输出关于性能和连接的客户端的列表 |
srst | 重置服务器的统计 |
srvr | 3.3.0版本引入的。列出连接服务器的详细信 |
wchs | 3.3.0版本引入的。列出服务器watch的详细信息 |
wchc | 3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表 |
wchp | 3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径 |
mntr | 3.4.0版本引入的。输出可用于检测集群健康状态的变量列表 |
2. http 服务 The AdminServer
利用内嵌 jetty 服务,来提供一些查询集群信息的接口服务。始于 3.5.0 版本之后,默认开启,地址为 http://localhost:8080/commands
,使用 admin.enableServer=false
关闭,使用 admin.serverPort=8081
指定端口。
3. ACL 权限 zookeeper的ACL权限控制
ACL(Access Control List)
,访问控制列表。ZooKeeper 的权限控制是基于每个 znode 节点,子节点不会继承父节点的权限,且每个 znode 支持设置多种权限控制方案和多个权限,使用 scheme:id:perm
来标识,主要涵盖 3 个方面:
Scheme
: 权限模式,授权的策略ID
: 授权对象,授权的对象Permission
权限,授予的权限
1. Scheme
采用何种方式授权
支持 4 种方式:
world
: 默认方式,相当于全部都能访问auth
: 代表已经认证通过的用户,命令行中可以通过addauth digest user:pwd
来添加当前上下文中的授权用户digest
: 即用户名:密码
方式认证,这也是业务系统中最常用的。用 username:password 字符串来产生一个 MD5 串,然后该串被用来作为ACL ID。认证是通过明文发送 username:password 来进行的,当用在 ACL 时,表达式为 username:base64 ,base64 是 password 的 SHA1 摘要的编码ip
: 使用客户端的主机 IP 作为 ACL ID 。这个 ACL 表达式的格式为addr/bits
,此时 addr 中的有效位与客户端 addr 中的有效位进行比对
2. ID
给谁授予权限
授权对象 ID 是指权限赋予的用户或者一个实体,例如:IP 地址或者机器。有 4 中权限模式:
IP
: 通常是一个 ip 或者 ip 段,如 “192.168.0.1” 或 “192.168.0.1/24”Digest
: 自定义,通常是username:BASE64(SHA-1(username:password))
,如 “foo:kWN6aNSbjcKWPqjjV7cg0N24raU==”World
: 只有一个 ID,”anyone”Super
: 同Digest
3. Permission
授予什么权限
有增、删、改、查、管理,共 5 种权限:
CREATE
: 符号c
, 可以创建子节点DELETE
: 符号d
, 可以删除子节点(仅下一级节点)READ
: 符号r
, 可以读取节点数据及显示子节点列表WRITE
: 符号w
, 可以设置节点数据ADMIN
: 符号a
, 可以设置节点访问控制列表权限
4. 相关命令
1 | getAcl <path> # 读取ACL权限 |
5. 实战
1 | // 查看根节点权限 |
4. 查看日志
日志信息为二进制格式的,需要使用 zookeeper 自带的解析器来查看,命令如下:
1 | // linux |
snapshot.xxx 文件是一个快照文件,用于记录 zookeeper 的树结构,查看命令:
1 | // linux |