日志記錄
FATAL Fatal error during KafkaServerStable startup. Prepare to shutdown (kafka.server.KafkaServerStartable)
java.lang.IllegalArgumentException: requirement failed: Corrupt index found, index file (/home/kafka/kafka_2.9.2-0.8.1/logs/sampleTopic-1/00000000000006911940.index) has non-zero size but the last offset is 6911940 and the base offset is 6911940
該問題出現在kafka broker被強制幹掉的情況,如果kill -9 或者所在機器直接異常。
Kafka啟動時加載log的步驟:
以一個partition log目錄為例::
<1> 首先删除所有字尾名為.cleaned和.delete的檔案:
<2> 對于.swp結尾的檔案,如果是log檔案則直接恢複(去掉.swp, 變為.log);
如果是index檔案直接删掉(然後rebuild index檔案);
<3> 對于.index檔案,如果沒有對應的.log檔案(同一個logSement其index和log的主檔案名相同), 則删除該index檔案;
<4> 對于.log檔案,加載如記憶體;如果其沒有對應的.index檔案(可能在第<2>步中被删除), 重新恢複其index檔案;
<5> 假設到這一步為止Kafka還沒有加載到logSements, 說明該partition log目錄下為空,一個新的log sement對象會被建立在記憶體;
反之則轉向第<6>步;
<6> 如果Kafka已經加載到log, 最會開始recover log segments。
至于為什麼要recover log segments, 是因為大多數情況下,recover的目的就是檢查Kafka上次關閉時是不是cleanShutDown (可通過檢查partition log目錄下是不是有字尾名為.kafka_cleanshutdown的檔案确定);
如果是cleanShutDown(字尾名為.kafka_cleanshutDown的檔案存在),則無需recover log segment;
如果不是cleanShutDown, 則需要recover log segments;
<6.1> 這裡解釋下什麼是recover a log segment?
在非cleanShutDown情況下, 一個log sement的log及index檔案末尾可能有一些不合法的資料(invalid), 我們需要把它們截掉;
首先要做的最簡單檢查,是log或index檔案大小不能超過配置中設定的值(比方說一個.log檔案中被設定最多儲存10000條消息,超過10000條的都要抛棄掉);
<7> 最後做sanityCheck, 主要是檢查每個log sement的index檔案,確定不會加載一個出錯的Log Segment;
解決方法:
删除每個topic-partition目錄下的*.index檔案,重新開機Kafka server, 如果資料多的話,rebuild index會花較長時間。等索引重新建立完成,kafka就能正常工作了。
可參考指令:
歡迎關注微信公衆号:大資料從業者