刪除kafka topic及其數(shù)據(jù)累舷,嚴(yán)格來說并不是很難的操作蝇摸。但是橘洞,往往給kafka 使用者帶來諸多問題捌袜,發(fā)現(xiàn)都會(huì)偶然出現(xiàn)無法徹底刪除kafka的情況。
前提:kafka必須配置參數(shù)delete.topic.enable=true
- 如果需要被刪除topic 此時(shí)正在被程序 produce和consume炸枣,則這些生產(chǎn)和消費(fèi)程序需要停止
- 執(zhí)行刪除命令
./bin/kafka-topics --delete --zookeeper xxxx:2181 --topic topicName
- 執(zhí)行查詢命令
./bin/kafka-topics.sh --list --zookeeper xxxx:2181
如果topicName正常被刪除虏等,那說明正常刪除,如果被標(biāo)記為--marked for deletion
,說明還有對(duì)這個(gè)topic的引用
另外如果topic被標(biāo)記為--marked for deletion
,這時(shí)如果去zookeeper的/brokers/topics/
節(jié)點(diǎn)下刪除這個(gè)topic(不建議這樣做)适肠,雖然真的在kafka中查不到這個(gè)topic了霍衫,但是可能會(huì)引出很多意想不到的異常,例如常見的:
WARN Error while fetching metadata with correlation id 0 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
上面這個(gè)錯(cuò)誤就是異常topic引起的侯养,當(dāng)producer或consumer向這個(gè)topic發(fā)送數(shù)據(jù)/讀取數(shù)據(jù)時(shí)不會(huì)報(bào)錯(cuò)敦跌,也什么都不提示,只有打印log4j日志才可以看到上面的錯(cuò)誤信息逛揩,此時(shí)最簡(jiǎn)單的方法就是重建topic柠傍。
還有種方法是重啟zookeeper和kafka,這時(shí)topic應(yīng)該就恢復(fù)正常了辩稽,可是線上的kafka和zk怎么會(huì)讓你隨便重啟呢惧笛,所以最好的方法還是重建topic,避免這個(gè)問題的方法就是要正確刪除topic逞泄。
重點(diǎn)
- 不到萬不得已患整,千萬不要?jiǎng)觶k里的數(shù)據(jù),因?yàn)槲以趯?shí)際線上中發(fā)現(xiàn)有時(shí)即使刪了zk里的topic數(shù)據(jù)喷众,但kafka內(nèi)存中還是存在那個(gè)topic的并级,這是可能會(huì)引發(fā)意想不到的錯(cuò)誤,嚴(yán)重的可能導(dǎo)致kafka集群掛掉侮腹,慎重!稻励!
- 用命令刪除后就別再動(dòng)了(標(biāo)記狀態(tài))父阻,等kafka真正檢測(cè)到這個(gè)topic不用時(shí)(比如數(shù)據(jù)徹底過了保質(zhì)期)kafka會(huì)自行刪除這個(gè)topic
- 還有一種情況也是不能刪除topic的,就是假如要?jiǎng)h除的topic有分區(qū)或副本分別分布在broker0望抽、1加矛、2上,當(dāng)broker0宕機(jī)煤篙,此時(shí)broker0上有這個(gè)topic的分區(qū)和副本斟览,這時(shí)是刪不掉的,只有把broker0啟動(dòng)辑奈,topic會(huì)自動(dòng)刪除