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

14 | Controller选举是怎么实现的?

你好,我是胡夕。
上节课,我们学习了单线程事件队列模型处理 Controller 事件的代码。Controller 组件通过 ControllerEventManager 类构造了一个阻塞队列,同时配以专属的事件处理线程,实现了对各类 ControllerEvent 的处理。
这种设计思路既保证了多线程访问所需的线程安全,还简化了 Controller 端的代码结构,极大地提升了代码的可维护性。
今天,我们学习下 Controller 选举部分的源码。
还记得我在第 11 节课的案例中提到的“恢复大法”——删除 ZooKeeper 的 /controller 节点吗?当时,我们靠着这个“秘籍”涉险过关,既恢复了错误的集群状态,又避免了重启整个生产环境。
但你有没有想过,为什么删除 /controller 节点能够令集群元数据重新保持同步呢?如果不了解这背后的原理,我们是不敢贸然在生产环境做这种操作的。今天,我们要学习的就是这背后的一整套实现逻辑,重点关注下 Controller 是怎么被选举出来的。
我始终认为,只有掌握了这些知识,才算真正入门 Kafka 服务器端的代码了。作为 Broker 端最重要的组件之一,Controller 在 Kafka 中的地位无可替代。整个 Kafka 集群就只有一个 Controller,从某种意义上来说,它是目前 Kafka 这个分布式系统中唯一的“单点”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka中Controller选举的实现原理是本文的重点。Controller作为Kafka分布式系统中的关键角色,其选举过程依赖于ZooKeeper完成。文章详细介绍了KafkaController类的结构和重要字段,以及各种功能组件的作用,如集群元数据类、Controller端通道管理器、线程调度器等。此外,文章还解释了各种ZooKeeper监听器的作用,包括Controller节点、Broker数量、主题数量等的变更监听。文章还介绍了KafkaController类中定义的统计字段,用于计算统计指标。在选举流程方面,文章描述了触发选举的三个场景,以及对应的操作,最后统一介绍了Controller的选举操作。整体而言,本文通过深入分析Controller选举的实现原理,为读者提供了深入理解Kafka服务器端代码的入门知识,帮助读者更好地理解Controller在集群中的作用和相关的实现原理。

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

全部留言(9)

  • 最新
  • 精选
  • 胡夕
    置顶
    你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,咱们重点了解了Controller的单线程+阻塞队列消息处理模式。课后我请你思考这样一个问题:ControllerEventManager的put方法代码是否需要加putLock保护。这是一个开放式的问题,就我个人的观点,我认为是不需要的。因为queue本身是线程安全的,queuedEvent又是线程私有的栈上引用,因此这里的线程安全性可完全由queue字段类型LinkedBlockingQueue来保证。 okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。
    2020-05-29
    1
  • Kvicii.Y
    在最后的elect方法中,如果抢注失败抛出 ControllerMovedException 异常后为什么要执行卸任逻辑逻辑呢?此时这个Broker即使之前是Controller但应该也是执行过卸任逻辑了,为什么还要重复的执行一次呢

    作者回复: maybeResign只是maybe:)

    2020-07-02
    1
  • 空知
    调用onControllerFailover时候 sendUpdateMetadataRequest(controllerContext.liveOrShuttingDownBrokerIds.toSeq, Set.empty) 向集群里的brokers发送更新元数据请求

    作者回复: 对,让它们去更新元数据

    2020-05-21
    1
  • t-mac
    老师, 以前的版本有注册"registerSessionExpirationListener()" 新版本不需要这个监听zk session的listener了吗? 这个listener是不是非必须的?

    作者回复: 不需要了。新版本Controller没有这个监听器了

    2021-02-06
  • 旭杰
    触发场景三:controller节点数据发生变更。这种情况下Zookeeper会通知ControllerChange事件,Broker端执行processControllerChange()->maybeResign(),只是做一些清理工作,该事件本身应该不会触发controller选举。该事件应该属于Controller易主过程中的一部分,最终是由Zookeeper通知Reelect()事件来触发选举流程。

    作者回复: ������

    2020-11-03
  • 旭杰
    /controller 节点数据变更 数据变更指的是?isr集合变更/broker列表变更这种吗

    作者回复: 就是controller发生变更,因为/controller节点的数据就是controller所在的broker id

    2020-10-21
  • 在路上
    老师,controller 会出现脑裂吗?或者是在哪个版本这个bug 修复了呢?

    作者回复: 嗯,实际上我更愿意这么说:ZooKeeper出现脑裂导致Kafka集群出现多个controller。Kafka提供了一些参数可以帮忙应对这种场景:unclean.leader.election.enable、replication.factor和min.insync.replicas

    2020-10-12
  • thomas
    老师,新建一个topic时,是如何决定选哪一个是领导者副本?假如有两个broker,replica. factor=2

    作者回复: 一般是按照副本列表中的第一个副本是leader副本。而副本列表一般是按照brokerid顺序排列

    2020-05-28
    2
  • 张三丰
    这句话前后好矛盾啊,节点数据变化这里说只需要卸任,不选举,后边又说卸任并且选举,这是写错了么? "Deletion 表明 ZooKeeper 中 /controller 节点不存在了,即 Kafka 集群中的 Controller 暂时空缺了。因为它和 Creation 和 DataChange 是不同的状态,需要区别对待,因此,Reelect 事件做的事情要比 ControllerChange 的多:处理 ControllerChange 事件,只需要当前 Broker 执行“卸任 Controller”的逻辑即可,而 Reelect 事件是重选举,除了 Broker 执行卸任逻辑之外,还要求 Broker 参与到重选举中来。"
    2022-09-13归属地:北京
    1
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部