Kafka64 条

Offset 位移概念

位移是消息在分区内的编号:生产者写入后递增的末尾位移叫 LEO,消费者记录下次要读的位置叫消费位移;两者之差就是积压(Lag)。

Offset 位移是什么

位移是消息在分区内的编号,从 0 开始单调递增。生产者每写入一条,分区的末尾位置就往后推一位,这个位置叫 LEO(Log End Offset);消费者记录自己下一条要读的位置,叫消费位移。两者之差就是积压 Lag。

为什么容易搞混

提交的位移语义是「下一条要读的位置」而不是「已读的最后一条」,所以重置位点时任何差一都会导致少读或多读一条。位移又分多种:分区的 LEO、组的已提交位移、以及客户端内存里下一次 poll 的当前位置,报障时必须先说清是哪一个。

基本信息

Consumer Offset消费组已提交的进度,即下一条要读的位置
Log End Offset分区末尾位置,等于已写入消息条数
LagLEO 减去已提交位移,用于衡量积压
存储位置提交后写入内部主题 __consumer_offsets
重置工具kafka-consumer-groups.sh --reset-offsets

输出逐列读法

输出字段含义正常/异常
topic:partition:offset分区当前末尾位移(LEO)持续增长表示有新数据写入
CURRENT-OFFSET组已提交的下一读取位置小于 LEO 即为有积压
LOG-END-OFFSET分区末尾位置长时间不动说明上游断流
LAGLEO 与已提交位移之差持续上涨为异常,负值需核对语义

典型使用场景

  • 排障时确认积压规模:用 LEO 减已提交位移估算待处理条数
  • 补数前评估重放量:算清从目标位点到 LEO 之间有多少消息
  • 确认消费是否真正推进:连续两次采样比较位移增量
  • 定位位点是否被重置:位移突然回退到很早的位置
  • 校验下游是否丢数:用源端位点区间与下游落库条数做核对

位移与积压查看

位移与积压查看
# 查看分区末尾位移(每个分区的 LEO)
kafka-get-offsets.sh --bootstrap-server localhost:9092 --topic orders
# orders:0:1024
# orders:1:998

# 查看消费组已提交位移与积压
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
  --describe --group order-consumer
位移不会因为消息过期而回退:分区日志按段删除后,LEO 继续增长,若组位移指向已被删除的位置,Kafka 会按 auto.offset.reset 策略处理(earliest 或 latest),这是「突然从头重放」的常见诱因。
生产环境重置位移前先导出当前位移备份:一旦重置到 latest,中间的未消费数据就跳过了,除非下游还能从别处补齐,否则不可逆。

易错点

  • 把 lag 当成消息丢失:lag 大只表示还没消费,消息仍在保留期内的分区日志里
  • 误以为提交的是「已读的最后一条」,重置位点时差一条,造成重复处理或多跳一条
  • 把位移重置到 latest 之前不导出备份、也不评估跳过的数据量,跳过的数据无法从 Kafka 追回
  • 长期不监控 LEO 与已提交位移的差值,等到下游业务反馈数据不全才发现积压已经持续数天

数据来源与参考

  • Apache Kafka 官方文档:Offsets and Consumer Position
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