前言
我们都知道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件事:
- 备份现有topic
sh kafka-topics.sh --zookeeper localhost:2181 --list > all_topics
- 在kafka配置文件(server.properties)中添加一个参数。
delete.topic.enable=true #如果不加这个参数,被删除的topic会被标记为marked for deletion
- 删除kafka配置文件此参数下的所有内容。
log.dirs=/data/apps_data/kafka/kafka-logs
rm -rf /data/apps_data/kafka/kafka-logs/*
- 进到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,眼睛都快瞎左啦😭
- 全部删除完成之后,使用脚本重新添加即可。
while IFS= read -r line #等号后边加个空格
do
sh kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic
done
补充
zookeeper的常用操作如下:
-
登录
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没有命令提示符!
-
查看zookeeper相关信息
ls / #查看zookeeper基本信息 ls /brokers/topics #查看现有的topic ls /brokers/ids #查看brokers的id ls /brokers/ids/0 #查看id为0的服务器的信息
-
删除topic
ls /brokers/topics #查看集群broker主机下的topics deleteall /brokers/topics/test_topic #deleteall是较新版本的kafka支持的命令,而旧版本的kafka使用的是rmr
About me: 资深大猪蹄子