代理人離線和用戶端容錯 - Amazon Managed Streaming for Apache Kafka

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

代理人離線和用戶端容錯

卡夫卡允許離線經紀人;按照最佳實踐的健康和平衡的集群中的單個離線代理不會看到影響或導致生產或消耗失敗。這是因為另一個經紀人將接管分區領導地位,並且因為卡夫卡客戶端庫將自動故障轉移並開始向新的領導者經紀人發送請求。

客戶服務器合同

這會導致客戶端庫和服務器端行為之間的共享合同; 服務器必須成功分配一個或多個新的領導者,並且客戶必須更改代理程序以及時向新的領導者發送請求。

卡夫卡使用異常來控制這一流程:

範例程序
  1. 代理人 A 進入離線狀態。

  2. 卡夫卡客戶端接收異常(通常是網絡斷開連接或不分區)。

  3. 這些異常觸發卡夫卡客戶端更新其元數據,以便它了解最新的領導者。

  4. 卡夫卡客戶恢復向其他經紀人的新分區領導者發送請求。

使用有價格的 Java 客戶端和默認配置時,該過程通常不到 2 秒。客戶端錯誤是冗長和重複的,但不會引起關注,由「WARN」級表示。

範例:例外狀況 1

10:05:25.306 [kafka-producer-network-thread | producer-1] WARN o.a.k.c.producer.internals.Sender - [Producer clientId=producer-1] Got error produce response with correlation id 864845 on topic-partition msk-test-topic-1-0, retrying (2147483646 attempts left). Error: NETWORK_EXCEPTION. Error Message: Disconnected from node 2

範例:例外狀況 2

10:05:25.306 [kafka-producer-network-thread | producer-1] WARN o.a.k.c.producer.internals.Sender - [Producer clientId=producer-1] Received invalid metadata error in produce request on partition msk-test-topic-1-41 due to org.apache.kafka.common.errors.NotLeaderOrFollowerException: For requests intended only for the leader, this error indicates that the broker is not the current leader. For requests intended for any replica, this error indicates that the broker is not a replica of the topic partition.. Going to request metadata update now"

Kafka 客戶端通常會在 1 秒鐘和最多 3 秒內自動解決這些錯誤。這在客戶端度量中以 p99 的形式顯示為生產/消費延遲(通常為 100 毫秒)。超過此值的時間通常表示用戶端設定或伺服器端控制器負載有問題。請參閱疑難排解部分。

可以通過檢查其他經紀人上的BytesInPerSecLeaderCount指標增加來驗證成功的故障轉移,這證明了流量和領導力按預期移動。您也會觀察到UnderReplicatedPartitions指標的增加,當複本離線使用關閉代理程式時,這是預期的。

故障診斷

上述流程可以通過打破客戶端-服務器合同而中斷。問題的最常見原因包括:

  • Kafka 用戶端庫的配置錯誤或使用不正確。

  • 第三方客戶端庫的意外默認行為和錯誤。

  • 控制器過載導致分割區引線指定速度較慢。

  • 正在選擇新的控制器,導致分割區引線指派速度較慢。

為了確保正確的行為來處理領導力故障轉移,我們建議:

  • 必須遵循伺服器端最佳做法,以確保控制器代理程式適當調整,以避免緩慢的領導指派。

  • 用戶端程式庫必須啟用重試,以確保用戶端可處理容錯移轉。

  • 用戶端程式庫必須已設定重試 .backoffoff.ms (預設值為 100),以避免連線/要求風暴。

  • 客戶端庫必須將請求 .timeout.ms 和交付 .timeout.ms 設置為與應用程序內聯的值。SLA較高的值會導致特定失敗類型的容錯移轉速度較慢。

  • 用戶端程式庫必須確保 bootstrap.server 包含至少 3 個隨機代理程式,以避免對初始探索造成可用性影響。

  • 有些用戶端程式庫的層級低於其他用戶端程式庫,並期望應用程式開發人員自行實作重試邏輯和例外狀 請參閱客戶端庫特定文檔以獲取示例用法,並確保遵循正確的重新連接/重試邏輯。

  • 我們建議您監視產生的用戶端延遲、成功的要求計數,以及不可重試錯誤的錯誤計數。

  • 我們觀察到,儘管生成和使用請求不受影響,但較舊的第三方 golang 和 ruby 庫在整個代理脫機時間段內仍保持冗長狀態。除了請求成功和錯誤的指標之外,我們建議您始終監視業務級指標,以確定日誌中是否存在真正的影響與噪音。

  • 客戶不應對網絡 /not_leader 的暫時異常發出警報,因為它們是正常的,無影響的,並且預期作為卡夫卡協議的一部分。

  • 客戶不應警報, UnderReplicatedPartitions 因為他們是正常的,沒有影響,並且在單個離線經紀人期望。