进入到ZooKeeper的bin目录下,我们看到有如下的几个命令
[root@iZbp13pwlxqwiu1xxb6szsZ bin]# ll
total 44
-rwxr-xr-x 1 1001 1001 232 Mar 23 2017 README.txt
-rwxr-xr-x 1 1001 1001 1937 Mar 23 2017 zkCleanup.sh
-rwxr-xr-x 1 1001 1001 1056 Mar 23 2017 zkCli.cmd
-rwxr-xr-x 1 1001 1001 1534 Mar 23 2017 zkCli.sh
-rwxr-xr-x 1 1001 1001 1628 Mar 23 2017 zkEnv.cmd
-rwxr-xr-x 1 1001 1001 2696 Mar 23 2017 zkEnv.sh
-rwxr-xr-x 1 1001 1001 1089 Mar 23 2017 zkServer.cmd
-rwxr-xr-x 1 1001 1001 6773 Mar 23 2017 zkServer.sh
-rw-r--r-- 1 root root 7955 Dec 29 12:49 zookeeper.out
[root@iZbp13pwlxqwiu1xxb6szsZ bin]#
我们通过执行sh zkCli.sh 来连接本地的ZooKeeper服务器,有如下的信息就表示客户端连接成功
Welcome to ZooKeeper!
2019-12-29 17:54:22,884 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2019-12-29 17:54:22,959 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2019-12-29 17:54:22,976 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x16f4aa40b760000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
如果需要连接指定的远程ZooKeeper服务器,执行 sh zkCli.sh -server ip:port
连接上ZooKeeper服务器,我们就可以执行客户端脚本命令了,如下
help命令
help命令用于查询客服端所支持的所用的命令,执行help,如下
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
[zk: localhost:2181(CONNECTED) 1]
create命令
create [-s] [-e] path data acl
-s
有序节点
一个znode还可以设置为有序(sequential)节点。一个有序znode节点被分配唯一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。
-e
临时节点
默认情况下创建的是持久节点。
- acl权限控制,缺省情况下不做任何权限控制。
[zk: localhost:2181(CONNECTED) 0] create /zk-test 123
Created /zk-test
[zk: localhost:2181(CONNECTED) 1]
我们在根节点下创建了一个叫做/zk-test的持久节点,节点的数据内容是123
get命令
get path [watch]
get命令用于获取节点的数据内容和属性信息,注意节点的路径必须是以/开头的绝对路径
[zk: localhost:2181(CONNECTED) 2] get /zk-test
123
cZxid = 0x3144
ctime = Sun Dec 29 18:02:30 CST 2019
mZxid = 0x3144
mtime = Sun Dec 29 18:02:30 CST 2019
pZxid = 0x3144
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 3]
第一行是数据内容123,其他的属性信息如下表
状态属性 | 说明 |
---|---|
cZxid | 节点创建的事务zxid。每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 |
ctime | znode的创建时间 |
mzxid | znode最后修改的zxid |
mtime | znode最后修改时间 |
pZxid | znode最后更新的子节点zxid |
cversion | znode子节点变化号,每变化一次就自增1 |
dataversion | znode数据变化号,数据每变化一次就自增1 |
aclVersion | znode访问控制列表的变化号 |
ephemeralOwner | 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0 |
dataLength | znode的数据长度 |
dataLength | znode子节点数量 |
ls命令
ls path [watch]
ls命令用于获取指定节点下第一级的所有子节点,路径为绝对路径。
[zk: localhost:2181(CONNECTED) 1] ls /zk-test
[]
因为zk-test节点下没有子节点,因此返回的是空。我们看下根节点下的子节点信息
[zk: localhost:2181(CONNECTED) 4] ls /
[zk-test, zookeeper]
[zk: localhost:2181(CONNECTED) 5]
在根节点下有zookeeper(默认保留的节点)、zk-test节点(我们刚才创建的节点)
set命令
set path data [version]
更新指定节点的数据内容
注意:在命令后面有一个version参数,在ZooKeeper中,节点的数据是有版本概念的,这个参数用于指定本次更新操作是基于ZNode的哪一个数据版本进行的。
我们不带version参数进行如下的更新,dataVersion由原来的0变成了1
[zk: localhost:2181(CONNECTED) 5] set /zk-test 456
cZxid = 0x3144
ctime = Sun Dec 29 18:02:30 CST 2019
mZxid = 0x3145
mtime = Sun Dec 29 18:18:43 CST 2019
pZxid = 0x3144
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 6]
如果我们再执行一次带version参数的命令,如下
[zk: localhost:2181(CONNECTED) 6] set /zk-test 456 0
version No is not valid : /zk-test
[zk: localhost:2181(CONNECTED) 7]
我们发现,如果我们的version是0的话,则更新不了,版本是无效的。
我们使用dataVersion的最新版本1进行更新,如下,我们更新成功了,同时dataVersion变成了2
[zk: localhost:2181(CONNECTED) 7] set /zk-test 789 1
cZxid = 0x3144
ctime = Sun Dec 29 18:02:30 CST 2019
mZxid = 0x3147
mtime = Sun Dec 29 18:21:24 CST 2019
pZxid = 0x3144
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
[zk: localhost:2181(CONNECTED) 8]
delete命令
delete path [version]
使用delete命令,可以删除ZooKeeper上的指定节点。
注意:要想删除某一个指定的节点,该节点必须没有子节点存在。
我们先给zk-test创建一个子节点
[zk: localhost:2181(CONNECTED) 12] create /zk-test/sub-test 777
Created /zk-test/sub-test
[zk: localhost:2181(CONNECTED) 13] ls /zk-test
[sub-test]
[zk: localhost:2181(CONNECTED) 14] delete /zk-test
Node not empty: /zk-test
[zk: localhost:2181(CONNECTED) 15]
如上面所示,因为zk-test下面存在sub-test子节点,我们执行删除节点命令,会报错Node not empty: /zk-test
quit命令
退出客户端