Amazon MSK 集群故障排除 - Amazon Managed Streaming for Apache Kafka
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon MSK 集群故障排除

以下信息可帮助您排查 Amazon MSK 集群可能存在的问题。您也可以将问题发布到 Amazon MSK 论坛

使用者组卡在 PreparingRebalance 状态

如果一个或多个使用器组停滞在永久重新平衡状态,原因可能是 Apache Kafka 问题 KAFKA-9752,这会影响 Apache Kafka 版本 2.3.1 和 2.4.1。

要解决此问题,我们建议您将集群升级到 Amazon MSK 错误修复版本 2,其中包含此问题的修复。有关将现有集群更新到 Amazon MSK 错误修复版本 2更新 Apache Kafka 版本 的信息,请参阅。

解决此问题而不将集群升级到 Amazon MSK 错误修复版本 2静态成员资格协议 的解决方法是将 Kafka 客户端设置为使用 标识并重启,或者将 设置为卡住使用者组的协作代理节点。

实施静态成员资格协议

要在您的客户端中实施静态成员资格协议,请执行以下操作:

  1. group.instance.id Kafka Consumers 配置的 属性设置为用于标识组中使用者的静态字符串。

  2. 确保配置的其他实例已更新以使用静态字符串。

  3. 将更改部署到您的 Kafka 使用者。

如果在客户端配置中将会话超时设置为一个持续时间,则使用静态成员资格协议将更高效,该持续时间允许使用者在不提前触发使用器组重新平衡的情况下进行恢复。例如,如果您的使用者应用程序可以容忍 5 分钟的不可用性,则会话超时的合理值为 4 分钟,而不是默认值 10 秒。

注意

使用静态成员资格协议仅减小遇到此问题的可能性。您可能仍会遇到此问题,即使使用静态成员资格协议也是如此。

重启协调代理节点

要重启协作代理节点,请执行以下操作:

  1. 使用 kafka-consumer-groups.sh 命令标识组协调器。

  2. 使用 RebootBroker API 操作重启卡住使用者组的组协调器。

将代理日志传送到 Amazon CloudWatch Logs 时出错

当您尝试将集群设置为向 Amazon CloudWatch Logs 发送代理日志时,可能会遇到两个异常之一。

如果您收到 InvalidInput.LengthOfCloudWatchResourcePolicyLimitExceeded 异常,请重试,但使用以 /aws/vendedlogs/ 开头的日志组。 有关更多信息,请参阅从某些 AWS 服务启用日志记录

如果遇到 InvalidInput.NumberOfCloudWatchResourcePoliciesLimitExceeded 异常,请在您的账户中选择一个现有 Amazon CloudWatch Logs 策略,并将以下 JSON 附加到该策略。

{"Sid":"AWSLogDeliveryWrite","Effect":"Allow","Principal":{"Service":"delivery.logs.amazonaws.com"},"Action":["logs:CreateLogStream","logs:PutLogEvents"],"Resource":["*"]}

如果您尝试将上述 JSON 附加到现有策略,但收到一个错误,指出您已达到所选策略的最大长度,请尝试将 JSON 附加到另一个 Amazon CloudWatch Logs 策略中。将 JSON 附加到现有策略后,再次尝试设置将代理日志传送到 Amazon CloudWatch Logs。

无默认安全组

如果您尝试创建集群,并收到错误指示没有默认安全组,则可能是因为您使用的是共享 VPC。请向管理员申请向您授予描述此 VPC 上的安全组的权限,然后重试。有关允许此操作的策略的示例,请参阅 Amazon EC2:。 允许以编程方式和在控制台 中管理与特定 VPC 关联的 EC2 安全组。

集群显示卡在 CREATING 状态

有时,集群创建可能需要长达 30 分钟。请等待 30 分钟,然后再次检查集群的状态。

集群状态从 CREATING 变为 FAILED

请尝试再次创建集群。

集群状态为 ACTIVE,但生成器无法发送数据,或者使用器无法接收数据

  • 如果集群创建成功(集群状态为 ACTIVE),但您无法发送或接收数据,请确保生成器和使用器应用程序有权访问集群。有关更多信息,请参阅第4步: 创建客户机中的指南。

  • 如果您的生产器和使用器有权访问集群,但仍出现生成和使用数据问题,原因可能是 KAFKA-7697,这会影响 Apache Kafka 2.1.0 版本,并可能导致一个或多个代理发生死锁。请考虑迁移到 Apache Kafka 2.2.1,该版本不受此错误影响。有关如何迁移的信息,请参阅使用ApacheKafka迁移群集 MirrorMaker

AWS CLI 无法识别 Amazon MSK

如果您已安装 AWS CLI,但是该程序无法识别 Amazon MSK 命令,请将您的 AWS CLI 升级到最新版本。有关如何升级 AWS CLI 的详细说明,请参阅安装 AWS 命令行界面。有关如何使用 AWS CLI 运行 Amazon MSK 命令的信息,请参阅 Amazon MSK:工作方式

分区脱机或副本不同步

这些可能是磁盘空间不足的症状。请参阅磁盘空间不足

磁盘空间不足

请参阅以下有关管理磁盘空间的最佳实践:监控磁盘空间调整数据保留参数

