侧边栏壁纸
博主头像
ProSayJ 博主等级

Talk is cheap. Show me the code.

  • 累计撰写 43 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Kafka 几种选举过程简单介绍一下?

YangJian
2025-06-23 / 0 评论 / 0 点赞 / 14 阅读 / 0 字

Kafka 中常见的选举过程有以下几种:

Partition Leader 选举

Kafka 中的每个 Partition 都有一个 Leader,负责处理该 Partition 的读写请求。在正常情况下,Leader 和 ISR 集合中的所有副本保持同步,Leader 接收到的消息也会被 ISR 集合中的副本所接收。当 leader 副本宕机或者无法正常工作时,需要选举新的 leader 副本来接管分区的工作。

Leader 选举的过程如下:

  • 每个参与选举的副本会尝试向 ZooKeeper 上写入一个临时节点,表示它们正在参与 Leader 选举;

  • 所有写入成功的副本会在 ZooKeeper 上创建一个序列号节点,并将自己的节点序列号写入该节点;

  • 节点序列号最小的副本会被选为新的 Leader,并将自己的节点名称写入 ZooKeeper 上的 /broker/.../leader 节点中。

Controller 选举

Kafka 集群中只能有一个 Controller 节点,用于管理分区的副本分配、leader 选举等任务。当一个Broker变成Controller后,会在Zookeeper的/controller节点 中记录下来。然后其他的Broker会实时监听这个节点,主要就是避免当这个controller宕机的话,就需要进行重新选举。
Controller选举的过程如下:

  • 所有可用的 Broker 向 ZooKeeper 注册自己的 ID,并监听 ZooKeeper 中 /controller 节点的变化。

  • 当 Controller 节点出现故障时,ZooKeeper 会删除 /controller 节点,这时所有的 Broker 都会监听到该事件,并开始争夺 Controller 的位置。

  • 为了避免出现多个 Broker 同时竞选 Controller 的情况,Kafka 设计了一种基于 ZooKeeper 的 Master-Slave 机制,其中一个 Broker 成为 Master,其它 Broker 成为 Slave。Master 负责选举 Controller,并将选举结果写入 ZooKeeper 中,而 Slave 则监听 /controller 节点的变化,一旦发现 Master 发生故障,则开始争夺 Master 的位置。

  • 当一个 Broker 发现 Controller 失效时,它会向 ZooKeeper 写入自己的 ID,并尝试竞选 Controller 的位置。如果他创建临时节点成功,则该 Broker 成为新的 Controller,并将选举结果写入 ZooKeeper 中。

  • 其它的 Broker 会监听到 ZooKeeper 中 /controller 节点的变化,一旦发现选举结果发生变化,则更新自己的元数据信息,然后与新的 Controller 建立连接,进行后续的操作。

Kafka 中 Controller 选举机制 和其背后的 基于 ZooKeeper 的 Master-Slave 竞选流程,是 Kafka 高可用性设计的核心组成部分之一


✅ 一、为什么需要 Controller?

在 Kafka 中,Controller(控制器) 是一个特殊的 Broker 节点,负责整个集群的元数据管理和分区领导者选举:

  • Partition Leader 的选举与切换

  • Topic/Partition 的创建与删除

  • ISR(In-Sync Replica)列表的维护

  • Broker 增删事件监听与处理

整个 Kafka 集群 只能有一个 Controller,是 Kafka 正常运行的基础。


✅ 二、Controller 是如何选出来的?

Kafka 使用 ZooKeeper + 临时节点机制 来保证全局唯一的 Controller。

2.1 关键节点

  • /controller:Kafka 所有 Broker 都会争抢在 ZooKeeper 中创建该临时节点(ephemeral)。

  • 谁先成功创建该节点,谁就是 Controller。


✅ 三、完整选举流程详解

假设有 3 个 Kafka Broker:broker-1, broker-2, broker-3:

步骤 1️⃣:所有 Broker 启动,尝试竞选 Controller

  • 每个 Broker 启动后,都会尝试在 ZooKeeper 创建 /controller 节点,内容为自身的 brokerId。

  • 只有第一个成功创建该节点的 Broker 成为 Controller

ZooKeeper 保证在同一时间内,只有一个客户端能成功创建某个特定的临时节点。


