kafka-run-class.sh kafka.tools.GetOffsetShell \ --bootstrap-server kafka:9092 --topic order-event --time -2 kafka-configs.sh --bootstrap-server kafka:9092 --alter \ --entity-type topics --entity-name order-event \ --add-config retention.ms=604800000
消费服务停摆四天,恢复启动时每个分区都报 OffsetOutOfRangeException,原先进度是 5620000,topic 最早可用位点已经变成 6180000。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,retention.ms 是 259200000,日志段按时间删除,四天没消费的位点对应的段已经不在了。位点重置策略是 none 时客户端直接抛异常。
围绕「Kafka 日志段清理」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:先查 earliest 和 latest 确认丢失的区间有多大;按业务时间从数据库补一份增量 不要直接 reset 到 earliest;把 retention.ms 调到 7 天 给停机留窗口;监控里加一条 earliest offset 变化告警。
改完只确认一件事:GetOffsetShell 的 earliest 不再继续上移 消费恢复后补数区间和业务库对得上。
