ZooKeeper客户端详解及可视化客户端

4,973 阅读5分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

下载

我们可以去 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
dataLengthznode携带的数据长度,单位字节
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
我的数据

终端可视化客户端

screen1

下载地址:github.com/greycodee/z…

Github:github.com/greycodee/z…