在zookeeper安装目录的bin目录下有名为 zkCli.sh 的文件,该文件可以作为客户端连接到zookeeper。

1 使用zkCli.sh连接到zookeeper

1
2
3
4
5
6
7
8
# 一般语法
./zkCli.sh -timeout 0 -r -server ip:port
# 连接到主机h1 超时时间3秒
./zkCli.sh -timeout 3000 -server h1:2181
# 有类似如下的命令提示符就表示连接成功了
[zk: h1:2181(CONNECTED) 0]

另外,我们在前面说过。整个zookeeper的节点结构就和linux文件系统是一致的。
都是只有一个最顶层的根节点,其下有若干子节点。

随便敲个字母就可以显示出使用帮助了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[zk: h1:2181(CONNECTED) 1] h
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port

2 基本命令的使用

在一定角度来说zookeeper是个存储数据的东西。
所以他的操作命令大致可以分为增删改查四类了

2.1 查询操作

  • ls path [watch]

列出指定节点,类似于linux的ls命令

1
2
3
4
5
6
7
[zk: h1:2181(CONNECTED) 8] ls /
[zookeeper]
[zk: h1:2181(CONNECTED) 9] ls /zookeeper
[quota]
[zk: h1:2181(CONNECTED) 10] ls /zookeeper/quota
[]
[zk: h1:2181(CONNECTED) 11]
  • stat path [watch]

列出指定节点的状态信息,或者说是元数据信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[zk: h1:2181(CONNECTED) 11] stat /
# 节点被创建时的事务ID
cZxid = 0x0
# 节点创建时间
ctime = Thu Jan 01 08:00:00 CST 1970
# 最近一次更新时的事务ID
mZxid = 0x0
# 最近一次更新时间
mtime = Thu Jan 01 08:00:00 CST 1970
# 该节点的子节点列表最近一次被修改的事务ID
# 添加、删除子节点会影响该值
pZxid = 0x0
# 子节点版本号
cversion = -1
# 数据版本号
dataVersion = 0
# ACL版本号
aclVersion = 0
# 创建临时节点的事务ID
# 如果是持久节点,则该值为0x0
ephemeralOwner = 0x0
# 当前节点的数据长度
dataLength = 0
# 当前节点的子节点数目
numChildren = 1
[zk: h1:2181(CONNECTED) 12] stat /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: h1:2181(CONNECTED) 13]
  • get path [watch]

可以列出指定节点的数据

1
2
get /
get /zookeeper
  • ls2 path [watch]

是ls的升级版,列出子节点的同时列出节点的状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[zk: h1:2181(CONNECTED) 15] ls2 /
[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: h1:2181(CONNECTED) 16]

2.2 创建节点

1
2
3
4
5
6
create [-s] [-e] path data acl
s:可选,表示该节点为顺序节点
e:可选,表示该节点为临时节点
path:节点路径
data:节点数据
acl:访问控制列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建节点/node_1,数据为dataOfNode_1
[zk: h1:2181(CONNECTED) 17] create /node_1 dataOfNode_1
Created /node_1
[zk: h1:2181(CONNECTED) 18] ls /
[zookeeper, node_1]
# 创建临时节点/node_1/node_1_1 11
# 在会话结束后被删除
[zk: h1:2181(CONNECTED) 20] create -e /node_1/node_1_1 11
Created /node_1/node_1_1
[zk: h1:2181(CONNECTED) 21] ls /node_1
[node_1_1]
[zk: h1:2181(CONNECTED) 22]
# 创建顺序节点/node_1/node_1_2
[zk: h1:2181(CONNECTED) 22] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000001
[zk: h1:2181(CONNECTED) 23] create -s /node_1/node_1_3 13
Created /node_1/node_1_30000000002
[zk: h1:2181(CONNECTED) 26] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000003
[zk: h1:2181(CONNECTED) 27] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000004
[zk: h1:2181(CONNECTED) 28] create -s /node_1/node_1_2 12
Created /node_1/node_1_20000000005
[zk: h1:2181(CONNECTED) 29]
# 目前的/node_1节点
[zk: h1:2181(CONNECTED) 29] ls /node_1
[node_1_20000000005, node_1_1, node_1_30000000002, node_1_20000000001, node_1_20000000003, node_1_20000000004]

2.3 修改操作

1
2
3
4
5
set path data [version]
path : 节点路径
data : 新数据
version : 版本号,要么不写,要么和上一次查询出的版本号一致
该操作会影响节点的mZxid、dataVersion和mtime属性
1
2
set /node_1 newdataOfNode_1
set /node_1 newdataOfNode_1 2

2.4 删除操作

  • delete

只能删除不含子节点的节点

1
2
delete path [version]
path :要删除的节点的路径
  • rmr

可以递归删除节点

1
rmr path

2.5 quota

  • setquota

对节点增加限制(配额)

1
2
3
4
5
setquota -n|-b val path
n:表示子节点的最大个数
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径

