Kafka重啟出錯:Corrupt index found


日志記錄

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就能正常工作了。

可參考命令:

find kafka-logs/ -size 10485760c -name *.index -exec rm -rf {} \; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM