Kafka核心组件之Controller选举机制(3)

本文深入探讨Kafka的Controller选举过程,当Broker故障时,Controller如何从Zookeeper获取通知并重新分配Leader分区。同时,文章分析了如何防止Controller出现裂脑情况,利用epoch number确保集群一致性。
部署运行你感兴趣的模型镜像

Broker如何成为Controller和解决脑裂问题?

(一)Broker如何成为Controller

最先在Zookeeper上创建临时节点/controller成功的Broker就是Controller。

源码路径(Kafka2.2):

Kafka#main->KafkaServerStartable#startup()->KafkaServer#startup()->KafkaController#startup()->eventManager.put(Startup)->elect()-> zkClient.registerControllerAndIncrementControllerEpoch

Controller重度依赖Zookeeper,依赖zookeepr保存元数据,依赖zookeeper进行服务发现。Controller大量使用Watch功能实现对集群的协调管理。

当broker节点因故障离开Kafka集群时,broker中存在的leader分区将不可用(因为客户端只对leader分区进行读写)

为了最大限度地减少停机时间,需要快速找到替代的领导分区。Controller可以从zookeeper watch获取通知信息。Zookeeper给了客户端监听znode变化的能力,也就是所谓的watch通知功能。一旦znode节点创建、删除、子节点数量发生变化,或者znode中存储的数据本身发生变化,Zookeeper会通过节点变化处理程序显式通知客户端。

当Broker宕机或主动关闭时,Broker与Zookeeper的会话结束,znode会被自动删除。同样的,Zookeeper的watch机制把这个变化推送给Controller,让Controller知道有Broker down或者up,这样Controller就可以进行后续的协调操作。

Controller将收到通知并对其采取行动,以确定Broker上的哪些分区将成为Leader partition。然后,它会通知每个相关的Broker,或者Broker上的topic partition将成为leader partition,或者LeaderAndIsrRequest从新的leader分区复制数据。

(二)如何避免Controller出现裂脑

如果Controller所在的Broker故障,Kafka集群必须有新的Controller,否则集群将无法正常工作。这儿存在一个问题。很难确定Broker是宕机还是只是暂时的故障。但是,为了使集群正常运行,必须选择新的Controller。如果之前更换的Controller又正常了,不知道自己已经更换了,那么集群中就会出现两个Controller。

其实这种情况是很容易发生的。例如,由于垃圾回收(GC),一个Controller被认为是死的,并选择了一个新的控制器。在GC的情况下,在原Controller眼里没有任何变化,Broker甚至不知道自己已经被暂停了。因此,它将继续充当当前Controller,这在分布式系统中很常见,称为裂脑

现在,集群中有两个Controller,可能会一起发出相互冲突的事件,这会导致脑裂。可能会导致严重的不一致。所以需要一种方法来区分谁是集群的最新Controller。

Kafka是通过使用epoch number来处理,epoch number只是一个单调递增的数。第一次选择控制器时,epoch number值为1。如果再次选择新控制器,epoch number为2,依次单调递增。

每个新选择的Controller通过zookeeper的条件递增操作获得一个新的更大的epoch number。当其他Broker知道当前的epoch number时,如果他们从Controller收到包含旧(较小)epoch number的消息,则它们将被忽略。即Broker根据最大的epoch number来区分最新的Controller。

epoch number记录在Zookeepr的一个永久节点controller_epoch。

上图中,Broker3向Broker1下发命令:将Broker1上的partitionA做为leader,消息的epoch number值为1,同时Broker2也向Broker1发送同样的命令。不同的是,消息的epoch number值为2,此时broker1只监听broker2的命令(由于其epoch号大),而会忽略broker3的命令,以免发生脑裂。

国内最大最权威的 Kafka中文社区 ,在这里你可以结交各大互联网Kafka大佬以及近2000+Kafka爱好者,一起实现知识共享,实时掌控最新行业资讯,免费加入中~

 

您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

### Kafka 核心组件及其功能和作用 Kafka 是一个分布式流处理平台,其核心组件设计用于高效地处理大规模数据流。以下是 Kafka核心组件及其功能和作用: #### 1. **Broker** Broker 是 Kafka 集群中的服务器节点,负责消息的持久化、备份以及管理。每个 Broker 负责存储多个 Topic 的分区数据,并支持 Producer 和 Consumer 对这些数据的读写操作[^2]。 #### 2. **Topic** Topic 是 Kafka 中的消息主题,是发布订阅的核心对象。每类数据可以对应一个 Topic,Producer 将消息发布到特定的 Topic,而 Consumer 从该 Topic 订阅消息。Topic 支持多订阅者模式,允许多个 Consumer 同时消费同一 Topic 的数据[^2]。 #### 3. **Partition(分区)** 每个 Topic 被划分为多个 Partition,Partition 是 Kafka 中并行处理的基本单位。每个 Partition 是一个有序的日志文件,消息按顺序追加到 Partition 中。通过分区机制Kafka 实现了高吞吐量和可扩展性[^2]。 #### 4. **ZooKeeper** 尽管 ZooKeeper 不是 Kafka核心组件,但在当前版本中,它对 Kafka 集群的管理和协调至关重要。ZooKeeper 负责存储和管理 Kafka 的元数据(如 Broker 列表、Topic 分区信息、Consumer Group 信息等),并实现 Broker 选举Controller 选主等功能[^1]。需要注意的是,Kafka 社区正在逐步减少对 ZooKeeper 的依赖。 #### 5. **Controller** ControllerKafka 集群中的一个特殊角色,由其中一个 Broker 担任。它负责管理集群中的所有元数据变更,例如 Partition 的重新分配、Leader Election 等任务。ControllerKafka 集群正常运行的关键组件之一。 #### 6. **Producer** Producer 是向 Kafka 发布消息的客户端。Producer 可以将消息发送到指定的 Topic,并可以选择性地指定 Partition。Producer 支持多种消息发送模式,包括同步和异步模式[^2]。 #### 7. **Consumer** Consumer 是从 Kafka 订阅消息的客户端。Consumer 可以订阅一个或多个 Topic,并按顺序消费其中的消息。Kafka 提供了 Consumer Group 的概念,允许一组 Consumer 共同消费同一个 Topic 的数据。 #### 8. **ConsumerCoordinator 和 GroupCoordinator** ConsumerCoordinator 和 GroupCoordinator 是 Kafka 内部的协调器组件。ConsumerCoordinator 负责管理 Consumer 的偏移量提交,而 GroupCoordinator 负责 Consumer Group 的成员管理和分区分配[^3]。 #### 9. **Offset(偏移量)** Offset 是 Kafka 中用于标记 Consumer 在某个 Partition 中消费位置的元数据。每个消息在 Partition 中都有唯一的 Offset 值,Consumer 可以通过 Offset 控制消费进度[^2]。 --- ```python # 示例:创建 Kafka Producer 并发送消息 from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') producer.send('my-topic', b'Hello, Kafka!') producer.flush() producer.close() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值