前言

我们都知道kafka管理的主要对象之一就是topic。对topic的增伤查改是最基本的操作。但是如果你使用kafka命令删除topic时报错该怎么办?就只能卸载掉kafka重新安装了吗?

当然不是了。我们可以使用zookeeper去物理删除topic。

 

正文

由于前段时间迁移云服务器,为图省事就使用了自定义脚本。所以在迁移完毕之后,kafka内容和配置还是原机器的。当我去删除kafka的topic时:

sh kafka-topics.sh --delete --zookeeper localhost:2181 --topic test_topic

发现报了这两个错误。

Topic is marked for deletion.

Replication factor: 1 larger than available brokers: 0.

我简单想了一下,可能是原来的kafka集群有3个broker,现在改成了单个broker,所以报错了。

经过一番查询资料,我发现使用命令无法删除也没关系,可以进到zookeeper物理删除。

于是,我就做了以下5件事:

  1. 备份现有topic
sh kafka-topics.sh --zookeeper localhost:2181 --list > all_topics
  1. 在kafka配置文件(server.properties)中添加一个参数。
delete.topic.enable=true    #如果不加这个参数,被删除的topic会被标记为marked for deletion
  1. 删除kafka配置文件此参数下的所有内容。
log.dirs=/data/apps_data/kafka/kafka-logs  
rm -rf /data/apps_data/kafka/kafka-logs/*
  1. 进到zookeeper的客户端,从客户端删掉想要删除的topic。
sh zookeeper-shell.sh localhost:2181  #如果没装zk服务的话,就可以使用kafka/bin目录下的zookeeper-shell脚本去登录zookeeper客户端

ls /brokers/topics                    #查看集群broker主机下的topics
deleteall /brokers/topics/test_topic  #deleteall是较新版本的kafka支持的命令,而旧版本的kafka使用的是rmr

zookeeper下的操作很反人类,没有输入提示,不支持jio本,只能一个一个删。笔者删了300+个topic,眼睛都快瞎左啦😭

  1. 全部删除完成之后,使用脚本重新添加即可。
while IFS= read -r line  #等号后边加个空格
do
  sh kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic 
done

 

补充

zookeeper的常用操作如下:

  1. 登录

    sh zookeeper-shell.sh localhost:2181
    Connecting to localhost:2181
    Welcome to ZooKeeper!
    JLine support is disabled
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:None path:null
    

zookeeper没有命令提示符!

  1. 查看zookeeper相关信息

    ls / #查看zookeeper基本信息
    
    ls /brokers/topics  #查看现有的topic
    
    ls /brokers/ids     #查看brokers的id
    
    ls /brokers/ids/0   #查看id为0的服务器的信息
    
  2. 删除topic

    ls /brokers/topics                    #查看集群broker主机下的topics
    deleteall /brokers/topics/test_topic  #deleteall是较新版本的kafka支持的命令,而旧版本的kafka使用的是rmr
    
posted on 2020-07-02 16:04  eryoung2  阅读(1769)  评论(0编辑  收藏  举报