Kafka 高可用机制

一、基础核心:分区副本机制

  1. Topic 会划分多个 Partition 分区,每个分区配置多个副本(replica),副本分散部署在不同 Broker 节点,避免单节点故障丢失数据。
  2. 副本分两类角色:
    • Leader 副本:所有生产者写入、消费者读取只走 Leader;
    • Follower 副本:仅同步 Leader 的数据,不处理客户端读写请求。
  3. 写入数据时,Leader 把日志同步给所有 Follower,通过 ack 机制控制同步多少副本才算写入成功。

二、核心容错:ISR 同步副本集合(重中之重)

ISR 全称 In-Sync Replicas,指和 Leader 保持实时同步、无数据滞后的副本集合。

ISR 准入规则

Follower 定期向 Leader 发送拉取请求,如果长时间没同步上(超出replica.lag.time.max.ms),会被踢出 ISR;追上数据后重新加入。

ISR 高可用价值

  1. 只有 ISR 内的副本才有资格被选举为新 Leader;
  2. 写入配置 acks=all 时,必须等待所有 ISR 副本落盘,才算消息写入成功,极大降低丢数据概率;
  3. 杜绝数据不一致副本上位,保证新 Leader 拥有完整已提交数据。

三、Leader 宕机自动故障转移流程

  1. 分区 Leader 所在 Broker 宕机、断网;
  2. Controller 控制器感知节点下线,找到该分区 ISR 集合里存活的副本;
  3. 从 ISR 中选举一个 Follower 作为新 Leader;
  4. 生产者、消费者自动重连新 Leader,业务无感知恢复读写;
  5. 故障节点恢复上线后,作为 Follower 同步缺失日志,重新加入 ISR。

补充 Controller 高可用:集群一台 Broker 作为 Controller,负责分区 Leader 分配、故障调度;Controller 宕机,集群自动重新选举新 Controller,无单点问题。

四、生产者侧高可靠(防止消息丢失 / 重复)

通过 acks 参数控制写入可靠性,三个档位:

  1. acks=0:不等 Broker 响应,吞吐最高,极易丢消息,生产禁用;
  2. acks=1(默认):Leader 写入本地磁盘即返回,Leader 刚写完未同步 Follower 就宕机,会丢消息;
  3. acks=all /acks=-1:等待所有 ISR 副本同步完成再返回,数据安全性最高,金融、订单业务必用。

配套保障:

  • 生产者重试 retries:网络抖动发送失败自动重试;
  • 幂等生产者 + 事务:避免重试造成消息重复,支持跨分区原子写入。

五、消费者侧高可靠(防止消息重复、丢失)

  1. 位移 offset 持久化到__consumer_offsets 内部 Topic(多副本),Broker 宕机位移不丢失;
  2. 手动提交 offset:业务处理完成再提交,防止消费中途宕机丢失消息;
  3. 消费组均衡机制:Consumer 宕机,组内其他消费者自动分配其分区,不会阻塞消费;
  4. 配合重试 Topic 处理消费失败消息,避免无限阻塞分区。

六、底层磁盘持久化兜底

  1. Kafka 消息直接顺序写入磁盘文件,而非依赖内存,机器重启数据不丢失;
  2. 日志分段存储,支持定期清理过期数据;
  3. 刷盘策略可配置,同步刷盘进一步降低内存丢数据风险(默认操作系统页缓存异步刷盘,性能更高)。

七、生产避坑点(面试实战加分)

  1. 副本数量建议 3 个,ISR 至少保留 2 个节点,允许单台 Broker 故障;
  2. 不要把同一分区的多个副本部署在同一台机器,失去副本意义;
  3. 高可靠业务必须配置 acks=all,搭配足够的 ISR 副本;
  4. 分区扩容可横向提升吞吐,天然支持集群水平扩展。

简短精简总结

Kafka 高可用核心依靠分区多副本 + ISR 同步集合;Leader 故障自动从 ISR 选举新主,Controller 统一调度集群故障;生产者通过 acks、幂等事务保证写入可靠;消费者 offset 持久化到内部多副本 Topic 防止丢消费位点;数据顺序落盘磁盘兜底,整套机制保证节点宕机不丢消息、业务快速恢复。