我的 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 取用者群組持續的在重新平衡。我想疑難排解發生這種情況的原因。
解決方案
Apache Kafka 取用者通常是取用者群組的成員之一。發生下列情況時,取用者群組的每個取用者都會收到來自主題中不同分割區子集的訊息:
- 多個取用者訂閱一個主題。
- 這些取用者屬於相同的取用者群組。
當取用者無法連線到叢集時,群組協調器會從取用者群組中移除取用者。此程序會啟動包含下列動作的重新平衡事件:
- 其餘的取用者都從他們的分割區釋放。
- 群組協調器將主題的分割區重新分配給其餘的取用者。
在下列情況下,您的取用者群組可能會重新平衡:
- 您將分割區擁有權從一個取用者移至取用者群組的另一個取用者。
- 您將新取用者新增至取用者群組。
- 取用者關閉、當機或離開取用者群組。
- 您修改了主題,並發生了分割區重新調整。
- 取用者群組訂閱中有用戶端組態問題。這是因為群組所訂閱的主題與指派給群組中每個個別取用者的主題不相符所致。
在重新平衡事件完成之前,相同取用者群組內的取用者無法繼續取用資料。這是分割區指派的預設行為。您可以透過將分割區指派策略變更為 CooperativeStickyAssignor 來避免這種情況。
為避免取用者群組持續重新平衡,請嘗試以下操作:
- 請降低取用者組態的 max.partition.fetch.bytes 值,或提高工作階段逾時 (session.timeout.ms) 值。取用者必須定期呼叫 poll() 以避免工作階段逾時及隨之發生的重新平衡。如果單一 poll() 呼叫傳回的資料量很大,則取用者可能需要很長時間來處理資料。這表示取用者無法及時進入輪詢迴圈的下一個循環以避免工作階段逾時。
注意: 為 session.timeout.ms 設定較高的值可以減少意外發生重新平衡的機會。然而,可能需要更長的時間才能偵測到真正的錯誤。此參數與 heartbeat.interval.ms 有關。heartbeat.interval.ms 參數控制 KafkaConsumer poll() 方法向群組協調器傳送活動訊號的頻率。然而,session.timeout.ms 參數控制取用者可以在不發送活動訊號的情況下執行多久。
例如,假設您是執行 Apache Kafka 0.10.1 或更新版本,並且處理需要較長時間才能處理的記錄。在這種情況下,請調整 max.poll.interval.ms 以處理輪詢新記錄之間較長的延遲。
- 請確定取用者組態的 session.timeout.ms 值低於中介裝置組態的 group.max.session.timeout.ms 值。
- max.poll.interval.ms 為取用者在擷取更多記錄前可以閒置多長時間設定一個上限。依預設,此值設定為 5 分鐘。如果此值設定為小於 5 分鐘,請提高該值以減少重新平衡的機會。您也可以考慮降低 max.poll.records 和 max.poll.interval.ms。
- heartbeat.interval.ms 是當您使用 Kafka 的群組管理功能時,取用者協調器預期的活動訊號間隔時間。活動訊號是用來確保取用者的工作階段保持作用中狀態。當新取用者加入或離開群組時,它們有助於重新平衡。此值必須設定為低於 session.timeout.ms 值。一般而言,這個值必須設定為低於 session.timeout.ms 的三分之一。您可以選擇將 heartbeat.interval.ms 值降到更低,以控制正常重新平衡的預期時間。
- 如果您最近執行了涉及變更取用者群組其中一個已訂閱主題中分割區的分割區重新指派,則取用者群組可能會重新平衡。這是因為涉及的分割區已經移動或變更。在這種情況下,請避免重新啟動群組協調器或其他 Kafka 中介裝置。您必須等待分割區重新指派完成,才能嘗試停止取用者群組重新平衡。最佳實務是在低流量期間進行分割區重新指派。
在某些情況下,您可能會在 Amazon MSK 中介裝置日誌中看到下列資訊:
[2023-03-01 01:23:45,678] INFO [GroupCoordinator 1]: Preparing to rebalance group amazon.msk.canary.group.broker-1 in state PreparingRebalance with old generation 382660 (__consumer_offsets-21) (reason: Adding new member consumer-amazon.msk.canary.group.broker-1-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx with group instance id None) (kafka.coordinator.group .GroupCoordinator)
此訊息表示 amazon.msk.canary.group.broker-N 正處於 PreparingRebalance 狀態。
amazon.msk.canary.group.broker-N 群組是定期新增或移除的內部取用者群組,以檢查叢集運作狀態和診斷指標。這些群組很小,且無法刪除。您可以忽略此訊息。
相關資訊
取用者群組停留在 PreparingRebalance 狀態