代理离线和客户端故障转移 - 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中为高毫秒)。超过此长度通常表示客户端配置或服务器端控制器负载存在问题。请参阅 “疑难解答” 部分。

通过检查其他经纪商的LeaderCount指标BytesInPerSec和指标的增长,可以验证成功的故障转移,这证明流量和领导力按预期移动。您还将观察到该UnderReplicatedPartitions指标会增加,这是当副本在关闭代理下脱机时出现的。

故障排除

上述流程可能会因破坏客户端-服务器合约而中断。最常见的问题原因包括:

  • Kafka 客户端库配置错误或使用不正确。

  • 第三方客户端库存在意想不到的默认行为和错误。

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

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

为了确保处理领导层故障转移的行为正确,我们建议:

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

  • 客户端库必须启用重试功能,以确保客户端可以处理故障转移。

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

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

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

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

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

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

  • 客户不应对 network/not_leader 的暂时异常发出警报,因为这些异常是正常的、无影响的,并且是 kafka 协议的一部分。

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