下载
我们可以去 ZooKeeper 官网 下载,这里我下载了 ZooKeeper 3.7.0 版本
下载解压后,进入 apache-zookeeper-3.7.0-bin/bin
目录,这里有客户端、服务端和一些工具。在 Windows 中可以执行.cmd
结尾的执行文件,在 Mac 或 Linux 中可以执行 .sh
结尾的可执行文件。名为 zkCli
的文件就是 ZooKeeper 的客户端了,我们可以用这个客户端来连接到 ZooKeeper 注册中心,来对节点进行查看或增删操作。
使用
我是在 Mac 环境下演示使用的
接下来就说下这个客户端怎么使用。
连接
第一步就是要连接到 ZooKeeper 服务,当你执行 zkCli.sh
不带任何参数时,它默认是连接到本地的 localhost:2181
地址。如果你要连接到指定地址,可以使用 -server
配置:
./zkCli.sh -server localhost:2181 # 还可以加上连接超时时间(单位:毫秒) ./zkCli.sh -timeout 3000 -server localhost:2181
连接上后,终端就会变成这样:
[zk: localhost:2181(CONNECTED) 0]
然后你可以输入 help
来查看执行的命令:
ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b|-N|-B] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*] redo cmdno removewatches path [-c|-d|-a] [-l] set [-s] [-v version] path data setAcl [-s] [-v version] [-R] path acl setquota -n|-b|-N|-B val path stat [-w] path sync path version whoami
在客户端里面,也可以使用命令 connect
来切换连接的 ZooKeeper 的服务地址:
[zk: localhost:2181(CONNECTED) 12] connect localhost:2181
创建节点
永久节点
可以使用 create
命令来创建一个永久节点:
[zk: localhost:2181(CONNECTED) 18] create /node Created /node
临时节点
临时节点当客户端断开后,这个节点就会被删除
[zk: localhost:2181(CONNECTED) 19] create -e /tmp_node Created /tmp_node
临时节点不能够有子节点,当要创建它的子节点时就会报错 Ephemerals cannot have children
:
[zk: localhost:2181(CONNECTED) 20] create -e /tmp_node/t1 Ephemerals cannot have children: /tmp_node/t1
顺序节点
ZooKeeper 可以为我们自定创建递增的顺序节点
[zk: localhost:2181(CONNECTED) 23] create -s /seq_node Created /seq_node0000000017 [zk: localhost:2181(CONNECTED) 24] create -s /seq_node Created /seq_node0000000018 [zk: localhost:2181(CONNECTED) 25] create -s /seq_node Created /seq_node0000000019
容器节点
容器节点当其子所有节点都被删除时,它自己也会被删除
# 创建容器节点 [zk: localhost:2181(CONNECTED) 39] create -c /container Created /container # 创建容器节点的子节点 [zk: localhost:2181(CONNECTED) 43] create /container/c1 Created /container/c1 [zk: localhost:2181(CONNECTED) 44] create /container/c2 Created /container/c2 # 删除容器节点的子节点 [zk: localhost:2181(CONNECTED) 46] delete /container/c1 [zk: localhost:2181(CONNECTED) 47] delete /container/c2 # 过了一会后,容器节点被删除了 [zk: localhost:2181(CONNECTED) 56] get /container org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /container
ttl 节点
ZooKeeper 也可以为节点设置有效期,单位是毫秒。要创建这个节点时,需要 ZooKeeper 服务端在启动时设置 zookeeper.extendedTypesEnabled=true
,否则在创建时就会失败:KeeperErrorCode = Unimplemented
创建时设置的过期时间单位时毫秒:
[zk: localhost:2181(CONNECTED) 57] create -t 3000 /ttl_node Created /ttl_node
删除节点
在 zkCli
中可以用 delete
命令来删除节点,在删除一个节点时,必须保证该节点下面没有子节点
[zk: localhost:2181(CONNECTED) 6] create /node1 Created /node1 [zk: localhost:2181(CONNECTED) 7] delete /node1 # 如果有子节点的话,删除时会报错 [zk: localhost:2181(CONNECTED) 10] create /node1 Created /node1 [zk: localhost:2181(CONNECTED) 11] create /node1/n1 Created /node1/n1 [zk: localhost:2181(CONNECTED) 12] delete /node1 Node not empty: /node1
如果你想一次性删除节点包括其所有子节点时,可以使用 deleteall
命令来进行删除
[zk: localhost:2181(CONNECTED) 14] deleteall /node1
查看节点
查看所有子节点
我们可以用 ls
命令来查看某个节点的所有子节点,比如我们查看根目录下的所有节点时,就可以这样用:
[zk: localhost:2181(CONNECTED) 20] ls / [quota, zookeeper]
查看 zookeeper 节点的子节点
[zk: localhost:2181(CONNECTED) 21] ls /zookeeper [config, quota]
查看节点的状态
可以用 stat
来查看一个节点的状态,比如我们查看根节点的状态时:
[zk: localhost:2181(CONNECTED) 22] stat / cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0xe cversion = 4 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 2
字段说明:
字段 | 描述 |
czxid | 创建znode的zxid |
mzxid | 最近一次修改znode的zxid(创建、删除、set直系子节点、set自身节点都会计数) |
pzxid | 最近一次修改子节点的zxid(创建、删除直系子节点都会计数,set子节点不会计数) |
ctime | 创建znode的时间,单位毫秒 |
mtime | 最近一次修改znode的时间,单位毫秒 |
dataVersion | 修改znode数据的次数 |
cversion | 修改子节点的次数(创建、删除直系子节点都会计数,set子节点不会计数) |
aclVersion | 该znode的ACL修改次数 |
ephemeralOwner | 临时znode节点的session id,如果不是临时节点,值为0 |
dataLength | znode携带的数据长度,单位字节 |
numChildren | 直系子节点的数量(不会递归计算孙节点) |
查看节点的数据
可以使用 set
命令来设置节点的数据,当要获取这个设置的数据时,就可以使用 get
命令来获取节点的数据
[zk: localhost:2181(CONNECTED) 27] create /node Created /node [zk: localhost:2181(CONNECTED) 28] set /node 我的数据 [zk: localhost:2181(CONNECTED) 29] get /node 我的数据
终端可视化客户端