内存不足

如果您发现 MemoryUsed 指标太高或 MemoryFree 太低,这并不意味着存在问题。Apache Kafka 的设计初衷是充分利用内存,并以最佳方式管理内存。

创建者获得NotLeaderForPartitionException

这往往是临时错误。将生成器的 retries 配置参数设置为高于其当前值的值。

复制中的分区 (URP) 大于零

UnderReplicatedPartitions 指标是要监控的重要指标。在正常运行的 MSK 集群中,此指标的值为 0。如果它大于零,这可能是由以下某个原因所致。

  • 如果 UnderReplicatedPartitions 是峰值,问题可能在于该集群的大小配置不合适,无法处理传入和传出流量。请参阅将集群设置为正确大小

  • 如果 UnderReplicatedPartitions 始终大于 0(包括在低流量期间),则问题可能在于您已设置了限制性 ACLs,并且该未向代理授予主题访问权。要复制分区,必须向代理授予 READ 和 DESCRIBE 主题的权限。默认情况下,将随 READ 授权一起授予 DESCRIBE 权限。有关设置 ACLs 的信息,请参阅 Apache Kafka 文档中的授权和 ACLs

集群具有名为 __amazon_msk_canary 的主题

您可能会看到 MSK 集群 具有名为 __amazon_msk_canary 的主题。 这是一个内部主题,Amazon MSK 会创建并将其用于集群运行状况和诊断指标。此主题的大小可以忽略不计,并且无法删除。

联网问题

如果您的 Apache Kafka 应用程序无法与 MSK 集群成功通信,可以先执行以下连接测试。

  1. 使用获取 Amazon MSK 集群的引导代理中介绍的方法之一获取引导代理的地址。

  2. 在以下命令中,替换 bootstrap-broker 替换为您在上一步中获得的代理地址之一。Replace port-number (如果集群设置为使用 TLS 身份验证)。如果集群不使用 TLS 身份验证,请替换 port-number 替换为 9092。从客户端计算机运行命令。

    telnet bootstrap-broker port-number
  3. 对所有引导代理重复运行上面的命令。

  4. 使用获取 ZooKeeper 的 Apache Amazon MSK 集群 连接字符串中介绍的方法之一获取集群的 Apache ZooKeeper 节点的地址。

  5. 在客户端计算机上运行以下命令,并将 Apache-ZooKeeper-node 替换为您在上一步中获取的某个 Apache ZooKeeper 节点的地址。数字 2181 是端口号。对所有 Apache ZooKeeper 节点重复此操作。

    telnet Apache-ZooKeeper-node 2181

如果客户端计算机能够访问代理和 Apache ZooKeeper 节点,则意味着没有连接问题。在这种情况下,可以运行以下命令来检查 Apache Kafka 客户端是否设置正确。获取 bootstrap-brokers,请使用获取 Amazon MSK 集群的引导代理中所述的任何方法。Replace topic 替换为您的 主题的名称。

bin/kafka-console-producer.sh --broker-list bootstrap-brokers --producer.config client.properties —topic topic

如果上一个命令成功,则表示客户端设置正确。如果仍然无法从应用程序创建和使用,请在应用程序级别调试问题。

如果客户端计算机无法访问代理和 Apache ZooKeeper 节点,请参阅以下小节以了解基于客户端计算机设置的指导。

同一 VPC 中的 Amazon EC2 客户端和 MSK 集群

如果客户端计算机与 MSK 集群位于同一 VPC 中,请确保集群的安全组具有接受来自客户端计算机安全组的流量的入站规则。有关设置这些规则的信息,请参阅安全组规则。有关如何从与集群位于同一 VPC 中的 Amazon EC2 实例访问集群的示例,请参阅开始使用 Amazon MSK

Amazon EC2 不同 MSK 集群 中的 客户端和 VPCs

如果客户端计算机和集群位于两个不同的 VPCs 中,请确保满足以下条件:

  • 这两个 VPCs 是对等的。

  • 对等连接处于活动状态。

  • 两个 VPCs 的路由表已正确设置。

有关 VPC 对等连接的信息,请参阅使用 VPC 对等连接

本地客户端

对于设置为使用 AWS VPN 连接到 MSK 集群的本地客户端,请确保满足以下条件:

  • VPN 连接状态为 UP。 有关如何检查 VPN 连接状态的信息,请参阅如何检查 VPN 隧道的当前状态?

  • 集群 VPC 的路由表包含目标格式为 Virtual private gateway(vgw-xxxxxxxx) 的本地 CIDR 的路由。

  • MSK 集群的安全组允许端口 2181、端口 9092(如果您的集群接受纯文本流量)和端口 9094(如果您的集群接受 TLS 加密的流量)上的流量传输。

有关 AWS VPN 问题排查方面的更多指导,请参阅客户端 VPN 问题排查

AWS Direct Connect

如果客户端使用 AWS Direct Connect,请参阅 AWS Direct Connect 问题排查

如果上述问题排查指导未能解决此问题,请确保没有防火墙阻止网络流量。若要进一步调试,请使用 tcpdumpWireshark 等工具来分析流量,并确保流量到达 MSK 集群。