最大节点数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建节点/node_2
[zk: h1:2181(CONNECTED) 51] create /node_2 node2
Created /node_2
# 指定其子节点最大数为2
[zk: h1:2181(CONNECTED) 52] setquota -n 2 /node_2
Comment: the parts are option -n val 2 path /node_2
# 创建第2个子节点
[zk: h1:2181(CONNECTED) 53] create /node_2/node_2_1 21
Created /node_2/node_2_1
# 创建第2个子节点
[zk: h1:2181(CONNECTED) 54] create /node_2/node_2_2 22
Created /node_2/node_2_2
# 创建第3个子节点
# 此处虽然指定了最大两个子节点,但是并没报错,而是成功创建了
# 虽然创建成功了,但是会在${dataDir}/zookeeper.out中记录警告信息
[zk: h1:2181(CONNECTED) 55] create /node_2/node_2_3 23
[zk: h1:2181(CONNECTED) 56] ls /node_2
[node_2_1, node_2_2, node_2_3]

最大节点数警告信息

1
2
3
4
# 此处的zookeeper.out在zookeeper的 $dataDir目录下
tail -2 /var/zookeeper/zookeeper.out
[myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=3 limit=2
[myid:1] - WARN [CommitProcessor:1:DataTree@301] - Quota exceeded: /node_2 count=4 limit=2
  • listquota

列出指定节点的quota

1
listquota path
1
2
3
4
5
6
7
[zk: h1:2181(CONNECTED) 58] listquota /node_2
absolute path is /zookeeper/quota/node_2/zookeeper_limits
# 子节点个数为2,数据长度-1表示没限制
Output quota for /node_2 count=2,bytes=-1
# 当前信息,节点数为4(超额了),数据长度为11(包含子节点的数据长度)
Output stat for /node_2 count=4,bytes=11
[zk: h1:2181(CONNECTED) 59]
  • delquota

删除quota

1
delquota [-n|-b] path
1
2
3
4
5
6
7
8
# 删除/node_2对于子节点个数限制的quota
[zk: h1:2181(CONNECTED) 64] delquota -n /node_2
[zk: h1:2181(CONNECTED) 65] listquota /node_2
absolute path is /zookeeper/quota/node_2/zookeeper_limits
# -1表示不做限制
Output quota for /node_2 count=-1,bytes=-1
Output stat for /node_2 count=4,bytes=11
[zk: h1:2181(CONNECTED) 66]

2.6 ACL

此处的ACL(Access Control List)和Linux文件系统的中的那个访问控制列表有点类似。

权限主要有:

  • CREATE : 创建子节点
  • READ : 获取节点数据和子节点列表
  • WRITE : 更新节点数据
  • DELETE : 删除子节点
  • ADMIN : 设置节点ACL的权限

与授权相关的几个概念:

  • shchema:权限模式,有IP和digest两种
  • ID:授权对象
    • schema为IP时,该值为具体的IP地址
    • scheme为digest时,该值为 userName:base64(sha1(userName:password)) + zookeeper的javaAPI提供了一个工具类org.apache.zookeeper.server.auth.DigestAuthenticationProvider 可以快速生成加密的密文
  • permission:权限,指的就是上面所说的五种权限

最终的组合为: schema + ID + permission

和ACL相关的命令

  • getAcl

获取指定节点的ACL信息

1
getAcl path
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建节点/node9,并指定其ACL:ip为192.168.161.1,权限为create,read,write,delete,damin
[zk: h1:2181(CONNECTED) 22] create /node9 data9 ip:192.168.161.1:crwda
Created /node9
[zk: h1:2181(CONNECTED) 23] getAcl /node9
'ip,'192.168.161.1
: cdrwa
# schema为digest,用户名为hylexus,密码为123(密文),权限:create,read,write,admin,delete
[zk: h1:2181(CONNECTED) 26] create /node10 data10 digest:hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=:crwad
Created /node10
[zk: h1:2181(CONNECTED) 27] getAcl /node10
'digest,'hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=
: cdrwa
[zk: h1:2181(CONNECTED) 28]
  • setAcl
1
setAcl path acl
1
2
setAcl /node_3 digest:hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=:crwad
setAcl /node_4 ip:192.168.161.1:crawd
  • addauth

注册会话授权信息

1
2
3
4
5
addauth scheme auth
schema:可取ip或digest
auth
schema==digest时为 userName:password
schema==ip时为
1
2
# 用户名:hylexus,密码:123456
addauth digest hylexus:123456

其他命令

  • history : 列出命令历史

  • redo : 该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看

1
2
3
4
5
6
7
8
9
[zk: h1:2181(CONNECTED) 70] history
60 - ls /zookeeper
61 - get /node_2
……………………
……………………
# 重新执行编号为60的命令
[zk: h1:2181(CONNECTED) 71] redo 60
[quota]
[zk: h1:2181(CONNECTED) 72]