Kafka 核心技术与实战
胡夕
Apache Kafka Committer,老虎证券技术总监
52815 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
结束语 (1讲)
Kafka 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

26 | 你一定不能错过的Kafka控制器

不同优先级请求的处理
异步操作ZooKeeper
单线程+事件队列的方案
同步操作ZooKeeper
多线程的设计
宕机或意外终止时,备用控制器代替
数据服务
集群成员管理
Preferred领导者选举
分区重分配
主题管理
第一个成功创建/controller节点的Broker成为控制器
管理和协调整个Kafka集群
减少对ZooKeeper的依赖的可能方向
删除/controller节点的快速方式
0.11版本后的改进
0.11版本前的设计
故障转移过程
运维任务的分区
所有Broker信息
所有主题信息
职责
选举规则
主要作用
开放讨论
小结
控制器内部设计原理
控制器故障转移(Failover)
控制器保存的数据
控制器组件
Kafka控制器

该思维导图由 AI 生成,仅供参考

你好,我是胡夕。今天我要和你分享的主题是:Kafka 中的控制器组件。
控制器组件(Controller),是 Apache Kafka 的核心组件。它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群集群中任意一台 Broker 都能充当控制器的角色,但是,在运行过程中,只能有一个 Broker 成为控制器,行使其管理和协调的职责。换句话说,每个正常运转的 Kafka 集群,在任意时刻都有且只有一个控制器。官网上有个名为 activeController 的 JMX 指标,可以帮助我们实时监控控制器的存活状态。这个 JMX 指标非常关键,你在实际运维操作过程中,一定要实时查看这个指标的值。下面,我们就来详细说说控制器的原理和内部运行机制。
在开始之前,我先简单介绍一下 Apache ZooKeeper 框架。要知道,控制器是重度依赖 ZooKeeper 的,因此,我们有必要花一些时间学习下 ZooKeeper 是做什么的。
Apache ZooKeeper 是一个提供高可靠性的分布式协调服务框架。它使用的数据模型类似于文件系统的树形结构,根目录也是以“/”开始。该结构上的每个节点被称为 znode,用来保存一些元数据协调信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka控制器是Apache Kafka的核心组件,负责管理和协调整个Kafka集群。控制器依赖于ZooKeeper来实现集群成员管理、分布式锁、领导者选举等功能。在Kafka集群中,每个Broker都有可能成为控制器,但同时只能有一个Broker担任控制器角色。控制器的主要职责包括主题管理、分区重分配、Preferred领导者选举、集群成员管理和数据服务。控制器保存了所有主题信息、Broker信息以及涉及运维任务的分区信息。此外,Kafka还提供了控制器故障转移功能,以应对单点失效的风险。当控制器宕机时,Kafka能够快速地感知并启用备用控制器来代替失败的控制器,实现自动的故障转移。控制器的重要性和作用不容忽视,对于Kafka集群的稳定运行至关重要。 在Kafka 0.11版本之前,控制器的设计是相当繁琐的,代码更是有些混乱,导致社区中很多控制器方面的Bug都无法修复。控制器是多线程的设计,会在内部创建很多个线程。社区于0.11版本重构了控制器的底层设计,最大的改进是将多线程的方案改成了单线程加事件队列的方案。这种方案的最大好处在于,控制器缓存中保存的状态只被一个线程处理,因此不再需要重量级的线程同步机制来维护线程安全,Kafka不用再担心多线程并发访问的问题,非常利于社区定位和诊断控制器的各种问题。另一个改进是将之前同步操作ZooKeeper全部改为异步操作,性能有了很大的提升。此外,Kafka正式支持不同优先级请求的处理,使控制器请求能够得到抢占式的处理。 总的来说,Kafka控制器在集群管理和故障转移方面发挥着关键作用。随着技术的不断演进,控制器的设计也在不断优化,从多线程到单线程加事件队列的方案,以及异步操作的引入,都为提升Kafka集群的性能和稳定性做出了重要贡献。未来,随着对ZooKeeper依赖的减少,Kafka控制器的发展方向也值得关注。 如果读者在使用Kafka控制器时遇到问题,可以尝试手动删除ZooKeeper中的/controller节点来引发控制器的重选举,避免重启Broker导致的消息处理中断。控制器的重要性不容忽视,期待未来Kafka控制器能够更加独立和稳定地运行,为Kafka集群的稳定性和可靠性提供更好的支持。

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

