KafKa - 控制器作用 及 选举策略
Posted 小毕超
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KafKa - 控制器作用 及 选举策略相关的知识,希望对你有一定的参考价值。
一、KafKa控制器作用
在 kafka
中分为 broker
和 partition
分区,其中分区副本在前几篇文章中都进行了讲解,本篇文章针对 broker
进行分析,其中在 kafka
集群中,一个broker
一般就表示一台物理机器,那机器之间的协作是怎样的呢?
其实会有一个broker
选举成为Kafka Controller
控制器 角色,它主要负责维护集群中所有分区和副本的状态,当某个分区的 Leader
节点发生宕机(一个分区中存在多个不同的副本,只有Leader副本提供对外服务),该控制器将负责该分区选举Leader
副本,当检测到某个分区的ISR
分区副本数据中发生变化的时候该控制器负责通知给所有的broker
,当某个topic
增加分区数量时,由控制器负责分区重新分配。
下面是控制器的作用:
-
主题管理(创建、删除、增加分区)
这里的主题管理,就是指控制器帮助我们完成对
Kafka
主题的创建、删除以及分区增加的操作。换句话说,当我们执行kafka-topics
脚本时,大部分的后台工作都是控制器来完成的。 -
分区重分配
分区重分配主要是指,
kafka-reassign-partitions
脚本提供的对已有主题分区进行细粒度的分配功能。这部分功能也是控制器实现的。 -
集群成员管理
自动检测新增
Broker
、Broker
主动关闭及被动宕机。这种自动检测是依赖于ZooKeeper
的Watch
功能和ZooKeeper
的临时节点组合实现的。比如,控制器组件会利用Watch
机制检查ZooKeeper
的/brokers/ids
节点下的子节点变化情况。当有新
Broker
启动后,它会在/brokers
下创建专属的znode
节点。一旦创建完毕,ZooKeeper
会通过Watch
机制将消息通知推送给Broker
控制器,这样,控制器就能自动地感知到这个变化,进而开启后续的新增Broker
作业。侦测
Broker
存活性还是依赖于ZooKeeper
的临时节点。每个Broker
启动后,会在/brokers/ids
下创建一个临时znode
。当Broker
宕机或主动关闭后,该Broker
与ZooKeeper
的会话结束,这个znode
会被自动删除。同理,ZooKeeper
的Watch
机制将这一变更推送给Broker
控制器,这样控制器就能知道有Broker
关闭或宕机了,从而进行后续处理。 -
数据服务
控制器的最后一大类工作,就是向其他
Broker
提供数据服务,控制器上保存了最全的集群元数据信息,其他所有Broker
会定期接收控制器发来的元数据更新请求,从而更新其内存中的缓存数据。当控制器发现一个
broker
离开集群,便会检测该broker
下是否有leader
分区,如果存在,控制器会依次遍历每个分区,根据ISR
确定新的leader
,然后向所有broker
发送消息,该请求消息包含谁是新的leader
以及谁是follower
。随后,新的Leader
开始处理来自生产者和消费者的请求,Follower
用于从新的Leader
那里进行复制。
二、控制器的故障选举策略
从上面就可以看出,控制器十分依赖于 ZooKeeper
的临时节点。当Broker
控制器宕机之后,该对应的临时节点会被删除,其他的Broker
会自动感知,从新进入竞选Broker
控制器。
其实现原理类似给予 ZooKeeper
的分布式锁的实现,利用临时节点的唯一性,以及 ZooKeeper
的事件通知机制进行选举出控制节点。
剩下存活的 Broker
会创建相同的临时节点,谁能够创建成功 谁就是为Broker
控制器如果没有创建该临时节点成功的Broker
,订阅该临时节点,如果当它宕机之后,会发送事件通知给没有创建成功Broker
从新开始竞争控制器管理者。
以上是关于KafKa - 控制器作用 及 选举策略的主要内容,如果未能解决你的问题,请参考以下文章
Kafka之副本信息Leader 选举流程故障处理细节分区副本分配手动调整分区副本存储Leader Partition 负载平衡增加副本文件存储机制文件清理策略高效读写数据