高可用架构
Kafka 高可用由 KRaft Controller Quorum、Broker、Partition Replica、ISR 和客户端重试共同组成。Controller 高可用负责元数据,Partition 副本高可用负责业务消息,两者不能混为一层。
高可用模块
| 模块 | 高可用职责 | 关键边界 |
|---|---|---|
| Bootstrap Server | 让客户端发现完整集群 | 不是固定代理层,客户端随后直连目标 Broker |
| KRaft Controller Quorum | 维护元数据并选举 Active Controller | 失去多数 Controller 会影响元数据变更和故障处理 |
| Partition Replica | 保存业务消息副本 | 复制因子决定副本总数,不直接等于可用写入数 |
| ISR | 限定可安全参与 Leader 选举和确认的同步副本 | ISR 收缩表示容错余量下降 |
| Producer/Consumer | 重试、刷新元数据和恢复会话 | 超时重试需要幂等,消费重投需要业务幂等 |
Controller Quorum
生产环境通常部署三个或五个独立 Controller。三个 Controller 可容忍一个故障,五个可容忍两个。Controller 数量过多会增加 Raft 协调成本。
Controller 管理 Broker 注册、Topic、Partition、配置、ACL 和 Leader 变化等元数据,但不保存每个 Partition 的业务消息副本。
Partition 副本
常见可靠性组合:
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=falseProducer 使用 acks=all 时,Broker 只有在 ISR 数量满足 min.insync.replicas 后才接受写入。三副本、最小两个 ISR 的配置通常可以容忍一个副本故障,并避免只剩单副本时继续确认高可靠写入。
acks=all 不表示等待全部配置副本,也不能防止 Producer 业务重复。应结合幂等 Producer 和业务幂等。
Leader 故障流程
- Controller 检测到 Broker 失联或 Replica 不可用。
- 从 ISR 中为受影响 Partition 选择新 Leader。
- Controller 发布新元数据,其他 Broker 更新视图。
- 客户端收到错误或元数据过期后刷新路由并重试。
- 原 Broker 恢复后截断不一致日志,从当前 Leader 追赶并重新加入 ISR。
如果没有可用 ISR 且禁用 Unclean Leader Election,Partition 会保持不可用,以避免选择落后副本造成数据丢失。
机架与故障域
通过 broker.rack 让副本分散到不同机架或可用区,避免三个副本都位于同一故障域。复制因子为三但副本同机架,不能抵御机架级故障。
跨可用区同步复制会增加延迟和带宽成本;跨地域通常使用独立集群加异步复制工具,而不是把高延迟地域直接组成单一 Kafka 集群。
Consumer 高可用
Consumer Group 通过 Rebalance 把故障成员的 Partition 分配给其他成员。要实现有效接管:
- Group 内至少有足够 Consumer 处理重新分配后的负载;
- Poll、Session、静态成员和 Rebalance 策略配置合理;
- Offset 提交与业务处理顺序明确;
- Consumer 能处理重复消息和分区撤销。
Consumer 多于 Partition 时,额外实例保持空闲,可提供进程故障后的快速容量,但它们不是 Broker 副本。
故障矩阵
| 故障 | 预期行为 | 风险与限制 |
|---|---|---|
| 单 Broker 故障 | ISR 副本选为 Leader,客户端刷新元数据 | ISR 收缩,需尽快恢复副本 |
| ISR 低于最小值 | acks=all 的写入失败 | 用可用性换取数据安全 |
| Controller 少数故障 | Quorum 保持多数时继续工作 | 容错余量降低 |
| Controller 失去多数 | 元数据控制面无法正常推进 | 已有数据面能力也会受故障变化限制 |
| Consumer 故障 | Group Rebalance,其他成员接管 | 可能重复处理,取决于 Offset 提交 |
| Unclean 选举 | 落后副本可能成为 Leader | 可能丢失已确认或已写入的尾部数据 |
验证清单
- 停止 Partition Leader,测量不可用时间和 Producer 重试;
- 停止一个 ISR,验证
min.insync.replicas; - 隔离 Controller,验证多数派和元数据操作;
- 检查 Replica 是否跨机架分布;
- 模拟 Consumer 崩溃,验证 Rebalance、重复处理和积压恢复;
- 定期检查 UnderReplicated、UnderMinIsr 和 Offline Partition。