Kafka 分区重分配源码分析

简介: 上一篇跟大家描述了 Kafka 集群扩容的方案与过程,这次就跟大家详细描述 Kafka 分区重分配的实现细节。

上一篇跟大家描述了 Kafka 集群扩容的方案与过程,这次就跟大家详细描述 Kafka 分区重分配的实现细节。


Kafka 为用户提供了分区重分配的执行脚本 kafka-reassign-partitions.sh,脚本内容如下:

640.png


ReassignPartitionsCommand 类为我们提供了分区重分配的功能,主要有如下方法:


  1. generateAssignment() 函数:对应执行脚本的 --generate 参数,为用户生成新的分配方案,输出格式为 json 字符串;
  2. executeAssignment() 函数:对应执行脚本中的 --execute 参数,需要注意的一点是,这并不是真正执行分区数据迁移的动作,只不过是将新的分配方案保存在 zk 中,路径为 /admin/reassign_partitions。


以下是源码执行过程:


1、--execute 命令执行分区重分配任务,kafka 会在 zk 的节点 /admin/reassign_partitions,并将分配策略存储到上面:

kafka.admin.ReassignPartitionsCommand#executeAssignment:

640.jpg


在调用脚本向 zk 提交 Partition 的分区重分配策略,将策略提交到到 zk 前需要进行一步判断,如果分区重分配还在进行,那么本次执行计划是无法提交的,意味着集群当前只能有一个分区重分配执行。


2、将分配策略更新到 zk 上


kafka.admin.ReassignPartitionsCommand#reassignPartitions:

640.jpg


3、Kafka Controller 有一个监听器,监听 zk 节点 /admin/reassign_partitions 变化,将分配策略更新到 zk 上,该监听器就会被触发,然后执行分区重分配逻辑:


kafka.controller.KafkaController.PartitionReassignment:

640.jpg


该监听器会将正在迁移的 Partition 添加到 partitionsBeingReassigned 中,记录当前正在迁移的 Partition 列表。


4、触发分区重分配前,判断如果分区没有变更,则不执行分配,实现的逻辑如下所示:


kafka.controller.KafkaController#maybeTriggerPartitionReassignment:640.jpg


5、如果分区变更,执行真正的分区重分配策略:

kafka.controller.KafkaController#onPartitionReassignment:

640.jpg

以上 onPartitionReassignment 是 Kafka 执行分区重分配真正的核心方法,从注释可看出有几个专有名词,特此说明一下:


  • RAR:Reassigned replicas,即 --generation 参数生成的新分配副本列表;
  • OAR:Original list of replicas for partition,原来的分区副本列表;
  • AR:current assigned replicas,当前副本列表 ,随着分配过程不断变化,最终会等于 RAR + OAR;
  • RAR-OAR:RAR 与 OAR 的差集,即需要创建、数据迁移的新副本;
  • OAR-RAR:OAR 与 RAR 的差集,即不需要创建、数据迁移的副本。


从源码注释可看出,整个分区重分配共有 12 个步骤,我将这个过程主要归类分为以下几个大步骤:


  1. 将新的分配(RAR + OAR)保存到 zk,并触发 controller 进行分区重分配;
  2. 创建 RAR 的副本,并与 leader 同步,同步完后设置成在线状态,此时该分区的 ISR 列表集合变成了 RAR + OAR;
  3. 在 RAR + OAR 中进行 Leader 选举;
  4. 将 OAR-RAR 得到的差集踢出 ISR,并进行删除;
  5. 删除 zk 对应节点,并通知 broker 更新 Metadata。


举个例子:


