Offset 位移是什么
位移是消息在分区内的编号,从 0 开始单调递增。生产者每写入一条,分区的末尾位置就往后推一位,这个位置叫 LEO(Log End Offset);消费者记录自己下一条要读的位置,叫消费位移。两者之差就是积压 Lag。
为什么容易搞混
提交的位移语义是「下一条要读的位置」而不是「已读的最后一条」,所以重置位点时任何差一都会导致少读或多读一条。位移又分多种:分区的 LEO、组的已提交位移、以及客户端内存里下一次 poll 的当前位置,报障时必须先说清是哪一个。
基本信息
| Consumer Offset | 消费组已提交的进度,即下一条要读的位置 |
|---|---|
| Log End Offset | 分区末尾位置,等于已写入消息条数 |
| Lag | LEO 减去已提交位移,用于衡量积压 |
| 存储位置 | 提交后写入内部主题 __consumer_offsets |
| 重置工具 | kafka-consumer-groups.sh --reset-offsets |
输出逐列读法
| 输出字段 | 含义 | 正常/异常 |
|---|---|---|
| topic:partition:offset | 分区当前末尾位移(LEO) | 持续增长表示有新数据写入 |
| CURRENT-OFFSET | 组已提交的下一读取位置 | 小于 LEO 即为有积压 |
| LOG-END-OFFSET | 分区末尾位置 | 长时间不动说明上游断流 |
| LAG | LEO 与已提交位移之差 | 持续上涨为异常,负值需核对语义 |
典型使用场景
- 排障时确认积压规模:用 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,中间的未消费数据就跳过了,除非下游还能从别处补齐,否则不可逆。