2017-06-16 73 views
1

我想了解卡夫卡消息丟失的以下行爲。簡而言之,當一個經紀人很早就死去,隨後在一些消息處理之後,所有其他經紀人都會死亡。如果首先死亡的經紀人開始上市,那麼他們出現後就不會趕上其他經紀人。相反,所有其他經紀人都會報告錯誤並重置抵消額以匹配第一個經紀人。預期這種行爲,以及確保零消息丟失的更改/設置是什麼?卡夫卡經紀人對領導層變更的消息丟失情況

卡夫卡版本:2.11-0.10.2.0

重現步驟

  • 開始1個飼養員實例和3個卡夫卡經紀人
  • 創建一個話題的3複製因子和3
  • 分區附加卡夫卡控制檯消費者專題
  • 使用的卡夫卡控制檯生產者生產2條消息
  • 名殺害兩名經紀人(1 & 2)
  • 發送兩條消息
  • 殺死最後剩餘的經紀人(0)
  • 造就經紀人(1)誰沒有見過的最後兩個消息
  • 造就經紀人(2 )誰見過的最後兩條消息,它顯示了一個錯誤
[2017-06-16 14:45:20,239] INFO Truncating log my-second-topic-1 to offset 1. (ka 
fka.log.Log) 
[2017-06-16 14:45:20,253] ERROR [ReplicaFetcherThread-0-1], Current offset 2 for 
partition [my-second-topic,1] out of range; reset offset to 1 (kafka.server.Rep 
licaFetcherThread) 
  • 最後連接kafka-console-consumer,它會看到兩條消息,而不是已發佈的四條消息。

回答

2

響應這裏:https://kafka.apache.org/documentation/#producerconfigs

確認的數量生產者要求領導者在考慮一個請求完成之前已經收到了。這將控制發送的記錄的持久性。允許以下設置:

  • acks = 0如果設置爲零,則生產者根本不會等待來自服務器的任何確認。該記錄將被立即添加到套接字緩衝區並被視爲已發送。在這種情況下,不能保證服務器已經收到記錄,並且重試配置不會生效(因爲客戶端通常不會知道任何故障)。爲每條記錄返回的偏移量始終設置爲-1。
  • acks = 1這將意味着領導會將記錄寫入其本地日誌,但會在未等待所有追隨者完全確認的情況下作出響應。在這種情況下,如果領導者在承認記錄後但在追隨者複製之前立即失敗,那麼記錄將會丟失。
  • acks = all這意味着領導者將等待全套的in-sync副本確認記錄。這保證只要至少有一個同步副本保持活動狀態,記錄就不會丟失。這是最強有力的保證。這相當於acks = -1設置。

默認情況下的ACK = 1,以便將其設置爲 '所有': acks=all在producer.properties文件

3

檢查unclean.leader.election.enable =真,如果是這樣,將其設置以使只有insync的複製品才能成爲領導者。如果允許不同步複製品成爲領導者,則消息可能會被截斷並丟失。

相關問題