Kafka

Kafka 进阶系统化学习大纲

·8 分钟阅读·3128 字

Kafka 组件/原理详解

📋 目录

Kafka 进阶系统化学习大纲(SRE/后端面试高频,从原理→运维→调优→故障,适配知识库整理)

一、前置基础回顾(进阶前置门槛)

  1. 基础架构:Broker、Topic、Partition、Replica、Producer/Consumer、ISR、ZK/KRaft
  2. 基础流程:消息发送、分区路由、offset、消费者组、自动提交offset

二、第一部分:存储底层原理(进阶核心,面试深挖)

1. 日志分段 LogSegment

  • segment 拆分规则:log.segment.bytes、log.roll.ms,.log/.index/.timeindex三类文件作用

  • log:原始消息二进制数据

  • index:offset→文件物理偏移量(稀疏索引)

  • timeindex:时间戳→offset索引

  • 消息查找流程:根据offset定位segment→索引快速寻址→读取磁盘数据

  • 日志删除策略:基于大小删除、基于时间删除、compact日志压缩

2. 日志压缩 Log Compaction

  • 适用场景:配置同步、库存状态(同key只保留最新消息)
  • 压缩触发条件、cleaner线程、压缩原理、脏数据残留问题
  • compact + 过期删除双策略混用配置

3. 零拷贝 Zero-Copy(sendfile)

传统IO:用户态→内核缓冲区→socket缓冲区;Kafka零拷贝原理,减少CPU拷贝,高吞吐根源

  • mmap内存映射作用(索引文件)

4. PageCache 操作系统缓存机制

  • 读写利用PageCache、顺序写磁盘、随机读缓存;
  • 宕机丢失数据场景:消息落PageCache未刷盘,OS宕机丢消息;刷盘参数:flush.*(Kafka不主动刷盘,依赖OS pdflush)

三、第二部分:副本与高可用(ISR/AR/OSR,生产重中之重)

1. AR/ISR/OSR 三集合

  • AR:分区全副本集合;ISR:同步中的副本集合;OSR:滞后副本
  • ISR扩缩容触发条件:replica.lag.time.max.ms
  • 副本同步机制:Leader写消息→Follower拉取日志同步,HW高水位、LEO末端偏移量

2. HW & LEO & Epoch(Kafka 0.11+ 消息幂等依赖)

  1. LEO:每个副本本地日志最后一条offset+1
  2. HW:ISR内最小LEO,HW之前消息对外可见
  3. Leader Epoch:解决副本重启日志截断错乱(老版本数据不一致坑)
  • 分区故障切换:Leader宕机,从ISR选新Leader规则

3. 副本同步异常场景

  • Follower网络卡顿踢出ISR、磁盘慢同步滞后、ISR为空无法选主、分区不可写

4. KRaft 新架构(弃用ZK,新版本必考)

  • ZK痛点:ZK只存元数据,Controller单点瓶颈;KRaft元数据集群化
  • Controller节点、元数据分区、迁移方案

四、第三部分:生产者进阶(可靠性、幂等、事务)

1. 发送三种应答机制 acks=0/1/all

  • acks=1:Leader落盘即返回(默认);acks=all:所有ISR副本同步完返回(最高可靠)
  • 可靠性与吞吐取舍选型

2. 生产者参数进阶

batch.size、linger.ms 批量发送优化;compression.type消息压缩(lz4/snappy)

  • 重试 retries、retry_backoff_ms,无序消息问题

3. 幂等生产者 Idempotent Producer

  • enable.idempotent=true,PID+Sequence实现单会话无重复,解决重试重复消息

4. Kafka 事务 Transaction

  • 跨分区原子写入:要么全部成功要么全部失败;transactional.id、事务超时配置
  • 适用场景:本地DB+Kafka事务(最终一致性)

五、第四部分:消费者进阶(位移、重平衡、性能)

1. Offset 三种保存位置

  • 老版本:ZK;新版本:__consumer_offsets系统Topic持久化offset

2. Offset提交:自动提交/手动提交

  • enable.auto.commit:自动提交时机(周期性),丢消息/重复消费场景;
  • 手动同步commitSync、异步commitAsync(带重试回调)生产选型

3. 消费者重平衡 Rebalance(面试TOP)

  • 触发条件:消费者上下线、分区扩容、订阅Topic变更
  • Rebalance全流程:Stop消费→协调器分配分区→启动消费
  • 痛点:Rebalance期间消费暂停,大规模集群卡顿优化
  • 优化方案:静态成员、减少会话超时时间、避免频繁启停

4. 消费丢失&重复消费根因(高频故障题)

  1. 丢消息:自动提交offset早于业务处理完毕;
  2. 重复消费:业务处理成功offset提交失败,重启重头消费;
  • 落地方案:手动提交offset、本地事务表、幂等消费

5. 分区分配策略

Range/轮询RoundRobin/Sticky粘滞分配(生产最优Sticky,减少Rebalance分区变动)

六、第五部分:分区规划、性能调优

1. Partition数目规划

  • 原则:分区数≈broker*2~3;单个分区上限吞吐、过多分区造成元数据压力、文件句柄暴涨
  • 分区扩容:alter命令扩容,扩容后Rebalance

2. 硬件选型&OS内核优化

  • 磁盘:顺序写入→SSD非必需,机械盘可用;网卡千兆/万兆;
  • OS调优:epoll、swappiness=1、磁盘预读、文件句柄放开

3. Broker核心参数调优

num.network.threads、num.io.threads;队列缓冲区、socket收发缓冲区

4. 消息积压优化(线上故障必考)

消息积压根因:消费速度 < 生产速度

  1. 临时方案:扩容消费者(不能超过分区数)
  2. 根治:优化消费逻辑、拆分消费、批量消费、异步落库
  3. 死信队列DLD:失败消息投递死信Topic,避免阻塞主消费

七、第六部分:高级特性

1. 死信队列 DLQ

消费异常消息重试N次失败后转入死信Topic,人工排查

2. 延时队列(原生不支持,两种实现)

  1. 客户端轮询分级延时Topic;2. 借助kafka定时索引插件

3. 镜像集群 MirrorMaker

跨机房同步Topic数据,双活/灾备架构

八、第七部分:线上故障汇总(面试场景题,整理知识库)

  1. Topic消息积压几十万/百万排查步骤
  2. 分区Leader频繁切换、ISR频繁抖动
  3. 生产者发送超时、NotEnoughReplicas异常(ISR不足acks=all阻塞写入)
  4. 消费者频繁Rebalance、消费卡顿
  5. 磁盘爆满:日志过期失效不删除、compact卡死

九、第八部分:实战架构选型

  1. 日志收集架构:Filebeat→Kafka→ELK
  2. 异步解耦:订单消息、库存扣减(幂等+事务)
  3. 大数据链路:Kafka→Flink实时计算

配套知识库整理格式(沿用你K8s卡片模板)

tags: #Kafka #进阶 #面试 #存储/高可用/故障排查
题型:简答/原理/故障排查
难度:中高级
题目:Kafka HW和LEO的作用?
精简答案:xxx
拓展原理:xxx
易错点:xxx
关联:ISR 副本同步

需要我拆分每日分段学习计划,或者单独提炼高频面试题?


关联文档