现在有个分区,它原来的副本列表 OAR = {1, 0, 2},新分配的后的副本列表 RAR = {2, 3, 5},那么在分区重分配过程中,该分区的 AR、Leader 以及 ISR 变化如下:


  1. AR {1,0,2} -> Leader/ISR 1/{1,0,2} :初始状态;
  2. AR {1,0,2,3,5} -> Leader/ISR 1/{1,0,2} :创建 RAR - OAR 差集的新副本;
  3. AR {1,0,2,3,5} -> Leader/ISR 1/{1,0,2,3,5} :新的副本追上了 Leader 的位移,并加入 ISR;
  4. AR {1,0,2,3,5} -> Leader/ISR 2/{1,0,2,3,5} :Preferred Leader 选举;
  5. AR {1,0,2,3,5} -> Leader/ISR 2/{2,3,5} :将 OAR - RAR 差集的副本踢出 ISR;
  6. AR {2,3,5} -> Leader/ISR 2/{2,3,5} :删除 OAR - RAR 差集的副本。


这里需要说明一下需要 Leader 选举的两种情况:


  1. 如果 RAR 中的 Preferred Leader 副本与 OAR 中的 Preferred Leader 副本不一样,则需要重新选举;
  2. 以上条件满足,但 Preferred Leader 所在的 Broker 崩溃了。


把以上分析的几大步骤,再结合「记一次 Kafka 集群线上扩容」这篇文章中 kafka-manage 的截图数据,就更加好理解了。


相关文章
|
23天前
|
消息中间件 存储 监控
深入理解Kafka核心设计及原理(六):Controller选举机制,分区副本leader选举机制,再均衡机制
深入理解Kafka核心设计及原理(六):Controller选举机制,分区副本leader选举机制,再均衡机制
39 1
|
1月前
|
消息中间件 存储 Kafka
微服务分布问题之Kafka分区的副本和分布如何解决
微服务分布问题之Kafka分区的副本和分布如何解决
|
26天前
|
消息中间件 存储 Kafka
面试题Kafka问题之Kafka的消费者(Consumer)跟踪消息如何解决
面试题Kafka问题之Kafka的消费者(Consumer)跟踪消息如何解决
35 0
|
1月前
|
消息中间件 算法 Kafka
从零开始掌握Kafka Rebalance和分区分配
**Kafka Rebalance详解:**当消费者组成员、订阅主题或分区变化时,集群需重新分配任务。涉及关键点:成员增减、主题数量及分区数变更。Rebalance包括Leader选举、RangeAssignor算法的分区分配,以及创建、删除、修改和查询Topic的基本操作。了解这些有助于优化Kafka集群管理。关注“软件求生”获取更多技术内容!
34 0
|
3月前
|
消息中间件 存储 网络协议
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
Apache Kafka的单分区写入性能在某些严格保序场景中至关重要,但其现有线程模型限制了性能发挥。本文分析了Kafka的串行处理模型,包括SocketServer、KafkaChannel、RequestChannel等组件,指出其通过KafkaChannel状态机确保请求顺序处理,导致处理效率低下。AutoMQ提出流水线处理模型,简化KafkaChannel状态机,实现网络解析、校验定序和持久化的阶段间并行化,提高处理效率。测试结果显示,AutoMQ的极限吞吐是Kafka的2倍,P99延迟降低至11ms。
72 3
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
|
3月前
|
SQL 消息中间件 Kafka
实时计算 Flink版产品使用合集之支持sink到多分区的kafka ,还能保持有序吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
消息中间件 监控 Kafka
【Kafka】分区副本中的 Leader 如果宕机但 ISR 却为空该如何处理
【4月更文挑战第12天】【Kafka】分区副本中的 Leader 如果宕机但 ISR 却为空该如何处理
|
3月前
|
消息中间件 负载均衡 监控
【Kafka】Kafka 创建Topic后如何将分区放置到不同的 Broker 中?
【4月更文挑战第13天】【Kafka】Kafka 创建Topic后如何将分区放置到不同的 Broker 中?
|
3月前
|
消息中间件 运维 监控
【Kafka】分区副本什么情况下会从 ISR 中剔出
【4月更文挑战第12天】【Kafka】分区副本什么情况下会从 ISR 中剔出
|
3月前
|
消息中间件 存储 负载均衡
深度解析Kafka分区策略的精妙之处
深度解析Kafka分区策略的精妙之处
299 1

热门文章

最新文章