我們有一個由 3 個盒子組成的 2.3 Kafka 集群。當(dāng)我們幾天前將它升級到 2.3 時,我們注意到那些日志消息導(dǎo)致兩個代理上的一個主題分區(qū)的 replicaFetcher 線程崩潰:[2019-08-09 15:02:43,520] ERROR [ReplicaFetcher replicaId=4, leaderId=3, fetcherId=0] Unexpected error occurred while processing data for partition __consumer_offsets-21 at offset 57542337 (kafka.server.ReplicaFetcherThread)kafka.common.UnexpectedAppendOffsetException: Unexpected offset in append to __consumer_offsets-21. First offset 57542333 is less than the next offset 57542337. First 10 offsets in append: List(57542333,57542334, 57542335, 57542336, 57542337, 57542338, 57542339, 57542340, 57542341, 57542342), last offset in append: 57570869. Log start offset = 56949140 at kafka.log.Log.$anonfun$append$2(Log.scala:929) at kafka.log.Log.maybeHandleIOException(Log.scala:2065)影響是一個 broker 不能成為這個主題分區(qū)的 ISR(實際上第二個 broker 有同樣的問題,所以我們只有一個 ISR,它是領(lǐng)導(dǎo)者)。我仍然對這條消息感到困惑,我無法正確理解它,所以我無法找到解決此問題的正確方法。我真的很想了解這里發(fā)生了什么,但不確定我是否理解以下代碼:https://github.com/apache/kafka/blob/a48b5d900c6b5c9c52a97124a1b51aff3636c32c/core/src/main/scala/kafka/log/Log.scala#L1081-L1098 if (appendInfo.firstOrLastOffsetOfFirstBatch < nextOffsetMetadata.messageOffset) {當(dāng) replicaFetcher 必須附加記錄時,它如何訪問 nextOffset 信息..?不確定這個分析到底做了什么(要追加的當(dāng)前記錄?):val appendInfo = analyzeAndValidateRecords(records, isFromClient = isFromClient)和這個 :nextOffsetMetadata這是下一批記錄嗎?它如何訪問任何“下一個”記錄元數(shù)據(jù)?如果有人可以澄清這一點,那就太好了。與此同時,解決這個問題的方法會很好,但我還是更愿意清楚地理解它。編輯:經(jīng)過一些研究,有些事情變得更加清晰。nextOffset 只是活動段的最新偏移量+1(這些元數(shù)據(jù)來自 loadSegments() 調(diào)用)。綜上所述,這里發(fā)生了什么:副本從領(lǐng)導(dǎo)者那里獲取段,其起始偏移量低于活動段的最新偏移量。所以這是我的問題,為什么副本不只是截斷?
2 回答

慕容708150
TA貢獻1831條經(jīng)驗 獲得超4個贊
我們的一個 kafka 集群正在運行 kafka 1.1.1 并遇到了同樣的問題,類固醇。在我們的例子中,ReplicaFetcher 崩潰了,并且完全停止了復(fù)制。解決方案是刪除受感染的分區(qū),讓 kafka 從健康的副本中重新創(chuàng)建。我們試圖修復(fù)分區(qū)文件夾中不一致的條目,但沒有成功。

湖上湖
TA貢獻2003條經(jīng)驗 獲得超2個贊
一種解決方案是停止故障代理并從磁盤中刪除故障分區(qū)日志,然后重新啟動代理。然后副本 Fetcher 將停止抱怨,代理將能夠進入 ISR。
添加回答
舉報
0/150
提交
取消