今天发现一个线上kafka(版本为0.8.2.2)多天前已不再消费的topic标记为删除(marked for deletion),而我们每天有定时删除topic的shell脚本,会把无用的topic干掉,但发现这些topic只是被标记为删除,而并没有真正删除,其server.properties的相关配置如下:
delete.topic.enable=true
log.retention.hours=72
既然自动删除没起作用(后来探查到原因是我们的监控服务还在访问这个topic),那就手动删除
要彻底把topic删除需要把kafka中与该topic相关的本地数据目录及zookeeper与该topic相关的路径删除。kafka的zookeeper root为/kafka,比如要删除topic为${topic_name}
1.删除kafka相关的数据目录
首先查看数据目录在server.properties配置如下: log.dirs=/data1/kafka_logs
执行 rm -r /data1/kafka_logs/${topic_name}*
2.删除kafka topic ${KAFKA_HOME}/bin/kafka-topics.sh --delete --zookeeper ${ZOOKEEPER_HOST}:2181/kafka --topic ${topic_name}
3.删除zookeeper相关的路径
进入${ZOOKEEPER_HOME}/bin/zkCli.sh
执行下面的命令 rmr /kafka/consumers/${topic_name}-group
rmr /kafka/config/topics/${topic_name}
rmr /kafka/brokers/topics/${topic_name}
rmr /kafka/admin/delete_topics/${topic_name}
4.用下面命令查看相关的topic还在不在: ${KAFKA_HOME}/bin/kafka-topics.sh --list --zookeeper ${ZOOKEEPER_HOST}:2181/kafka --topic ${topic_name}
如果仍然删除不了的话,需要检查kafka数据目录中的recovery-point-offset-checkpoint和replication-offset-checkpoint文件里是否有该topic的信息