14 | Controller选举是怎么实现的?
- 深入了解
- 翻译
- 解释
- 总结
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-291
- Kvicii.Y在最后的elect方法中,如果抢注失败抛出 ControllerMovedException 异常后为什么要执行卸任逻辑逻辑呢?此时这个Broker即使之前是Controller但应该也是执行过卸任逻辑了,为什么还要重复的执行一次呢
作者回复: maybeResign只是maybe:)
2020-07-021 - 空知调用onControllerFailover时候 sendUpdateMetadataRequest(controllerContext.liveOrShuttingDownBrokerIds.toSeq, Set.empty) 向集群里的brokers发送更新元数据请求
作者回复: 对,让它们去更新元数据
2020-05-211 - 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-282 - 张三丰这句话前后好矛盾啊,节点数据变化这里说只需要卸任,不选举,后边又说卸任并且选举,这是写错了么? "Deletion 表明 ZooKeeper 中 /controller 节点不存在了,即 Kafka 集群中的 Controller 暂时空缺了。因为它和 Creation 和 DataChange 是不同的状态,需要区别对待,因此,Reelect 事件做的事情要比 ControllerChange 的多:处理 ControllerChange 事件,只需要当前 Broker 执行“卸任 Controller”的逻辑即可,而 Reelect 事件是重选举,除了 Broker 执行卸任逻辑之外,还要求 Broker 参与到重选举中来。"2022-09-13归属地:北京1