kafka 控制器详解

时间:2024-04-05 08:05:24

一、控制器是什么东东?

       控制器组件(Controller),是 Apache Kafka 的核心组件。它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群。集群中任意一台 Broker 都能充当控制器的角色,但是,在运行过程中,只能有一个 Broker 成为控制器,行使其管理和协调的职责。

二、控制器是怎么选出来?

      Broker 在启动时,会尝试去 ZooKeeper 中创建 /controller 节点。Kafka 当前选举控制器的规则是:第一个成功创建 /controller 节点的 Broker 会被指定为控制器。

三、控制器的作用?

1.主题管理(创建、删除、增加分区)

2.分区重分配

3.Preferred 领导者选举

4.集群成员管理(新增 Broker、Broker 主动关闭、Broker 宕机)

5.数据服务

四、控制器中保存了哪些数据?

 

kafka 控制器详解

具体有哪些数据看上图,其中比较重要的数据有:

1、所有主题信息。包括具体的分区信息,比如领导者副本是谁,ISR 集合中有哪些副本等。

2、所有 Broker 信息。包括当前都有哪些运行中的 Broker,哪些正在关闭中的 Broker 等。

3、所有涉及运维任务的分区。包括当前正在进行 Preferred 领导者选举以及分区重分配的分区列表。

 

      这些数据其实在 ZooKeeper 中也保存了一份。每当控制器初始化时,它都会从 ZooKeeper 上读取对应的元数据并填充到自己的缓存中。

 

五、控制器故障转移(Failover)

Kafka集群中控制器只有一个,如果控制器所在的broker挂了怎么办呢?

kafka 控制器详解

    控制器一旦挂了,zookeeper就通知其它broker,第一个在zookeeper上创建/controller目录的broker就是新的controller所在的broker。

六、控制器内部设计原理

      社区于 0.11 版本重构了控制器的底层设计,最大的改进就是,把多线程的方案改成了单线程加事件队列的方案。我直接使用社区的一张图来说明。

kafka 控制器详解

       从这张图中,我们可以看到,社区引入了一个事件处理线程,统一处理各种控制器事件,然后控制器将原来执行的操作全部建模成一个个独立的事件,发送到专属的事件队列中,供此线程消费。这就是所谓的单线程 + 队列的实现方式。

        针对控制器的第二个改进就是,将之前同步操作 ZooKeeper 全部改为异步操作。ZooKeeper 本身的 API 提供了同步写和异步写两种方式。之前控制器操作 ZooKeeper 使用的是同步的 API,性能很差,集中表现为,当有大量主题分区发生变更时,ZooKeeper 容易成为系统的瓶颈。新版本 Kafka 修改了这部分设计,完全摒弃了之前的同步 API 调用,转而采用异步 API 写入 ZooKeeper,性能有了很大的提升。根据社区的测试,改成异步之后,ZooKeeper 写入提升了 10 倍!

        自 2.2 开始,Kafka 正式支持这种不同优先级请求的处理。简单来说,Kafka 将控制器发送的请求与普通数据类请求分开,实现了控制器请求单独处理的逻辑。