kafka删除topic

作者: 码仙丶 | 来源:发表于2018-07-24 18:49 被阅读0次

    删除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会自动删除

    相关文章

      网友评论

        本文标题:kafka删除topic

        本文链接:https://www.haomeiwen.com/subject/phpymftx.html