天天看點

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

可參考指令:

歡迎關注微信公衆号:大資料從業者