Kafka 核心源码解读
胡夕
Apache Kafka Committer,老虎证券技术总监
19216 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
结束语 (1讲)
Kafka 核心源码解读
15
15
1.0x
00:00/00:00
登录|注册

18 | PartitionStateMachine:分区状态转换如何实现?

你好,我是胡夕。今天我们进入到分区状态机(PartitionStateMachine)源码的学习。
PartitionStateMachine 负责管理 Kafka 分区状态的转换,和 ReplicaStateMachine 是一脉相承的。从代码结构、实现功能和设计原理来看,二者都极为相似。上节课我们已经学过了 ReplicaStateMachine,相信你在学习这节课的 PartitionStateMachine 时,会轻松很多。
在面试的时候,很多面试官都非常喜欢问 Leader 选举的策略。学完了今天的课程之后,你不但能够说出 4 种 Leader 选举的场景,还能总结出它们的共性。对于面试来说,绝对是个加分项!
话不多说,我们就正式开始吧。

PartitionStateMachine 简介

PartitionStateMachine.scala 文件位于 controller 包下,代码结构不复杂,可以看下这张思维导图:
代码总共有 5 大部分。
PartitionStateMachine:分区状态机抽象类。它定义了诸如 startup、shutdown 这样的公共方法,同时也给出了处理分区状态转换入口方法 handleStateChanges 的签名。
ZkPartitionStateMachine:PartitionStateMachine 唯一的继承子类。它实现了分区状态机的主体逻辑功能。和 ZkReplicaStateMachine 类似,ZkPartitionStateMachine 重写了父类的 handleStateChanges 方法,并配以私有的 doHandleStateChanges 方法,共同实现分区状态转换的操作。
PartitionState 接口及其实现对象:定义 4 类分区状态,分别是 NewPartition、OnlinePartition、OfflinePartition 和 NonExistentPartition。除此之外,还定义了它们之间的流转关系。
PartitionLeaderElectionStrategy 接口及其实现对象:定义 4 类分区 Leader 选举策略。你可以认为它们是发生 Leader 选举的 4 种场景。
PartitionLeaderElectionAlgorithms:分区 Leader 选举的算法实现。既然定义了 4 类选举策略,就一定有相应的实现代码,PartitionLeaderElectionAlgorithms 就提供了这 4 类选举策略的实现代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka中的分区状态机(PartitionStateMachine)是管理分区状态转换的关键组件,类似于ReplicaStateMachine。文章深入解析了PartitionStateMachine的核心工作原理和关键方法,为读者提供了全面的技术视角。分区状态包括NewPartition、OnlinePartition、OfflinePartition和NonExistentPartition,它们之间有特定的流转规则。文章详细介绍了分区状态转换的方法handleStateChanges,该方法负责将分区状态设置为目标状态,并可能执行Leader选举策略。文章还探讨了分区Leader选举的策略和实现方法,包括离线分区Leader选举策略、分区副本重分配Leader选举策略、Preferred副本Leader选举策略和Broker Controlled关闭时Leader选举策略。通过对代码结构、实现功能和设计原理的介绍,读者能够快速了解PartitionStateMachine的工作原理和关键功能。文章内容详实,涵盖了分区状态机的核心概念和实现细节,为Kafka技术的理解和应用提供了重要参考。 总结:本文深入解析了Kafka中的分区状态机(PartitionStateMachine)的核心工作原理和关键方法,详细介绍了分区状态转换的方法handleStateChanges以及分区Leader选举的策略和实现方法。通过对代码结构、实现功能和设计原理的介绍,读者能够快速了解PartitionStateMachine的工作原理和关键功能,为Kafka技术的理解和应用提供了重要参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心源码解读》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 胡夕
    置顶
    你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,咱们结合源码重点了解了ReplicaStateMachine的源码。课后我请你自行分析doHandleStateChanges方法中最后一路分支的代码。下面我给出我的答案:最后一路case分支是NonExistentReplica。当进入到这路分支后,代码会遍历所有能够执行状态转换操作的副本。去获取当副本当前的状态以及所在分区的完整副本列表。之后将该副本从副本列表中移除,并将得到的新副本列表更新到Controller元数据缓存中。最后呢,代码将该副本从状态机中移除。 okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。
    2020-06-05
    1
  • 云端漫漫步
    triggerOnlineStateChangeForPartitions是将NewPartition、OfflinePartition状态的broker上除待删除主题的分区之外的所有分区移动到OnlinePartition状态的分区上; 触发时机的话有如下几个入口: 1. Controller启动时候; 2. Controller收到UncleanLeaderElectionEnable、TopicUncleanLeaderElectionEnable事件 3. 副本变成Offline状态时候

    作者回复: 👍👍

    2020-06-30
    2
    1
  • Geek_f406a1
    kafka集群间分区级数据复制如何做?

    作者回复: 通过MirrorMaker工具,虽然不太好用。社区2.4推出了MirrorMaker2,只是不知道目前的效果如何。其他公司也有开源产品,如Uber的uReplicator

    2020-06-06
    1
  • yes
    老师我想问下,正常关闭Broker 和 leader下线有什么区别?不都是leader下线嘛

    作者回复: 嗯,是有一部分重叠。broker关闭还有其他一些处理逻辑

    2020-07-30
    2
  • Kvicii.Y
    在doHandleStateChanges方法的NewPartition分支中,首先在ZK写入了Leader和ISR数据,如果成功了就已经把状态置为了OnlinePartition;这里的操作和之后进行的Leader选举操作,这两个里面的Leader是怎么样的关系呢,还是说这个操作就是状态转换过程中OnlinePartition可以因为触发Leader选举而再次将状态置为OnlinePartition的过程,那这个操作的意义是什么呢?

    作者回复: 有点没看懂,您是说那个操作?是指Online -> Online吗?

    2020-07-11
    3
  • 三颗豆子
    请问问什么AR的顺序和ISR的顺序有差异呢?

    作者回复: 它们都是有顺序的,自然顺序是有关系的。

    2020-07-01
  • z.l
    看完怎么感觉OnlinePartition分支里面leader选举执行了2次?
    2022-09-07归属地:上海
  • 机制小风风
    其实我一直好奇,isr里的副本,其实不是完全同步的,有特别小的差距。leader选举的时候会处理这一点差距不?不处理的话会不会丢数据?
    2022-02-28
  • 胡小禾
    controllerBrokerRequestBatch.newBatch() 是清空的意思? 我看的2.7.1 版本的代码,并非如此吧.后面的 clear() 倒确实如此. def newBatch(): Unit = { // raise error if the previous batch is not empty if (leaderAndIsrRequestMap.nonEmpty) throw new IllegalStateException("Controller to broker state change requests batch is not empty while creating " + s"a new one. Some LeaderAndIsr state changes $leaderAndIsrRequestMap might be lost ") if (stopReplicaRequestMap.nonEmpty) throw new IllegalStateException("Controller to broker state change requests batch is not empty while creating a " + s"new one. Some StopReplica state changes $stopReplicaRequestMap might be lost ") if (updateMetadataRequestBrokerSet.nonEmpty) throw new IllegalStateException("Controller to broker state change requests batch is not empty while creating a " + s"new one. Some UpdateMetadata state changes to brokers $updateMetadataRequestBrokerSet with partition info " + s"$updateMetadataRequestPartitionInfoMap might be lost ") }
    2021-12-21
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部