如何解决我的 Amazon MSK 使用者组不断重新平衡的问题?

1 分钟阅读
0

我的 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.recordsmax.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 状态

AWS 官方
AWS 官方已更新 1 年前