天天看點

【kafka異常】kafka 常見異常處理方案(持續更新! )

文章目錄

  • ​​1. Leader的epoch過時​​
  • ​​2. 修改Broker.id出現異常​​
  • ​​3. 檔案加鎖失敗 Failed to acquire lock on file .lock in​​
  • ​​4. 發送消息報錯 UNKNOWN_TOPIC_OR_PARTITION​​
  • ​​5. Error while reading checkpoint file xxxx/cleaner-offset-checkpoint​​
  • ​​6. InconsistentBrokerMetadataException​​
  • ​​7. log.dir相關異常 Failed to load xxx during broker startup​​
  • ​​8. meta.properties 版本資訊不對​​
  • ​​9. Listeners 配置不一緻​​

日常運維

問題排查

怎麼能夠少了滴滴開源的

​​​滴滴開源LogiKM一站式Kafka監控與管控平台​​

1. Leader的epoch過時

The leader epoch in the request is older than the epoch on the broker

--

Partition $topicPartition marked as failed      

解決方法

說明 目前分區的Leader的epoch比Broker的epoch老

是以導緻follow去fetchleader的時候報錯;

隻要重新發生一下Leader選舉就行了;

2. 修改Broker.id出現異常

Configured broker.id 0 doesn't match stored broker.id 1 in meta.properties.
 If you moved your data, make sure your configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).
      
出現這種情況一般是 你可能中途修改了Broker的配置​

​broker.id​

​​; 又或者修改了​

​log.dir​

​​路徑,然後這個路徑之前存在;

你可以看看​​

​log.dir​

​​檔案夾下面的​

​meta.properties​

​#Wed Jun 23 17:59:02 CST 2021 broker.id=0 version=0 cluster.id=0 ​

這裡面的内容是之前的配置,你修改了​

​broker.id​

​之後跟這裡不一緻就抛出異常了;

解決方法

如果這個​

​log.dir​

​​是屬于這個Broker的,那麼将​

​server.properties​

​​ 的broker.id修改成更​

​meta.properties​

​​一緻就行

如果你就是想修改一下BrokerId; 那麼你需要把​​

​meta.properties​

​​中的broker.id該了;

反正最終是要讓​​

​meta.properties​

​​和​

​server.properties​

​ 中的broker.id保持一緻;

如果這個​

​log.dir​

​​是是以前的廢舊資料的話,那你還是換一個路徑好了;​

​server.properties​

​​中的​

​log.dir​

​換個路徑

修改Broker.id可能出現的異常

其實不是很建議修改BrokerId;

修改BrokerId可能會存在一些問題,比如

  1. 目前正在進行資料遷移; zk上的儲存的還是原來的​

    ​broker.Id​

    ​; 那就會導緻這台Broker遷移失敗
  2. 當你修改的​

    ​broker.Id​

    ​​; 那麼如果配置了動态配置的話, 就不會生效了;是以你要記得把原來的動态配置添加回來; zk節點是:​

    ​/config/brokers/{brokerID}​

  3. other

​meta.properties​

​作用

其實通過這裡你應該也可以了解為什麼會存在​

​meta.properties​

​​ 這個檔案; 他就是用來保持這個log.dir之前的Broker.id和cluster.id=0還有version的;因為你​

​server.properties​

​​裡這個個配置可以随便更改,難免會有出錯; kafka會将你的配置跟這個​

​meta.properties​

​資訊作對比,提醒你的配置不正确;

3. 檔案加鎖失敗 Failed to acquire lock on file .lock in

Failed to acquire lock on file .lock in /Users/xxxx/work/IdeaPj/xxx/kafka/kafka-logs-0. A Kafka instance in another process or thread is using this directory.
      

異常原因:

Broker在啟動的時候,會把​

​log.dirs​

​​加上一個檔案鎖,以防其他程式對它進行篡改;

出現這種異常表示已經有一個程式對檔案夾加上了鎖了; 是以擷取失敗;

解決方法

這個時候你要檢查一下,這個Broker是否已經啟動過了,或者兩個Broke中​

​log.dirs​

​​配置了相同的檔案夾;

如果上面你确定沒有問題,那你還可以把相應的檔案夾的​​

​.lock​

​檔案删掉; 強制去掉鎖檔案; (不建議這樣操作)

4. 發送消息報錯 UNKNOWN_TOPIC_OR_PARTITION

WARN [Producer clientId=console-producer]  Error while fetching metadata with correlation id :  {test80=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)      

異常原因:

