转:https://www.jianshu.com/p/11dd353d0057

删除kafka topic及其数据,严格来说并不是很难的操作。但是,往往给kafka 使用者带来诸多问题,发现都会偶然出现无法彻底删除kafka的情况。
前提:kafka必须配置参数delete.topic.enable=true

  1. 如果需要被删除topic 此时正在被程序 produce和consume,则这些生产和消费程序需要停止
  2. 执行删除命令
    ./bin/kafka-topics --delete --zookeeper xxxx:2181 --topic topicName
  3. 执行查询命令
    ./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会自动删除

1 对 “kafka删除topic”的想法;

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注