代理离线和客户端失效转移 - Amazon Managed Streaming for Apache Kafka

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

代理离线和客户端失效转移

Kafka 允许使用离线代理;在正常且平衡的集群中,遵循最佳实践的单个离线代理不会产生影响或导致生产或消费失败。这是因为另一个代理将接管分区领导权,也因为 Kafka 客户端库将自动进行失效转移并开始向新的领导者代理发送请求。

客户端服务器合约

这会导致客户端库和服务器端行为之间形成共享合约;服务器必须成功分配一个或多个新的领导者,而客户端必须更改代理以及时向新的领导者发送请求。

Kafka 使用异常来控制此流:

过程示例
  1. 代理 A 进入离线状态。

  2. Kafka 客户端收到异常(通常是网络断开连接或者 not_leader_for_partition)。

  3. 这些异常会触发 Kafka 客户端更新其元数据,以便它知道最新的领导者。

  4. Kafka 客户端恢复向其他代理上新的分区领导者发送请求。

使用公开发布的 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 客户端库配置错误或使用不正确。

  • 第三方客户端库的意外默认行为和错误。

  • 控制器过载导致分区领导者分配速度变慢。

  • 正在选举新的控制器,从而导致分区领导者分配速度变慢。

为了确保处理领导权失效转移的行为正确,我们建议:

  • 必须遵循服务器端最佳实践,以确保控制器代理得到适当扩展,从而避免领导权分配缓慢。

  • 客户端库必须启用重试以确保客户端处理失效转移。

  • 客户端库必须配置 retry.backoff.ms(默认值为 100)以避免连接/请求风暴。

  • 客户端库必须将 request.timeout.ms 和 delivery.timeout.ms 设置为符合应用程序 SLA 的值。对于某些故障类型,较高的值将导致失效转移速度变慢。

  • 客户端库必须确保 bootstrap.servers 至少包含 3 个随机代理,以避免对初始发现的可用性产生影响。

  • 一些客户端库比其他库的级别较低,并期望应用程序开发人员自己实现重试逻辑和异常处理。请参阅客户端库特定文档以了解示例用法,并确保遵循正确的重新连接/重试逻辑。

  • 我们建议监控客户端产生的延迟、成功请求数和不可重试错误的错误数。

  • 我们观察到,尽管生产和消费请求不受影响,但较旧的第三方 golang 和 ruby​​ 库在整个代理离线期间仍然很冗长。除了成功和错误的请求指标外,我们建议您始终监控业务级别指标,以确定日志中是否存在真正的影响和噪音。

  • 客户不应对 network/not_leader 的瞬态异常发出警报,因为它们是正常的、不产生影响的,并且是 kafka 协议的一部分。

  • 客户不应发出警报, UnderReplicatedPartitions 因为在单个离线经纪商期间,他们是正常的、无影响的,并且是预料之中的。