在zookeeper安装目录的bin目录下有名为 zkCli.sh
的文件,该文件可以作为客户端连接到zookeeper。
1 使用zkCli.sh连接到zookeeper
# 一般语法
./zkCli.sh -timeout 0 -r -server ip:port
# 连接到主机h1 超时时间3秒
./zkCli.sh -timeout 3000 -server h1:2181
# 有类似如下的命令提示符就表示连接成功了
[zk: h1:2181(CONNECTED) 0]
另外,我们在前面说过。整个zookeeper的节点结构就和linux文件系统是一致的。
都是只有一个最顶层的根节点,其下有若干子节点。
随便敲个字母就可以显示出使用帮助了:
[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命令
[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]
列出指定节点的状态信息,或者说是元数据信息
[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]
可以列出指定节点的数据
get /
get /zookeeper
- ls2 path [watch]
是ls的升级版,列出子节点的同时列出节点的状态信息
[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 创建节点
create [-s] [-e] path data acl
s:可选,表示该节点为顺序节点
e:可选,表示该节点为临时节点
path:节点路径
data:节点数据
acl:访问控制列表
# 创建节点/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 修改操作
set path data [version]
path : 节点路径
data : 新数据
version : 版本号,要么不写,要么和上一次查询出的版本号一致
该操作会影响节点的mZxid、dataVersion和mtime属性
set /node_1 newdataOfNode_1
set /node_1 newdataOfNode_1 2
2.4 删除操作
- delete
只能删除不含子节点的节点
delete path [version]
path :要删除的节点的路径
- rmr
可以递归删除节点
rmr path
2.5 quota
- setquota
对节点增加限制(配额)
setquota -n|-b val path
n:表示子节点的最大个数
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径
最大节点数示例
# 创建节点/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]
最大节点数警告信息
# 此处的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
listquota path
[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
delquota [-n|-b] path
# 删除/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信息
getAcl path
# 创建节点/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
setAcl path acl
setAcl /node_3 digest:hylexus:f4Myrgy6YlaWdo4lvv///2jgEDI=:crwad
setAcl /node_4 ip:192.168.161.1:crawd
- addauth
注册会话授权信息
addauth scheme auth
schema:可取ip或digest
auth
schema==digest时为 userName:password
schema==ip时为
# 用户名:hylexus,密码:123456
addauth digest hylexus:123456
其他命令
history : 列出命令历史
redo : 该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
[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]