消费组位移保留与过期是什么
消费组的位移保存在 Kafka 内部主题里,和普通消息一样会过期:消费组长期没有成员后,位移记录会被清理,等同于一个全新的消费组。这时消费者重启后从哪开始读,取决于 auto.offset.reset 的取值——默认从最新开始,意味着一大段历史数据被静默跳过,而任务本身还会显示成功。
基本信息
| 关键参数 | offsets.retention.minutes(Broker 侧配置) |
|---|---|
| 默认语义 | 组失去全部成员后开始计时,超期即清理位移 |
| 存储位置 | 内部主题 __consumer_offsets,不宜手工读写 |
| 消费者行为 | 位移不存在时按 auto.offset.reset 决定起始位置(默认 latest) |
| 检查间隔 | 由 offsets.retention.check.interval.ms 控制清理频率 |
| 相关操作 | 可用 kafka-consumer-groups.sh 查看、重置或删除位移 |
典型使用场景
- 长期停用的链路重启:先确认位移是否还在,再决定起始位置
- 故障恢复核对:确认重启后是否会重复或跳过数据
- 位移清理:对不再使用的消费组删除位移,释放内部主题空间
- 容量评估:位移数量多时评估 __consumer_offsets 的分区与副本配置
- 补数前准备:需要从更早位置重读时,主动重置位移而不是依赖默认
查看与重置位移
查看与重置位移
# 查看某组的当前位移与滞后
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group order-loader
# 查看 Broker 侧的位移保留配置
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type brokers --entity-name 1 --describe | grep -i offsets.retention
# 需要重读历史时显式重置到最早,而不是依赖 auto.offset.reset
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--group order-loader --topic prod.order.created.v1 --reset-offsets --to-earliest --executeauto.offset.reset 取值
| 取值 | 无位移时的行为 | 适用场景 |
|---|---|---|
| latest | 从最新位置开始,跳过历史 | 实时任务默认,可容忍丢历史 |
| earliest | 从最早可用位置开始,全量重读 | 初始化加载或需要重放 |
| none | 直接抛错 | 要求必须已有位移,避免静默跳过 |
「停了几个月再启动还能接着消费」并不成立:位移过期后默认从最新读取,中间的数据会被静默跳过,任务日志里没有任何异常提示。
把位移保留期调长会占用 __consumer_offsets 的空间与元数据压力,调整前先评估消费组数量;临时停用的链路更稳妥的做法是导出并记录位移,重启时手动重置到记录位置。