Zookeeper-杂记

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
2
3
4
5
6
7
8
9
10
11
cZxid = 0x5000a9a4b
ctime = Thu Apr 01 23:03:14 CST 2021
mZxid = 0x5000a9a4c
mtime = Thu Apr 01 23:03:14 CST 2021
pZxid = 0x5000a9a4b
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

含义:

1
2
3
4
5
6
7
8
9
10
11
czxid:创建该节点的事务ID
ctime:创建该节点的时间
mZxid:更新该节点的事务ID
mtime:更新该节点的时间
pZxid:操作当前节点的子节点列表的事务ID(这种操作包含增加子节点,删除子节点)
cversion:当前节点的子节点版本号
dataVersion:当前节点的数据版本号
aclVersion:当前节点的acl权限版本号
ephemeralowner:当前节点的如果是临时节点,该属性是临时节点的事务ID
dataLength:当前节点的d的数据长度
numchildren:当前节点的子节点个数

2.2.1. 节点操作命令

  • 创建节点

    1
    2
    3
    4
    5
    create [-s] [-e] PATH DATA ACL`
    // 参数
    -s:顺序节点,会自动在后面添加一串数字
    -e:临时节点,若不指定,则表示持久节点;
    ACL:权限控制
  • 读取节点

    1
    2
    3
    4
    ls PATH:列出目录
    ls2 PATH:列出目录,并显示了数据的一些状态信息,等于 ls 加 stat
    stat PATH:获取指定节点的状态信息
    get PATH:获取节点数据内容和属性信息
  • 更新节点

    1
    2
    3
    set PATH DATA [VERSION]
    // 参数
    VERSION:指定数据版本,需要和当前节点的数据版本一致
  • 删除节点

    1
    2
    delete 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
2
3
getAcl <path>               # 读取ACL权限
setAcl <path> <acl> # 设置ACL权限
addauth <scheme> <auth> # 添加认证用户

5. 实战

1
2
3
4
5
6
7
8
// 查看根节点权限
getAcl /
// 添加用户
addauth digest zk:zk
// 根节点添加权限
setAcl / auth::cdrwa
// 删除权限
setAcl / world:anyone:cdrwa

4. 查看日志

日志信息为二进制格式的,需要使用 zookeeper 自带的解析器来查看,命令如下:

1
2
3
4
// linux
java -cp .:slf4j-api-1.7.25.jar:zookeeper-3.6.2.jar:zookeeper-jute-3.6.2.jar org.apache.zookeeper.server.LogFormatter version-2\log.10e
// win
java -cp .;slf4j-api-1.7.25.jar;zookeeper-3.6.2.jar;zookeeper-jute-3.6.2.jar org.apache.zookeeper.server.LogFormatter version-2\log.10e

snapshot.xxx 文件是一个快照文件,用于记录 zookeeper 的树结构,查看命令:

1
2
3
4
// linux
java -cp .:slf4j-api-1.7.25.jar:zookeeper-3.6.2.jar:zookeeper-jute-3.6.2.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.10d
// win
java -cp .;slf4j-api-1.7.25.jar;zookeeper-3.6.2.jar;zookeeper-jute-3.6.2.jar org.apache.zookeeper.server.SnapshotFormatter snapshot.10d