面试题:Kafka中Controller的作用是什么?选举流程是怎样的?以及如何避免脑裂问题?

题目来源

网上冲浪:还不懂分布系统,速看深度剖析Kafka Controller选举过程

在查找关于Kafka单机分区的上限以及分区多了会有怎样的问题的时候,发现了这个比较有趣的问题,就记录了下来。

一般所有的分布式系统,都会涉及到这个问题:脑裂、以及如何避免脑裂问题。

题目描述

  • Kafka中Controller的作用是什么?
  • Kafka中Controller的选举流程是什么?
  • Kafka脑裂是什么?
  • Kafka如何避免脑裂问题?

题目答案

  • Kafka中Controller中的作用是什么?

    -- 管理partition的ISR列表:当Follower副本无法及时跟随Leader副本时,Controller会将其从ISR列表中移除。

    -- 分区重平衡:当添加或者删除Broker节点时,Controller负责对Partition的分布进行重平衡,以确保数据的均匀分布。

    -- 当集群中有一个副本的leader挂掉了,controller需要在集群中选举出一个新的leader,选举的规则是从isr集合中最左边获得。

    -- 当集群中新增或者减少broker,controller将该信息同步给其他broker。

    -- 当集群中有分区新增或者减少,controller将该信息同步给其他broker。

    -- 存储集群元数据

    Controller保存了集群中最全的元数据信息,并通过发送请求同步到其他Broker上面

    -- 从我参考文章中的信息来看,Controller节点不负责存储数据。但是好像之前看bilibili视频的时候,Controller节点又是存储数据的。重新思考之后,Controller可能是一个子进程,由Broker进程在竞选Controller成功后创建,可以跟Broker处于同一个节点上面。

  • Kafka集群的Controller选举过程是怎样的?

    -- 注册Controller节点

    Kafka集群刚上线时,每个Broker启动时会向zookeeper尝试注册一个/controller节点,因为同一时刻只能存在一个/controller节点,所以只有一个Broker可以成功创建节点并成为Controller,获得的序号最小的那个broker将会作为集群中的controller。

    -- 监听Controller节点

    所有非Controller的Broker都会在Zookeeper中对/controller路径设置一个Watcher事件,这样当Controller节点发生变化时(例如Controller失效),所有非Controller就会收到一个Watcher事件。

    -- 选举新的Controller

    当某个Broker接收到Controller节点变化的通知后,它会再次尝试在Zookeeper中的/controller路径下创建临时节点。与Kafka集群刚上线时的"注册Controller节点"类似,只有一个Broker能够成功在Zookeeper中创建/controller临时节点,并成为新的Controller。新的Controller会在选举成功后接管集群元数据的管理工作。

    -- 更新集群元数据

    新Controller在选举成功后,需要更新集群元数据,包括分区状态、副本状态等。同时,新控制器会通知所有相关的Broker更新他们的元数据信息。这样,集群中所有的Broker都能够知道新Controller的身份,并进行协同工作。

    -- 备注

    临时节点的特点是在创建它的客户端(即Broker节点)断开连接时,它会自动被Zookeeper节点删除。这种机制保证了只有一个Broker节点能够成为Controller,以避免多个控制器同时对集群元数据进行操作引发问题。

  • Kafka脑裂是什么?

    脑裂问题是分布式系统中经常出现的现象,Kafka脑裂问题是由于网络或其他原因(比如Full GC)导致多个Broker认为自己是Controller,从而导致元数据不一致和分区状态混乱的问题。

  • Kafka脑裂是怎么产生的?Kafka和Zookeeper是如何避免脑裂问题?

    -- 假设有三个Broker,a、b、c,其中a是Controller。此时的epoch number是1(Kafka是通过epoch number(纪元编号)解决脑裂问题)。

    -- 现在a因为full gc时间过程,导致与zookeeper的会话超时了。zookeeper就会删除/controller节点,并通知b和c竞选Controller节点。

    -- b和c 参加竞选,假设b成为了新的Controller,将epoch number的值设置为2。之后b就会向c同步新的元数据信息,通c更新元数据信息。

    -- a结束Full GC后,继续向b和c同步数据,b和c发现epoch number小于自己当前保存的epoch number的值,就会拒绝a的管理,并通知a当前最新的epoch number是2了,a就会知道自己已经不是Controller了,最后与b重新建立连接,并从b同步最新的元数据。这样就解决了脑裂的问题。

参考

题目来源:还不懂分布系统,速看深度剖析Kafka Controller选举过程

相关推荐
z_mazin17 分钟前
IP伪装、代理池与分布式爬虫
分布式·爬虫·tcp/ip
进取星辰3 小时前
18. LangChain分布式任务调度:大规模应用的性能优化
分布式·性能优化·langchain
酷爱码5 小时前
hadoop存储数据文件原理
大数据·hadoop·分布式
小陈爱建模6 小时前
[更新完毕]2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
分布式·数学建模·能源
睎zyl15 小时前
在spark里通过jps命令,看到的进程
大数据·分布式·spark
听闻风很好吃16 小时前
Redis应用场景实战:穿透/雪崩/击穿解决方案与分布式锁深度剖析
数据库·redis·分布式
tianshiyeben1 天前
WGCLOUD使用 - 如何监控RabbitMQ运行参数
分布式·rabbitmq
hnlucky1 天前
Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试
大数据·数据库·hadoop·分布式·缓存
未来影子1 天前
企业级分布式 MCP 方案
分布式·wpf
炒空心菜菜1 天前
如何搭建spark yarn模式的集群
大数据·分布式·spark