26 | 你一定不能错过的Kafka控制器
该思维导图由 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-06766 - icejoywoo基于raft搞一套来替代zookeeper?
作者回复: 嗯,做一组controller,基于Raft算法组成quorum
2019-08-09317 - 野性力量epoch这个词我经常看到,查了是纪元的意思,不过用在这里应该怎么理解呢。(在图里)
作者回复: 暂时可以理解成版本
2019-08-01313 - Stony.修行僧KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum 了解一下
作者回复: 嗯,看到这个KIP了,最近很火,有人还翻译出来了。事实上这个KIP只是在讨论阶段,目前还没有被accept
2019-08-02312 - 你好旅行者老师好,关于线程的优化,我能否这样理解:之前是为每一个事件分配一个线程,线程本身的切换以及锁会带来繁重的开销。在后续的版本中,讲请求封装成了一个个的事件,采用异步串行化的方式,放入到队列中,由统一的一个线程来轮询这个队列,从而避免了锁的开销。不知道这样的理解是否准确? 此外,老师说的多个线程之间共享Broker缓内存区域,可否举个例子,在什么情况下他们需要共享内存区域呢? 谢谢老师!
作者回复: Controller有个context,里面缓存了很多数据。以前的设计是多个线程会同时访问这些数据,比如topic删除线程、controller线程等。
2019-08-0112 - 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-0228 - 谢特多个节点之间内存一般怎么共享
作者回复: 一般不共享内存,甚至什么都不共享, 这就是所谓的Shard-Nothing架构
2019-10-107 - 电光火石老师好,想问一下: 1.如何看出重分区被hang住了,是长时间没有响应就被hang住,还是有一些jmx的参数可以观察? 2.当我们删除/controller的时候,是否会有数据丢失的可能,比如重分区的请求,是否会先存储在zk,然后controler从中读取请求进行处理,这个时候发生重failover,是否新的controller会重新读到这个请求? 谢谢了
作者回复: 1. 执行reassign命令总提示分区在reassign中,或者ZooKeeper中的/admin/reassign_partitions下相应节点未被删除 2. 不会丢失数据,如果真丢失了,果断开jira,因为这是一个严重的bug:)
2019-09-0736 - 林肯各个broker之间怎样保证元数据的一致性?controller挂了后重新选举的机制是怎样的?
作者回复: 异步发送元数据来保持一致性。最权威的数据保存在Zk上。当controller挂掉之后,Zk上的临时节点/controller消失,所有存活broker都会感知到这一变化,于是抢注/controller,谁抢上谁就是新的controller
2019-10-1125 - thomas老师,若给kafka-server配置文件中的zookeeper.connect参数写了3个zk的节点,他们是如何交换?kafka-server先尝试和第一个zk节点开始建立tcp socket连接,若成功,那么后面两个就不用建立连接, 待异常情况下,做备用吗?
作者回复: 严格来说,Kafka是把这个事情交由ZooKeeper来完成的。如果你指定了多台,那么ZooKeeper会把Kafka的建立连接请求发送给ZooKeeper的leader节点,其他standby
2020-05-094