發送的TopicPartition不存在; 要麼是Topic不存在 要麼是發送過去的Partition不存在

解決方法

  1. 檢查一下是不是Topic不存在
  2. 檢查一下發送的Partition所在的Broker當機了,導緻發送失敗(特别是發送消息的時候指定了分區号比較容易出現這個問題)
  3. 檢查是不是Topic所在的Broker全部當機了;

5. Error while reading checkpoint file xxxx/cleaner-offset-checkpoint

Error while reading checkpoint file /Users/shirenchuang/work/IdeaPj/didi_source/kafka/kafka-logs-2/cleaner-offset-checkpoint      

6. InconsistentBrokerMetadataException

kafka.common.InconsistentBrokerMetadataException: BrokerMetadata is not consistent across log.dirs. This could happen if multiple brokers shared a log directory (log.dirs) or partial data was manually copied from another broker. Found:
- kafka-logs-0 -> BrokerMetadata(brokerId=0, clusterId=0)
- kafka-logs-1 -> BrokerMetadata(brokerId=1, clusterId=0)      

異常原因:

在同一個Broker中,配置了多個​

​log.dirs​

​​ 日志檔案夾,但是卻發現這兩個檔案夾歸屬于不同的Broker, 那麼就會抛出異常;

假設配置檔案 ​​

​log.dirs=kafka-logs-1,kafka-logs-0​

​​ 配置了兩個檔案夾. 那麼啟動的時候會去加載這兩個檔案夾的 ​

​meta.properties​

​​檔案 讀取裡面的​

​broker.id,cluster.id​

​​組成一個​

​brokerMetadataMap​

​對象; 正常情況下, 他們的值肯定是一樣的,但是假如一台機器上部署了多個Broker,還想公用同一個dir,那麼肯定是不行的;

解決方法

如果想要配置多個dir,那麼找到對應哪個dir是已經被其他Broker使用了, 不用這個dir就行了;

7. log.dir相關異常 Failed to load xxx during broker startup

Failed to load ${dir.getAbsolutePath} during broker startup      

異常原因:

啟動的時候讀取檔案夾​

​log.dirs​

​​檔案裡面的​

​meta.properties​

​的時候抛IOException,讀取失敗

解決方法

查詢一下是不是對應的dir中的檔案​

​meta.properties​

​有什麼異常(是否有權限讀取等等)
Duplicate log directory found: xxxx      

異常原因:

​log.dirs​

​​ 設定的檔案夾重複了;比如: ​

​log.dirs=kafka-logs-0,kafka-logs-0​

解決方法

檢查一下是不是設定重複了
Found directory /xxxx/kafka/kafka-logs-0/test, 'test' is not in the form of topic-partition or topic-partition.uniqueId-delete (if marked for deletion).
Kafka's log directories (and children) should only contain Kafka topic data.      

異常原因:

​log.dirs​

​​檔案夾中存在不符合條件的檔案夾,一般裡面的檔案夾的格式都是 ​

​topic-分區号​

​​ ,​

​topic-分區号-future​

​​ ,​

​topic-分區号-delete​

解決方法

自檢一下不合格的檔案夾

8. meta.properties 版本資訊不對

[2021-07-21 13:38:19,246][ERROR][main]: Failed to create or validate data directory /Users/xxx/kafka/kafka-logs-0
java.io.IOException: Failed to load /Users/xxxx/kafka/kafka-logs-0 during broker startup      

異常原因:

meta.properties 中的version的資訊是不是異常了,正常情況下是0;
【kafka異常】kafka 常見異常處理方案(持續更新! )

解決方法

嘗試将 ​

​meta.properties​

​ 直接删除,啟動的時候會重新生成

9. Listeners 配置不一緻

Listeners are not identical across brokers: 
      

異常代碼位置

MetadataCache#updateMetadata

【kafka異常】kafka 常見異常處理方案(持續更新! )

原因:

叢集中的Broker配置的 listeners的配置中的監聽器名不一緻。

解決方案:

listeners配置檢查一下是不是有的broker配置了多了監聽器

關于作者:石臻臻的雜貨鋪, 專注于 Java領域、大資料領域 等知識分享, 内容多為 原理 、源碼、實戰 等等, 堅持輸出幹貨,所寫内容必定經過驗證,并深入源碼分析,保證内容準确性, 長期在CSDN、和公衆号【石臻臻的雜貨鋪】釋出原創文章,歡迎關注! 如果有相關技術領域問題,歡迎進群交流,各個領域都有專人解答,你所問的,都會得到回應!

歡迎