全部留言(52)

  • 最新
  • 精选
  • 曾轼麟
    老师控制器选举是不是漏了一个环节,重新选出的controller会增加epoch的值,避免旧的controller复活导致出现两个控制器

    作者回复: 嗯嗯,是的。fencing机制很重要的,应该要提一下的

    2019-08-06
    7
    66
  • icejoywoo
    基于raft搞一套来替代zookeeper?

    作者回复: 嗯,做一组controller,基于Raft算法组成quorum

    2019-08-09
    3
    17
  • 野性力量
    epoch这个词我经常看到,查了是纪元的意思,不过用在这里应该怎么理解呢。(在图里)

    作者回复: 暂时可以理解成版本

    2019-08-01
    3
    13
  • Stony.修行僧
    KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum 了解一下

    作者回复: 嗯,看到这个KIP了,最近很火,有人还翻译出来了。事实上这个KIP只是在讨论阶段,目前还没有被accept

    2019-08-02
    3
    12
  • 你好旅行者
    老师好,关于线程的优化,我能否这样理解:之前是为每一个事件分配一个线程,线程本身的切换以及锁会带来繁重的开销。在后续的版本中,讲请求封装成了一个个的事件,采用异步串行化的方式,放入到队列中,由统一的一个线程来轮询这个队列,从而避免了锁的开销。不知道这样的理解是否准确? 此外,老师说的多个线程之间共享Broker缓内存区域,可否举个例子,在什么情况下他们需要共享内存区域呢? 谢谢老师!

    作者回复: Controller有个context,里面缓存了很多数据。以前的设计是多个线程会同时访问这些数据,比如topic删除线程、controller线程等。

    2019-08-01
    12
  • thomas
    老师,请问: 1. 当控制器发生故障时,其他broker是如何感知到的?是ZK watch controller没有节点,然后广播通知其他的broker, 来争抢新建一个控制器节点吗? 还是其他broker没定时收到控制器发送的元数据同步请求? 2. ZK不是可以确保节点的唯一性,为什么还会出现控制器大于1的情况?

    作者回复: 1. Controller所在broker发生故障,ZooKeeper上的/controller节点会自动消失。其他broker监控这个节点的存在,因此会第一时间感知到 2. 极少数情况下,不排除出现脑裂的情形,比如出现network partitioning,Zookeeper ensemble被分割成两个,的确有可能出现两个controller

    2020-05-02
    2
    8
  • 谢特
    多个节点之间内存一般怎么共享

    作者回复: 一般不共享内存,甚至什么都不共享, 这就是所谓的Shard-Nothing架构

    2019-10-10
    7
  • 电光火石
    老师好,想问一下: 1.如何看出重分区被hang住了,是长时间没有响应就被hang住,还是有一些jmx的参数可以观察? 2.当我们删除/controller的时候,是否会有数据丢失的可能,比如重分区的请求,是否会先存储在zk,然后controler从中读取请求进行处理,这个时候发生重failover,是否新的controller会重新读到这个请求? 谢谢了

    作者回复: 1. 执行reassign命令总提示分区在reassign中,或者ZooKeeper中的/admin/reassign_partitions下相应节点未被删除 2. 不会丢失数据,如果真丢失了,果断开jira,因为这是一个严重的bug:)

    2019-09-07
    3
    6
  • 林肯
    各个broker之间怎样保证元数据的一致性?controller挂了后重新选举的机制是怎样的?

    作者回复: 异步发送元数据来保持一致性。最权威的数据保存在Zk上。当controller挂掉之后,Zk上的临时节点/controller消失,所有存活broker都会感知到这一变化,于是抢注/controller,谁抢上谁就是新的controller

    2019-10-11
    2
    5
  • thomas
    老师,若给kafka-server配置文件中的zookeeper.connect参数写了3个zk的节点,他们是如何交换?kafka-server先尝试和第一个zk节点开始建立tcp socket连接,若成功,那么后面两个就不用建立连接, 待异常情况下,做备用吗?

    作者回复: 严格来说,Kafka是把这个事情交由ZooKeeper来完成的。如果你指定了多台,那么ZooKeeper会把Kafka的建立连接请求发送给ZooKeeper的leader节点,其他standby

    2020-05-09
    4
收起评论
显示
设置
留言
52
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部