学习方法|一把解开Kafka背后机制的“钥匙”

329次阅读  |  发布于2年以前

在Kafka中有一个非常重要的角色:控制器,KafkaController,承担着Kafka核心运作机制,从本文开始将逐步深入Kafka内核,揭晓Kafka内部的运作机制,为更好的运维Kafka储备充足的弹药。

深入探究Kafka内核,我们将如何展开呢?经过笔者初略的浏览了KafkaController类的源码,发现Kafka的控制器严重依赖Zookeeper集群,而基于Zookeeper编程的常规套路:基于事件监听模型:

Kafka Zookeeper事件监听如下图所示:

基于此种编程模型,事件回调方法就成为我们探究Kafka的突破口,而kafka也为控制类事件定义了统一的接口:ControllerEvent,简单声明如下图所示:

关键信息如下:

ControllerEvent的所有子类如下图所示:

上面每一种事件都代表Kafka内核蕴含的一种机制,这些也是接下来探究的重点,本文将重点关注Startup事件,包含了Kafka控制器选举,揭晓控制器的职权范围。

1、Kafka控制选举机制

通过查看Kafka启动流程发现,Broker启动时首先会向/broker/ids节点下注册自己,然后会将Startup事件放入到任务队列中,从而将触发Controller的选举,Startup事件的定义如下图所示:

主要完成两件事情:

接下来将详细探究其实现细节,将其运作机制掌握于心。

1.1 Kafka Controller选举机制

Kafka Controller的选举由具体由KafkaController的elect()方法实现,接下来将对该方法进行详细剖析。

核心实现步骤如下:;

1.1.1 Broker选举为Controller

当一个新节点被选举成Kafka Controller后,也就是“新的秩序”重新建立,需要做哪些事情呢?由KafkaController的onControllerFailover方法实现,该方法代码有点多,将分步骤介绍。

Step1:重新注册ChildChange事件,这类事件主要是关注其子节点的新增/删除/修改时间,代码如下图所示:

详情说明如下:

上述节点的事件监听,背后都蕴含了Kafka相关的机制,后续会一一揭晓。

Step2:重新注册Node节点改变事件,代码如下图所示:

具体订阅的节点如下:

上述节点的事件监听,同样背后都蕴含了Kafka的相关机制,这些后续都会一一介绍,从而揭晓Kafka核心机制。

Step3: 删除/log_dir_event_notification、/isr_change_notification相关的子节点,新的Controller节点选举成功后,分区故障转移,ISR变更都将忽略,这些事项后续会重新触发,代码如下图所示:

Step4:初始化控制器上下文,核心代码如下图所示:

Kafka Controller的上下文主要包括如下信息:

Step5: 获取需要删除与不需要删除的topic,代码如下图所示:

具体的处理逻辑:

Step6:启动副本状态机与分区状态机,代码如下图所示:

Kafka中分区、副本是存储的核心,分区、副本各自有多种状态,在Kafka内部实现中使用状态机来实现,其中副本的状态机状态驱动示意图如下所示:

分区的状态比较简单,其状态驱动如下图所示:

Step7:处理分区重分配、topic删除、触发倾向性副本的选举,具体代码如下图所示:

核心要点:

温馨提示:本文将不会深入探讨这些机制的详细实现,但这里送大家一个**“彩蛋”**,也是笔者的学习方法:大家可以去判断这些节点值是在什么情况下写入的、写入后是如何执行对应逻辑的,从而可以探知对应的实现机制。

1.1.2 Broker选举Controller失败

在Kafka集群中,只有一个Broker能成功选举成Controller,当Broker选举Controller失败后,执行的操作为KafkaController的maybeResign方法, 接下来我们看看其实现细节。

maybeResign方法的代码截图如下图所示:

重点如图所示:

2、Kafka Conntroller职责总结

从Kafka Broker控制器的启动流程,我们也可以窥探出Kafka众多的机制都需要Kafka Controller主导,主要包含如下:

要想理解kafka内部的运作机制,Kafka Controller是一个非常不错的入口,从下文开始,将逐步研究Kafka内部运作机制,从而更好运维Kafka集群。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8