问题现象
Kafka 的 topic 里堆了脏数据,想把里面的消息一次性清空重来。很多人第一步就卡住了:翻遍命令行工具没找到和清空相关的选项。
现象一:kafka-topics.sh --delete删掉 topic 之后立刻重建,却发现旧数据并没有马上消失,ls数据目录还能看到残留的分片文件,重建出来的 topic 有时还会消费到历史消息。
现象二:试图手动删除数据目录下的文件(rm -rf /data/kafka/topic-*),结果 broker 内存里还持有打开的文件句柄和元数据,出现不一致;严重时需要重启整个集群才能恢复。
现象三:临时把保留时间改成极小值,改完立刻去查,发现数据还在,以为方法失效,于是反复改、反复查,白折腾一圈。
现象四:清理完成之后忘了把保留时间改回去,新产生的数据按一秒的保留策略被迅速删除,业务侧出现消息丢失,排查时很难联想到几周前的一次运维操作。
现象五:在旧版本上使用新版的命令形态(或者反过来),报「unrecognized option」,不知道应该使用哪个入口。
原因分析
要理解为什么没有"一键清空",得先看清 Kafka 的数据删除机制。
Kafka 的消息删除不是「主动清空」,而是「按保留策略后台回收」。每个日志分片都受 topic 级别的保留配置约束:可以按时间(retention.ms)、也可以按大小(retention.bytes)。清理工