删除kafka topic及其数据,严格来说并不是很难的操作。但是,往往给kafka 使用者带来诸多问题,发现都会偶然出现无法彻底删除kafka的情况。
前提:kafka必须配置参数delete.topic.enable=true
- 如果需要被删除topic 此时正在被程序 produce和consume,则这些生产和消费程序需要停止
- 执行删除命令
./bin/kafka-topics --delete --zookeeper xxxx:2181 --topic topicName
- 执行查询命令
./bin/kafka-topics.sh --list --zookeeper xxxx:2181
如果topicName正常被删除,那说明正常删除,如果被标记为--marked for deletion
,说明还有对这个topic的引用
另外如果topic被标记为--marked for deletion
,这时如果去zookeeper的/brokers/topics/
节点下删除这个topic(不建议这样做),虽然真的在kafka中查不到这个topic了,但是可能会引出很多意想不到的异常,例如常见的:
WARN Error while fetching metadata with correlation id 0 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
上面这个错误就是异常topic引起的,当producer或consumer向这个topic发送数据/读取数据时不会报错,也什么都不提示,只有打印log4j日志才可以看到上面的错误信息,此时最简单的方法就是重建topic。
还有种方法是重启zookeeper和kafka,这时topic应该就恢复正常了,可是线上的kafka和zk怎么会让你随便重启呢,所以最好的方法还是重建topic,避免这个问题的方法就是要正确删除topic。
重点
- 不到万不得已,千万不要动zk里的数据,因为我在实际线上中发现有时即使删了zk里的topic数据,但kafka内存中还是存在那个topic的,这是可能会引发意想不到的错误,严重的可能导致kafka集群挂掉,慎重!!
- 用命令删除后就别再动了(标记状态),等kafka真正检测到这个topic不用时(比如数据彻底过了保质期)kafka会自行删除这个topic
- 还有一种情况也是不能删除topic的,就是假如要删除的topic有分区或副本分别分布在broker0、1、2上,当broker0宕机,此时broker0上有这个topic的分区和副本,这时是删不掉的,只有把broker0启动,topic会自动删除
网友评论