zookeeper-3.4.6/bin/zkCli.sh
zookeeper-3.4.6/bin/zkCli.sh -server 172.16.127.129:2181
zookeeper-3.4.6/bin/zkCli.sh -timeout 5000 -r -server 172.16.127.129:2181 #单位ms,-r只读
#列出节点下所有的子节点
#ls path [watch]
> ls /
[storm, zookeeper]
> ls /storm
[backpressure, workerbeats, ..]
#列出节点的状态信息
#stat path [watch]
> stat /
cZxid = 0x0 #该节点被创建时的事务id
ctime = Thu Jan 01 08:00:00 CST 1970 #该节点被创建的时间
mZxid = 0x0 #该节点最后被修改时的事务id
mtime = Thu Jan 01 08:00:00 CST 1970 #该节点最后被修改的时间
pZxid = 0x41400000048 #该节点的子节点列表最后被修改时的事务id(添加或删除子节点,不含修改子节点内容)
cversion = 26 #子节点版本号
dataVersion = 0 #数据版本号
aclVersion = 0 #权限版本号
ephemeralOwner = 0x0 #创建该临时节点的事务id,如果是持久节点,这里的值固定为0
dataLength = 0 #该节点存放数据的长度
numChildren = 2 #该节点所拥有的子节点的个数
#列出节点下所有的子节点 和 该节点的状态信息
#ls2 path [watch]
> ls2 /
[storm, zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x41400000048
cversion = 26
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
#列出当前节点的数据内容
#get path [watch]
> get /znode01
123 #该节点存放的数据内容
cZxid = 0x4140000004d
ctime = Wed Jul 26 12:58:04 CST 2017
mZxid = 0x4140000004d
mtime = Wed Jul 26 12:58:04 CST 2017
pZxid = 0x4140000004d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
#创建节点
#create [-s] [-e] path data acl
#-s:表示当前创建的节点是一个顺序节点
#-e:表示当前创建的节点是一个临时节点,临时节点下面不能再创建子节点,并且当前会话消失后该临时节点被删除
#-s和-e两个参数可以同时使用
> create -e /znode01/znode01_01 abc
Created /znode01/znode01_01
> ls /znode01
[znode01_01]
> get /znode01/znode01_01
abc #
cZxid = 0x41400000050
...
ephemeralOwner = 0x15d7844fbdb000a #退出创建该临时节点会话(ctrl+c)后,该临时节点将被删除
dataLength = 3 #zk临时节点的这种特性常常用于心跳检测
numChildren = 0
> create -s /znode01/znode01_02 456
Created /znode01/znode01_020000000001
> create -s /znode01/znode01_02 789
Created /znode01/znode01_020000000002
> ls /znode01
[znode01_020000000002, znode01_020000000001]
> get /znode01/znode01_020000000001
456
cZxid = 0x41400000052
...
numChildren = 0
#修改数据节点(只能修改已经存在的节点)
#set path data [version]
> set /znode01/znode01_020000000001 111
cZxid = 0x41400000052
ctime = Wed Jul 26 13:12:32 CST 2017
mZxid = 0x41400000056 #修改数据节点事务id发生改变
mtime = Wed Jul 26 13:18:02 CST 2017 #修改数据节点时间由初始的1970年改变为当前的修改时间
pZxid = 0x41400000052
cversion = 0
dataVersion = 1 #数据版本递增1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
> set /znode01/znode01_020000000001 222 1 #修改指定版本号,注意版本号必须与当前版本号一致,否则报错,通常用于zk的乐观锁机制
cZxid = 0x41400000052
ctime = Wed Jul 26 13:12:32 CST 2017
mZxid = 0x41400000057 #修改数据节点事务id发生改变
mtime = Wed Jul 26 13:23:16 CST 2017 #修改数据节点时间发生改变
pZxid = 0x41400000052
cversion = 0
dataVersion = 2 ##数据版本递增1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
#删除数据节点(只能删除没有子节点的数据节点)
#delete path [version]
> delete /znode01/znode01_020000000001 #删除该数据节点,没有任何返回就表示执行成功
> delete /znode01/znode01_020000000002 0 #删除指定数据版本号,注意版本号必须与当前版本号一致
#删除数据节点(删除当前节点及其子节点)
#rmr path
> rmr /znode01 #删除该数据节点及其子节点,没有任何返回就表示执行成功
有时候我们希望给存在的数据节点增加一些限制条件,这是后就会用到限额命令。
当zk发现设置的数据节点超出了限额之后并不会报错,而是会在当前zk集群的节点上的 /bin/zookeeper.out 中记录警告信息,警告信息示例如下:
count:表示/znode01节点自身及其所有子节点的总数
limit:表示/znode01节点限制子自身及其节点的总数,由于我们设置的限制数为2,所以当count>limit之后将会有警告信息出现。
#设置配额
#setquota -n|-b val path
#-n:表示限制当前节点子节点的个数
#-b:表示限制当前节点存放数据的长度
> setquota -n 2 /znode01 #表示限制 /znode01节点 子节点的个数为2
Comment: the parts are option -n val 2 path /znode01
#查看配额
#listquota path
> listquota /znode02
absolute path is /zookeeper/quota/znode02/zookeeper_limits #当前节点配额信息存放路径
Output quota for /znode02 count=-1,bytes=2 #当前节点配额信息
Output stat for /znode02 count=1,bytes=4 #当前节点配额实际状态
> listquota /znode01
absolute path is /zookeeper/quota/znode01/zookeeper_limits
Output quota for /znode01 count=2,bytes=-1
Output stat for /znode01 count=7,bytes=25
#删除配额
#delquota [-n|-b] path
> delquota -b /znode02 #没有任何返回表示删除成功
传统的文件系统中,ACL分为两个维度,一个是属组,一个是权限,子目录/文件默认继承父目录的ACL。而在Zookeeper中,node的ACL是没有继承关系的,是独立控制的。Zookeeper的ACL,可以从三个维度来理解:一是scheme; 二是user; 三是permission,通常表示为 scheme : id : permissions, 下面从这三个方面分别来介绍:
#创建数据节点时设置acl
#create [-s] [-e] path data acl
> create /znode02 456 ip:172.16.127.131:crw
Created /znode02
> create /znode03 0 digest:tom:Aasasla+azxasU=:crwda #user:BASE64(SHA1(password))
Created /znode03
#获取当前节点的acl信息
> getAcl /znode02
'ip,'172.16.127.131
: crw
#设置节点的acl
#setAcl path acl
> setAcl /znode03 ip:172.16.127.131:crwd
cZxid = 0x4140000008f
...
aclVersion = 1 #aclVersion递增1
...
numChildren = 0
#添加认证以对节点数据进行访问
#addauth scheme auth
> addauth digest tom:123456
#当设置了znode权限,但是密码忘记了怎么办?还好Zookeeper提供了超级管理员机制
#修改zkServer.sh,加入super权限设置(只对当前zk集群节点)
> vim zkServer.sh
-----------------------------------------------
98 _ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
99 SUPER_ACL="-Dzookeeper.DigestAuthenticationProvider.superDigest=super:gG7s8t3oDEtIqF6DM9LlI/R+9Ss="
100
101
102 case $1 in
...
111 nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" "$SUPER_ACL"\
112 -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
113 if [ $? -eq 0 ]
...
#重新启动Zookeeper,这时候使用 addauth digest super:super 进行认证
> ./zkServer.sh restart
> ./zkCli.sh
> get /znode02
Authentication is not valid : /znode02
> addauth digest super:super
> get /znode02
456
cZxid = 0x4140000008c
...
numChildren = 0
> delete /znode02
#在当前zkCli终端连接其他zk服务器
#connect host:port
> connect supervisor01z:2181
#退出当前客户端
#quit 或 ctl+c
> quit
#设置是否打印监听,默认为on
#printwatches on|off
> printwatches on
#查看所有指令的执行历史
#history
> history
0 - l
1 - printwatches on
2 - history
3 - redo
4 - ls /
5 - history
#重复执行history中某个命令
#redo
> redo 4 #相当于执行 ls /
#保证获取的数据是最新的
#Zookeeper保证了最终一致性,在十几秒可以Sync到各个节点.
#Zookeeper保证了可用性,数据总是可用的,没有锁。并且有一大半的节点所拥有的数据是最新的,实时的。
#如果想保证取得是数据一定是最新的,需要手工调用Sync()
#sync path
> sync /znode01
Sync returned 0