kafka集群是由多个broker构成,broker之间怎么组织管理的呢?

1.broker controller简介
- Controller 是从Kafka集群中选取一个的broker,负责管理topic分区和副本的状态的变化,以及执行重分配分区之类的管理任务。
- 早期版本kafka依赖zk管理集群,也就是所有broker都去zk节点上注册监听,当节点数据变动时,同步数据到自己缓存中。新版本引入controller来统一管理,只有controller需要监听zk节点,其他broker不再需要完全监听zk。
2.broker controller选举
- 所有的broker启动后会去zk上注册/controller临时节点,但只有一个broker能够注册成功,这个broker即为contoller,注册成功后会在该节点写入controller信息,如:{“version":1,"brokerid":0,"timestamp":"1605488793510"}。
- 若controller宕机后,zk上的临时节点会消失,其他broker又会一起去注册,产生新的controller。注册失败的broker叫做broker follower,会监听/controller节点,读取controller的信息并保存到内存中。
3.contoller职责
监听zk对应节点,实时同步集群状态。

4.topic新建流程
触发的zk节点: /broker/topics

5.topic分区管理
触发的zk节点:/broker/topics/{topic name}/partitions/{partition id}/state
- controller会监听zk 的/admin/ressign_part节点,用户执行分区更改脚步的内容会写入该节点,controller读取格式化信息并重新分区。
- controller监听/broker/topic节点变化信息,监听partition的增减情况,当发生partition增减时,重新执行leader选举和isr同步,并更新所有broker信息。
-
controller监听/broker/ids节点,当有broker宕机时,若宕机的是leader,controller从isr列表中选取新的leader;若isr列表为空,则从所有副本中选取leader;若所有副本列表都为空,则等待副本重新加入。
image.png
6.broker管理
触发zk节点:/broker/ids
- 监听broker的加入,更新新加入的broker信息到controller缓存并同步其他broker。已存在的topic分区不变,后续创建的topic将会被分配到该broker。
- 监听broker的离开,更新新加入的broker信息到controller缓存并同步其他broker。查询leader在宕机broker的topic分区,将这些分区状态改为下线,为其重新选举leader,更新zk上分区信息,并同步最新分区信息到给broker。
7.重新分区监听
触发zk节点:/admin/resign_partitions
- kafka扩容后,增加的broker不会加入已有topic分区中,需要利用kafka脚本工具手动更新分区分配。
- kafka脚本将更新分区的元数据写入zk节点,触发controller完成分区的更新。
- 新加入的broker首先会成为对应分区的一个follower,直到完成分区数据同步后才删除原始分区数据。
8.修改分区优先副本
触发zk节点: /admin/preferred_replica_election
- 优先副本为下一次leader选举时的首选broker
- 分区的优先副本为isr中的第一个broker,若需要更新优先副本,可通过kafka脚本更新zk节点。再执行重新分区时,该优先副本将成为leader。
网友评论