ZooKeeper到底为Kafka的做了什么牺牲?(上)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: ZooKeeper到底为Kafka的做了什么牺牲?(上)

Kafka使用zk实现和RocketMQ的NameServer相似的功能。


1 Kafka的zk有什么作用?

首先我们来看一下Kafka在ZooKeeper都保存了哪些信息:

  • 0.8.x的旧版本的情况,最新版本的Kafka已经将消费位置管理等一些原本依赖ZooKeeper实现的功能,替换成了其他的实现方式。
  • image.png
  • 绿色框形是临时节点,其它是持久节点。

1.1 ids 子树(临时节点)

保存的是Kafka的Broker信息,/brokers/ids/[0…N],每个临时节点对应一个在线Broker,Broker启动后会创建一个临时节点,代表Broker已经加入集群,可提供服务了,节点名称就是BrokerID,节点内保存了包括Broker的地址、版本号、启动时间等信息。若Broker宕机或与zk集群失联,该临时节点也会消失。

1.2 topics 子树

topic

保存topic和partition信息。/brokers/topics/节点下的每个子节点都是一个topic,节点的名称就是topic名称。

partitions

每个topic节点下面都包含 一个固定 的partitions节点,pattitions节点的子节点就是主题下的所有分区,节点名称即分区编号。


state(临时节点)

位于每个分区节点下,其保存着 分区当前的leader和所有ISR的BrokerID。该state临时节点由该分区当前的Leader Broker创建。

若该分区的Leader Broker宕机,对应state节点也会消失,直至新Leader被选举出来,再次创建state节点。


这份元数据同时被缓存到每一个Broker。

Kafka主要使用zk保存其元数据、监控Broker和分区的存活状态,并利用zk进行选举。


2 Kafka client如何定位Broker?

先根据topic和queue,在topics树中找到分区对应的state临时节点。从中取得该Leader的BrokerID,再去ids 子树,找到BrokerID对应的临时节点,即可获取到Broker真正的物理地址。

Kafka client不会直接连zk,而是在需要时,通过RPC请求从Broker拉取所关心的topic的元数据,然后保存到client的元数据缓存,以便client的生产和消费。 zk上的元数据都是通过Broker中转给各个Kafka client。


Kafka client(客户端)真正与Broker(服务端)数据通信是在NetworkClient#poll实现,经过如下调用链:

image.png

image.png

该方法里面,Kafka构造了一个更新元数据请求:

image.png

该方法创建的并不是一个真正的更新元数据的MetadataRequest,而是一个用于构造MetadataRequest的构造器MetadataRequest.Builder,等到真正要发送请求之前,Kafka才会调用Builder.buid()方法把这个MetadataRequest构建出来然后发送出去。其实不仅是元数据的请求,所有的请求都是这样处理的。


调用sendInternalMetadataRequest()方法时,这个请求也并没有被真正发出去,依然是保存在待发送的队列中,然后择机来异步批量发送。


请求的具体数据内容封装在MetadataRequestData 类

image.png

目录
相关文章
|
4月前
|
消息中间件 数据可视化 Kafka
消息中间件系列教程(21) -Kafka- 集群搭建(自带Zookeeper)
消息中间件系列教程(21) -Kafka- 集群搭建(自带Zookeeper)
53 0
|
11天前
|
消息中间件 Kafka Docker
【docker专题_04】docker搭建kafka与zookeeper
【docker专题_04】docker搭建kafka与zookeeper
16 2
|
2月前
|
消息中间件 存储 Java
ZooKeeper 在 Kafka 中的应用
ZooKeeper 在 Kafka 中的应用
29 0
|
2月前
|
消息中间件 Java Kafka
使用Java编写代码安装Kafka及启动Zookeeper和Kafka
如何使用Java编写代码安装Kafka及启动Zookeeper和Kafka?其中包括安装前准备、修改配置文件、创建日志目录和数据目录等步骤,请提供详细实现过程。
34 0
|
3月前
|
消息中间件 Java Shell
Linux【脚本 03】shell脚本离线安装配置集结JDK+InfluxDB+Zookeeper+Kafka(安装文件及脚本源码网盘分享)
Linux【脚本 03】shell脚本离线安装配置集结JDK+InfluxDB+Zookeeper+Kafka(安装文件及脚本源码网盘分享)
26 0
|
3月前
|
消息中间件 Kafka Shell
Linux【脚本 02】shell脚本离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
Linux【脚本 02】shell脚本离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
33 0
|
4月前
|
消息中间件 Kafka Linux
kafka3.0创建topic出现zookeeper is not a recognized option
kafka3.0创建topic出现zookeeper is not a recognized option
39 0
|
27天前
|
消息中间件 安全 Kafka
2024年了,如何更好的搭建Kafka集群?
我们基于Kraft模式和Docker Compose同时采用最新版Kafka v3.6.1来搭建集群。
2024年了,如何更好的搭建Kafka集群?
|
2月前
|
消息中间件 存储 数据可视化
kafka高可用集群搭建
kafka高可用集群搭建
33 0
|
2月前
|
消息中间件 Kafka Linux
Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群
Apache Kafka-初体验Kafka(03)-Centos7下搭建kafka集群
37 0