Skip to content

高可用架构

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 副本

常见可靠性组合:

properties
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false

Producer 使用 acks=all 时,Broker 只有在 ISR 数量满足 min.insync.replicas 后才接受写入。三副本、最小两个 ISR 的配置通常可以容忍一个副本故障,并避免只剩单副本时继续确认高可靠写入。

acks=all 不表示等待全部配置副本,也不能防止 Producer 业务重复。应结合幂等 Producer 和业务幂等。

Leader 故障流程

  1. Controller 检测到 Broker 失联或 Replica 不可用。
  2. 从 ISR 中为受影响 Partition 选择新 Leader。
  3. Controller 发布新元数据,其他 Broker 更新视图。
  4. 客户端收到错误或元数据过期后刷新路由并重试。
  5. 原 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。

参考资料