面试题: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选举过程

相关推荐
indexsunny1 小时前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices
jessecyj5 小时前
【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置
windows·分布式·rabbitmq
岁岁种桃花儿6 小时前
面试全系列之【Kafka】之【经典版】系列
面试·职场和发展·kafka
Devin~Y6 小时前
从Spring Boot到Spring AI:音视频AIGC内容社区Java大厂面试三轮连环问(含Kafka/Redis/安全/可观测性答案)
java·spring boot·redis·spring cloud·kafka·spring security·resilience4j
java干货8 小时前
在微服务里造一个微缩版 Kafka:Spring Boot 整合 Redis Stream 全指南
spring boot·微服务·kafka
阿维的博客日记8 小时前
分布式事务代码
分布式
_waylau1 天前
鸿蒙架构师修炼之道-面向对象的分布式架构
分布式·华为·架构·架构师·harmonyos·鸿蒙
Francek Chen1 天前
【大数据存储与管理】NoSQL数据库:03 NoSQL与关系数据库的比较
大数据·数据库·分布式·nosql
路飞说AI1 天前
分布式事务最佳实践:基于kafka实现的最终一致性方案
kafka
FeBaby1 天前
Java 高并发场景下 Redis 分布式锁(UUID+Lua)最佳实践
java·redis·分布式