一守屉、問(wèn)題
????公司目前使用的是三臺(tái)服務(wù)器跑了Zookeeper和Kafka的集群來(lái)做管理隅忿。前兩天其中一臺(tái)服務(wù)器掛掉了膊爪,然后重啟機(jī)器后再次開(kāi)啟Kafka,控制臺(tái)一直在循環(huán)輸出以下錯(cuò)誤(中間的id一直會(huì)在累加)管毙,然后另外兩臺(tái)服務(wù)器的Kafka重啟后也會(huì)不斷的再刷這個(gè)錯(cuò)誤腿椎,導(dǎo)致集群無(wú)法開(kāi)啟。
Fetch request with correlation id 1171437 from client ReplicaFetcherThread-0-3?on partition [sp201804-18-part,16] failed due to Leader not local for partition
Fetch request with correlation id 1171438 from client?ReplicaFetcherThread-0-3?on partition [sp201804-18-part,16] failed due to Leader not local for partition
二锅风、分析
? ? 我們?cè)诎俣群凸雀枭弦菜褜ち撕芏辔恼滤址蹋蠖喽际钦f(shuō)是為什么,但沒(méi)有提供解決方案皱埠。其實(shí)這個(gè)就是因?yàn)槠渲幸慌_(tái)Kafka突然宕機(jī)肮帐,然后導(dǎo)致三臺(tái)Kafka集群之間數(shù)據(jù)同步及選擇Leader時(shí)循環(huán)故障導(dǎo)致的。
三边器、解決
? ? 其實(shí)這個(gè)問(wèn)題官方也沒(méi)給出什么解決辦法训枢,我們只能是將有問(wèn)題的Topic完全刪除,再新建Topic來(lái)恢復(fù)Kafka的運(yùn)行忘巧。
????接下來(lái)就介紹一下如何徹底的刪除一個(gè)Topic
? ??刪除kafka topic及其數(shù)據(jù)恒界,嚴(yán)格來(lái)說(shuō)并不是很難的操作。但是砚嘴,往往給kafka 使用者帶來(lái)諸多問(wèn)題十酣∩荆總結(jié)一套刪除kafka topic的標(biāo)準(zhǔn)操作方法。
step1:
????如果需要被刪除topic 此時(shí)正在被程序 produce和consume耸采,則這些生產(chǎn)和消費(fèi)程序需要停止兴泥。
????因?yàn)槿绻谐绦蛘谏a(chǎn)或者消費(fèi)該topic,則該topic的offset信息一致會(huì)在broker更新虾宇。調(diào)用kafka delete命令則無(wú)法刪除該topic搓彻。
????同時(shí),需要設(shè)置 auto.create.topics.enable = false嘱朽,默認(rèn)設(shè)置為true旭贬。如果設(shè)置為true,則produce或者fetch 不存在的topic也會(huì)自動(dòng)創(chuàng)建這個(gè)topic搪泳。這樣會(huì)給刪除topic帶來(lái)很多意向不到的問(wèn)題稀轨。
????所以,這一步很重要森书,必須設(shè)置auto.create.topics.enable = false靶端,并認(rèn)真把生產(chǎn)和消費(fèi)程序徹底全部停止谎势。
step2:
????server.properties 設(shè)置 delete.topic.enable=true
????如果沒(méi)有設(shè)置 delete.topic.enable=true凛膏,則調(diào)用kafka 的delete命令無(wú)法真正將topic刪除,而是顯示(marked for deletion)
step3:
????調(diào)用命令刪除topic:
????./bin/kafka-topics? --delete --zookeeper 【zookeeper server:port】? --topic 【topic name】
step4:
????刪除kafka存儲(chǔ)目錄(server.properties文件log.dirs配置脏榆,默認(rèn)為"/data/kafka-logs")相關(guān)topic的數(shù)據(jù)目錄猖毫。
????注意:如果kafka 有多個(gè) broker,且每個(gè)broker 配置了多個(gè)數(shù)據(jù)盤(pán)(比如 /data/kafka-logs,/data1/kafka-logs ...)须喂,且topic也有多個(gè)分區(qū)和replica吁断,則需要對(duì)所有broker的所有數(shù)據(jù)盤(pán)進(jìn)行掃描,刪除該topic的所有分區(qū)數(shù)據(jù)坞生。
????一般而言仔役,經(jīng)過(guò)上面4步就可以正常刪除掉topic和topic的數(shù)據(jù)。但是是己,如果經(jīng)過(guò)上面四步又兵,還是無(wú)法正常刪除topic,則需要對(duì)kafka在zookeeer的存儲(chǔ)信息進(jìn)行刪除卒废。具體操作如下:
????(注意:以下步驟里面沛厨,kafka在zk里面的節(jié)點(diǎn)信息是采用默認(rèn)值,如果你的系統(tǒng)修改過(guò)kafka在zk里面的節(jié)點(diǎn)信息摔认,則需要根據(jù)系統(tǒng)的實(shí)際情況找到準(zhǔn)確位置進(jìn)行操作)
step5:
????找一臺(tái)部署了zk的服務(wù)器逆皮,使用命令:
????bin/zkCli.sh -server 【zookeeper server:port】
????登錄到zk shell,然后找到topic所在的目錄:ls /brokers/topics参袱,找到要?jiǎng)h除的topic电谣,然后執(zhí)行命令:
????rmr /brokers/topics/【topic name】
????即可秽梅,此時(shí)topic被徹底刪除筝蚕。
????如果topic 是被標(biāo)記為 marked for deletion挺智,則通過(guò)命令 ls /admin/delete_topics捅暴,找到要?jiǎng)h除的topic妻率,然后執(zhí)行命令:
????rmr /admin/delete_topics/【topic name】
step6:
????完成之后洪规,調(diào)用命令:
????./bin/kafka-topics.sh --list --zookeeper 【zookeeper server:port】
????查看現(xiàn)在kafka的topic信息违崇。正常情況下刪除的topic就不會(huì)再顯示土辩。
????但是遭赂,如果還能夠查詢(xún)到刪除的topic潜索,則重啟zk和kafka即可臭增。
四、結(jié)局
? ? 重啟所有Kafka集群后竹习,Kafka無(wú)報(bào)錯(cuò)順利開(kāi)啟誊抛,然后開(kāi)啟生產(chǎn)者和消費(fèi)者,Kafka集群順利開(kāi)始工作整陌。
? ? 其實(shí)Kafka還是有很多坑的拗窃,使用Kafka兩年以來(lái),踏過(guò)了無(wú)數(shù)的坑泌辫,并且Kafka的周邊開(kāi)源項(xiàng)目較少随夸,監(jiān)控項(xiàng)目都不盡如人意。