步骤 2️⃣:Controller 上任,开始主控工作

成功成为 Controller 的 Broker 会执行:

  • 扫描所有 Topic 和 Partition 的元数据;

  • 为每个 Partition 分配 Leader;

  • 维护各 Partition 的 ISR 列表;

  • 监听 /brokers/ids 和 /brokers/topics 节点变化,感知 Broker 上下线和 Topic 操作;

  • 向其他 Broker 发送 LeaderAndIsrRequest,同步元数据状态。


步骤 3️⃣:其他 Broker 成为 Follower,监听 Controller 状态

  • 所有非 Controller 的 Broker,监听 ZooKeeper 的 /controller 节点变化(即“Controller Watcher”);

  • 一旦发现 /controller 被删除(说明 Controller 宕机),它们会重新尝试创建该节点,参与新一轮竞选。


步骤 4️⃣:Controller 故障,触发重新选举

  • Controller 宕机后,ZooKeeper 会自动清理它创建的临时节点 /controller;

  • 所有 Follower Broker 被 Watch 通知,立即发起竞选;

  • 谁先抢到 /controller 节点,谁就是新的 Controller;

  • 新 Controller 会从 ZooKeeper 读取所有元数据并重新同步。


✅ 四、为什么说是“Master-Slave”机制?

  • 所有 Kafka Broker 本质上是“平等的”,但在选举 Controller 的过程中:

  • 先抢到 /controller 节点者 == 成为 Master(控制器)

  • 其他 Broker == 成为 Slave(观察者)

这个“Master-Slave”只是暂时的控制权划分:

  • 一旦 Master(即 Controller)宕机,Slave 会尝试升级为新的 Master。


✅ 五、故障恢复与一致性保证

  • ZooKeeper 的临时节点机制确保 Controller 不会“双写”;

  • Controller 的元数据变更都通过 ZooKeeper 保持一致;

  • Kafka 本身使用了 KafkaController 线程 + ZooKeeper 监听器配合协调选举。


✅ 六、Kafka 新版本变化(KRaft 模式)

Kafka 2.8+ 引入 KRaft(Kafka Raft Metadata Mode),Kafka 支持了 去 ZooKeeper 化架构

  • 不再依赖 ZooKeeper 选 Controller;

  • 使用 Kafka 自身的 Raft 协议 实现控制器选举与元数据管理;

  • 性能和一致性更强,架构更简洁;

  • 推荐在 Kafka 3.x 之后采用 KRaft 模式。


✅ 七、总结重点

过程阶段

作用与机制说明

启动竞争

所有 Broker 尝试创建 ZooKeeper 的 /controller 临时节点

成为 Controller

首个创建成功者成为唯一 Controller,负责元数据同步与分区 Leader 管理

其他 Broker

成为观察者,监听 /controller 节点变化

故障时自动切换

Controller 崩溃后 ZooKeeper 清理节点,其他 Broker 被通知并再次发起竞争

保证一致性

依靠 ZooKeeper 节点写入原子性 + Watcher 保证唯一性和一致性


扩展知识

kafka选举中,为什么节点序列号最小的副本会被选为新的 Leader


在Kafka中,节点序列号最小的副本被选为新的Leader是因为Kafka使用了ZooKeeper作为其协调服务。在Kafka集群中,ZooKeeper负责维护集群的元数据(例如主题和分区信息)以及Brokers(Kafka服务器)的状态。

当一个Broker(副本)成为Leader候选人时,它会向ZooKeeper注册自己并申请成为该分区的Leader。在这个过程中,每个候选人都会创建一个临时的带有递增序列号的ZooKeeper节点,称为"选举竞争者(election contender)"。

当候选人注册完成后,它们会查询ZooKeeper并比较自己的序列号与其他候选人的序列号。Kafka采用基于递增序列号的最小值来选择新的Leader。因此,具有最小序列号的候选人将成为新的Leader,并负责处理该分区的所有读写请求。

通过这种方式,Kafka实现了简单而有效的Leader选举机制,确保了高可用性和数据一致性。选择序列号最小的副本作为Leader可以避免分区的不一致情况,并且能够快速地恢复正常操作,因为ZooKeeper节点序列号是唯一且递增的。

0

评论区