Kafka 高可用机制
一、基础核心:分区副本机制
- Topic 会划分多个 Partition 分区,每个分区配置多个副本(replica),副本分散部署在不同 Broker 节点,避免单节点故障丢失数据。
- 副本分两类角色:
- Leader 副本:所有生产者写入、消费者读取只走 Leader;
- Follower 副本:仅同步 Leader 的数据,不处理客户端读写请求。
- 写入数据时,Leader 把日志同步给所有 Follower,通过 ack 机制控制同步多少副本才算写入成功。
二、核心容错:ISR 同步副本集合(重中之重)
ISR 全称 In-Sync Replicas,指和 Leader 保持实时同步、无数据滞后的副本集合。
ISR 准入规则
Follower 定期向 Leader 发送拉取请求,如果长时间没同步上(超出replica.lag.time.max.ms),会被踢出 ISR;追上数据后重新加入。
ISR 高可用价值
- 只有 ISR 内的副本才有资格被选举为新 Leader;
- 写入配置 acks=all 时,必须等待所有 ISR 副本落盘,才算消息写入成功,极大降低丢数据概率;
- 杜绝数据不一致副本上位,保证新 Leader 拥有完整已提交数据。
三、Leader 宕机自动故障转移流程
- 分区 Leader 所在 Broker 宕机、断网;
- Controller 控制器感知节点下线,找到该分区 ISR 集合里存活的副本;
- 从 ISR 中选举一个 Follower 作为新 Leader;
- 生产者、消费者自动重连新 Leader,业务无感知恢复读写;
- 故障节点恢复上线后,作为 Follower 同步缺失日志,重新加入 ISR。
补充 Controller 高可用:集群一台 Broker 作为 Controller,负责分区 Leader 分配、故障调度;Controller 宕机,集群自动重新选举新 Controller,无单点问题。
四、生产者侧高可靠(防止消息丢失 / 重复)
通过 acks 参数控制写入可靠性,三个档位:
- acks=0:不等 Broker 响应,吞吐最高,极易丢消息,生产禁用;
- acks=1(默认):Leader 写入本地磁盘即返回,Leader 刚写完未同步 Follower 就宕机,会丢消息;
- acks=all /acks=-1:等待所有 ISR 副本同步完成再返回,数据安全性最高,金融、订单业务必用。
配套保障:
- 生产者重试 retries:网络抖动发送失败自动重试;
- 幂等生产者 + 事务:避免重试造成消息重复,支持跨分区原子写入。
五、消费者侧高可靠(防止消息重复、丢失)
- 位移 offset 持久化到__consumer_offsets 内部 Topic(多副本),Broker 宕机位移不丢失;
- 手动提交 offset:业务处理完成再提交,防止消费中途宕机丢失消息;
- 消费组均衡机制:Consumer 宕机,组内其他消费者自动分配其分区,不会阻塞消费;
- 配合重试 Topic 处理消费失败消息,避免无限阻塞分区。
六、底层磁盘持久化兜底
- Kafka 消息直接顺序写入磁盘文件,而非依赖内存,机器重启数据不丢失;
- 日志分段存储,支持定期清理过期数据;
- 刷盘策略可配置,同步刷盘进一步降低内存丢数据风险(默认操作系统页缓存异步刷盘,性能更高)。
七、生产避坑点(面试实战加分)
- 副本数量建议 3 个,ISR 至少保留 2 个节点,允许单台 Broker 故障;
- 不要把同一分区的多个副本部署在同一台机器,失去副本意义;
- 高可靠业务必须配置 acks=all,搭配足够的 ISR 副本;
- 分区扩容可横向提升吞吐,天然支持集群水平扩展。
简短精简总结
Kafka 高可用核心依靠分区多副本 + ISR 同步集合;Leader 故障自动从 ISR 选举新主,Controller 统一调度集群故障;生产者通过 acks、幂等事务保证写入可靠;消费者 offset 持久化到内部多副本 Topic 防止丢消费位点;数据顺序落盘磁盘兜底,整套机制保证节点宕机不丢消息、业务快速恢复。
