Kafka从上手到实践-Zookeeper CLI:CRUD zNode

这一节来看看Zookeeper的命令行工具。

Zookeeper CLI

在第七章节搭建单机Kafka中,我们已经发现了,Kafka是自带Zookeeper的,而且在启动Kafka之前,要先启动Zookeeper,相当于启动了单机Zookeeper,所以我们先说Zookeeper CLI,后面说Zookeeper集群时再具体说配置参数。

展示zNode

首先打开终端,连接至我们的服务器,进入/root/kafka_2.12-2.0.0/bin目录,执行如下命令:

sh zookeeper-shell.sh 127.0.0.1:2181

这是Zookeeper CLI Client连接Zookeeper的命令,当看到如下信息时,说明连接成功:

Connecting to 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is disabled

先来来看看目前Zookeeper里都有哪些zNode:

ls /

[cluster, controller_epoch, controller, brokers, zookeeper, kafka-manager, admin, isr_change_notification, consumers, log_dir_event_notification, latest_producer_id_block, config]

ls命令和Linux中的作用一样,在Zookeeper中是展示某个zNode下的所有zNode。这里的/表示根zNode。可以看到已经有很多zNode注册在了Zookeeper。再来看看brokers下还有哪些zNode:

ls /brokers

[ids, topics, seqid]

再来看看有哪些Topic:

ls /brokers/topics

[with_keys_topic, first_topic, __consumer_offsets, configured-topic]

查看zNode存储的数据

在上一章节中说过,Zookeeper中的zNode是可以存储数据的,那么我们来看看如何查看zNode中存储的数据,比如我们来看看/brokers/ids里保存了什么数据:

get /brokers/ids

null
cZxid = 0x5
ctime = Wed Dec 19 23:46:53 CST 2018
mZxid = 0x5
mtime = Wed Dec 19 23:46:53 CST 2018
pZxid = 0x43d
cversion = 51
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

get命令用于查看zNode中存储的数据,从上面的结果看到,/brokers/ids这个zNode里的数据是null,那么看看是否/brokers/ids下还有zNode:

ls /brokers/ids

[0]

果然,/brokers/ids下还有zNode,这个zNode很明显是以Broker ID命名的。那再来看看/brokers/ids/0里存储了什么样的数据:

get /brokers/ids/0

{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://ECS外网IP:9092"],"jmx_port":-1,"host":"ECS外网IP","timestamp":"1546570570448","port":9092,"version":4}
cZxid = 0x43d
ctime = Fri Jan 04 10:56:10 CST 2019
mZxid = 0x43d
mtime = Fri Jan 04 10:56:10 CST 2019
pZxid = 0x43d
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100363316d3004a
dataLength = 192
numChildren = 0

从上面的结果可以看到,第一行显示的就是zNode存储的数据,/brokers/ids/0这个zNode存储了Broker的IP、端口、注册时间戳、JMX端口等信息。这一行之后的信息都是zNode的标准属性了,有各种时间戳、版本号、数据长度、子节点数等。

创建zNode

我们可以使用Zookeeper CLI自行创建zNode:

create /my_node "some data"

Created /my_node

ls /

[cluster, controller, brokers, zookeeper, my_node, admin, isr_change_notification, log_dir_event_notification, controller_epoch, kafka-manager, consumers, latest_producer_id_block, config]

使用create命令创建zNode。这里要注意的是,在创建zNode时必须要带着存储数据,哪怕是空也可以:

create /my_node ""

否则是无法创建zNode的。

在创建zNode时不可以一次性创建多级zNode,如果还没有创建my_node,直接创建deeper_node是不可以的:

create /my_node/deeper_node "some data"
Node does not exist: /my_node/deeper_node

所以Zookeeper要一层一层创建zNode:

create /my_node "some data"
Created /my_node
create /my_node/deeper_node "some data"
Created /my_node/deeper_node

get /my_node/deeper_node
some data
cZxid = 0x454
ctime = Mon Jan 07 19:12:20 CST 2019
mZxid = 0x454
mtime = Mon Jan 07 19:12:20 CST 2019
pZxid = 0x454
cversion = 0

更新zNode的数据

我们可以通过set命令更新zNode中存储的数据:

set /my_node "new data"
cZxid = 0x453
ctime = Mon Jan 07 19:12:07 CST 2019
mZxid = 0x455
mtime = Mon Jan 07 19:14:04 CST 2019
pZxid = 0x454
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 1

get /my_node
new data
cZxid = 0x453
ctime = Mon Jan 07 19:12:07 CST 2019
mZxid = 0x455
mtime = Mon Jan 07 19:14:04 CST 2019
pZxid = 0x454
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 1

可以看到dataVersioncversion从0变成了1。这里注意一下,每当更新zNode存储的数据时,dataVersion会递增,之所以cversion也递增了是因为更新数据本身也是对zNode的修改,如果我们再更新一次数据,就只有dataVersion会递增了,因为第一次和第二次都是对zNode存储的数据的修改,只算作一次zNode的改变,所以cversion不会再更新:

set /my_node "again new data"
cZxid = 0x453
ctime = Mon Jan 07 19:12:07 CST 2019
mZxid = 0x456
mtime = Mon Jan 07 19:16:24 CST 2019
pZxid = 0x454
cversion = 1
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 1

如果想让cversion变化,那么给my_node再增加一个zNode:

create /my_node/another_node "some data"
Created /my_node/another_node
get /my_node
again new data
cZxid = 0x453
ctime = Mon Jan 07 19:12:07 CST 2019
mZxid = 0x456
mtime = Mon Jan 07 19:16:24 CST 2019
pZxid = 0x457
cversion = 2
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 14
numChildren = 2

可以看到cversionnumChildren都变了。

添加zNode Watcher

上一章节同样说过,Zookeeper中的zNode的所有变更都可以被监控到。来看看如何通过CLI给zNode添加Watcher。我们给/my_node/deeper_node添加Watcher:

get /my_node/deeper_node true
some data
cZxid = 0x454
ctime = Mon Jan 07 19:12:20 CST 2019
mZxid = 0x454
mtime = Mon Jan 07 19:12:20 CST 2019
pZxid = 0x454
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0

通过get /zNode true给zNode添加Watcher。当/my_node/deeper_node修改数据时,就会收到监听事件了:

set /my_node/deeper_node "new data"

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/my_node/deeper_node
cZxid = 0x454
ctime = Mon Jan 07 19:12:20 CST 2019
mZxid = 0x458
mtime = Mon Jan 07 19:24:05 CST 2019
pZxid = 0x454
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

删除zNode

可以通过rmr命令删除zNode,该命令是递归删除,既可以删除指定zNode以及该zNode下的所有zNode:

rmr /my_node
ls /
[cluster, controller, brokers, zookeeper, admin, isr_change_notification, log_dir_event_notification, controller_epoch, kafka-manager, consumers, latest_producer_id_block, config]

小结

这一章节带大家实践了如何使用Zookeeper CLI操作Zookeeper,通过增删改查zNode进一步认知Zookeeper的结构,对之后认知Kafka集群做以铺垫。希望能给小伙伴们带来帮助。

分享到: