本文是大数据系列第 63 篇,深入解析 Kafka 副本机制、ISR 原理与 Leader 选举策略,理解这些机制是构建高可用 Kafka 集群的关键。
副本机制概述
Kafka 通过在多个 Broker 上保存分区的多个副本(Replica)来实现高可用和数据持久化。每个分区都有一个 Leader 副本和若干 Follower 副本:
- Leader 副本:处理所有客户端的读写请求,是数据的主入口
- Follower 副本:不对外提供服务,只负责从 Leader 同步数据,在 Leader 宕机时参与选举
副本分布在不同的 Broker 上,单个 Broker 宕机不会导致数据丢失。
ISR(In-Sync Replicas)同步副本集
ISR 是 Kafka 高可用机制的核心概念,指与 Leader 保持同步的副本集合。
ISR 的维护规则
Follower 副本需同时满足以下条件才能留在 ISR 中:
- 会话存活:Follower 必须与 ZooKeeper 保持活跃会话(Kafka 2.8+ 使用 KRaft 后改为与 Controller 通信)
- 同步不落后:Follower 的数据同步延迟不超过阈值,由
replica.lag.time.max.ms控制(默认 30 秒)
# 副本允许落后 Leader 的最大时间(超过则从 ISR 移除)
replica.lag.time.max.ms=30000
当 Follower 同步速度跟不上 Leader 的消息写入速度时,会被移出 ISR,进入 OSR(Out-of-Sync Replicas)列表。当 Follower 追上 Leader 后,会重新加入 ISR。
ISR 的重要性
只有 ISR 中的所有副本都确认接收到消息后(当 acks=all 时),该消息才被认为是”已提交”的。这保证了:
“只要至少有一个同步副本存活,已提交的消息就不会丢失。“
故障恢复场景
场景一:部分副本故障
当某个 Follower 副本所在的 Broker 宕机后恢复:
- 该 Follower 重新启动,发现自己的数据落后于 Leader
- Follower 向 Leader 发起数据拉取请求,从断点处开始同步
- 追上 Leader 的 HW(High Watermark)后,重新加入 ISR
场景二:Leader 副本故障
当 Leader 所在 Broker 宕机:
- Controller(集群控制器)检测到 Leader 宕机
- 从当前 ISR 列表中选举新的 Leader
- 其他 Follower 开始从新 Leader 同步数据
- 如果 ISR 为空,触发 unclean leader election(脏选举)
Leader 选举机制
正常 Leader 选举
Leader 选举由 Kafka Controller 负责协调,优先从 ISR 中选举:
ISR = [Broker1, Broker2, Broker3]
当 Broker1(Leader)宕机后:
新 Leader 从 {Broker2, Broker3} 中选取 → 优先选 Broker2(ISR 中第一个)
Controller 本身也有高可用保障——在 ZooKeeper 模式下,多个 Broker 竞争在 ZooKeeper 注册临时节点,成功者成为 Controller。
Unclean Leader Election(脏选举)
当 ISR 为空(所有同步副本都宕机)时,Kafka 面临两难选择:
| 策略 | 配置 | 特点 |
|---|---|---|
| 等待 ISR 恢复 | unclean.leader.election.enable=false(默认) | 强一致性,可能长时间不可用 |
| 从 OSR 中选 Leader | unclean.leader.election.enable=true | 高可用,但可能丢失数据 |
生产建议:金融、订单等对数据一致性要求极高的场景,保持默认值 false;对可用性要求高于一致性的场景(如日志收集),可设为 true。
ISR vs 多数投票对比
Kafka 的 ISR 机制与 Raft、ZAB 等采用的多数投票机制有所不同:
| 特性 | ISR 机制 | 多数投票 |
|---|---|---|
| 容忍 f 个副本故障需要的副本数 | f+1 | 2f+1 |
| 3 副本最多容忍故障数 | 2 | 1 |
| 写延迟 | 等待所有 ISR | 等待多数确认 |
| 性能 | 更高(副本少时) | 相对较低 |
ISR 的优势在于:在副本数较少的情况下,能比多数投票容忍更多的节点故障,同时保持相近的吞吐量。
HW 与 LEO
理解 Kafka 副本同步还需掌握两个关键概念:
- LEO(Log End Offset):每个副本当前写入的最新消息偏移量 + 1
- HW(High Watermark):消费者可见的最大偏移量,等于 ISR 中所有副本 LEO 的最小值
ISR 中各副本的 LEO:
Leader: LEO=100
Follower1: LEO=98
Follower2: LEO=97
HW = min(100, 98, 97) = 97
消费者只能消费到 offset=96 的消息
HW 机制确保消费者只能读取已被所有 ISR 副本确认的消息,从而保证 Leader 切换后消费者不会读到丢失的数据。