New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
如何对尝试连接到 Amazon MSK 集群时收到的错误进行故障排除?
我在尝试连接到 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 集群时收到错误。
解决方法
与特定身份验证类型无关的错误
当您尝试连接到 Amazon MSK 集群时,您可能会收到以下错误之一,这些错误与您使用的身份验证类型无关。
java.lang.OutOfMemoryError: Java 堆空间
当您运行不包含客户端属性文件的集群操作命令时,您会收到 OutOfMemoryError 错误。要解决此问题,请根据身份验证类型在 client.properties 文件中包含相应属性。
仅包含 AWS Identity and Access Management (IAM) 身份验证端口的示例命令:
./kafka-topics.sh --create --bootstrap-server $BOOTSTRAP:9098 --replication-factor 3 --partitions 1 --topic TestTopic
包含 IAM 身份验证端口和客户端属性文件的示例命令:
./kafka-topics.sh --create --bootstrap-server $BOOTSTRAP:9098 --command-config client.properties --replication-factor 3 --partitions 1 --topic TestTopic
org.apache.kafka.common.errors.TimeoutException: 等待节点分配时超时。调用:createTopics
当客户端应用程序与 Amazon MSK 集群之间存在网络配置错误时,您可能会收到 TimeoutException 错误。
要对此问题进行故障排除,请在客户端计算机上运行以下连接测试:
telnet bootstrap-broker port-number
**注意:**请将 bootstrap-broker 替换为 Amazon MSK 集群中的一个代理地址。根据为集群启用的身份验证,请将 port-number 替换为相应的端口值。
如果客户端计算机可以访问代理,则表明不存在连接问题。如果客户端计算机无法访问代理,请检查网络连接。检查安全组的入站和出站规则。
org.apache.kafka.common.errors.TopicAuthorizationException: 未获授权,无法访问主题:[test_topic]
当您使用 IAM 身份验证且您的访问策略阻止主题操作(例如 WriteData 和 ReadData)时,您会收到 TopicAuthorizationException 错误。
**注意:**权限边界和服务控制策略 (SPC) 还会阻止用户在未获得必要授权的情况下尝试连接到集群。
如果您使用的是非 IAM 身份验证,请检查您是否添加了阻止操作的主题级访问控制列表 (ACL)。
运行以下命令列出应用于某个主题的 ACL:
bin/kafka-acls.sh --bootstrap-server $BOOTSTRAP:PORT --command-config adminclient-configs.conf --list --topic testtopic
ZooKeeperClientTimeoutException
当客户端尝试通过 Apache ZooKeeper 字符串连接到集群但无法建立连接时,您可能会收到 ZooKeeperClientTimeoutException 错误。.当 Apache ZooKeeper 字符串不正确时,您也可能会收到此错误。
不正确的 Apache Zookeeper 字符串示例:
./kafka-topics.sh --zookeeper z-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181,z-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181,z-3.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:2181 --list[2020-04-10 23:58:47,963] WARN Client session timed out, have not heard from server in 10756ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn)
输出示例:
[2020-04-10 23:58:58,581] WARN Client session timed out, have not heard from server in 10508ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn) [2020-04-10 23:59:08,689] WARN Client session timed out, have not heard from server in 10004ms for sessionid 0x0 (org.apache.zookeeper.ClientCnxn) Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:259) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23) at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253) at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:255) at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:113) at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1858) at kafka.admin.TopicCommand$ZookeeperTopicService$.apply(TopicCommand.scala:321) at kafka.admin.TopicCommand$.main(TopicCommand.scala:54) at kafka.admin.TopicCommand.main(TopicCommand.scala)
要解决此问题,请执行以下操作:
- 确认您使用的是正确的 Apache ZooKeeper 字符串。
- 确保您的 Amazon MSK 集群的安全组允许来自客户端安全组的入站流量通过 Apache ZooKeeper 端口。
代理可能不可用
“60000 毫秒后,元数据中未出现主题“topicName”,或者无法建立到节点 -<node-id> (<broker-host>/<broker-ip>:<port>) 的连接。代理可能不可用。(org.apache.kafka.clients.NetworkClient)”
当存在以下情况之一时,您可能会收到上述错误:
- 生产者或使用者无法连接到代理主机和端口。
- 代理字符串不正确。
如果即使客户端或代理连接最初正常运行,您仍收到此错误,则可能是代理不可用。
当您使用用于生成数据的代理字符串从虚拟私有云 (VPC) 外部访问集群时,您也可能会收到此错误。
生产者代理字符串示例:
./kafka-console-producer.sh --broker-list b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092 --topic test
输出示例:
[2020-04-10 23:51:57,668] ERROR Error when sending message to topic test with key: null, value: 1 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.TimeoutException: Topic test not present in metadata after 60000 ms.
使用者代理字符串示例:
./kafka-console-consumer.sh --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9092 --topic test
输出示例:
[2020-04-11 00:03:21,157] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -1 (b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.6.19:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) [2020-04-11 00:04:36,818] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -2 (b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.44.252:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) [2020-04-11 00:05:53,228] WARN [Consumer clientId=consumer-console-consumer-88994-1, groupId=console-consumer-88994] Connection to node -1 (b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com/172.31.6.19:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
要对此问题进行故障排除,请执行以下操作:
- 确保使用正确的代理字符串和端口。
- 如果代理不可用,请检查 Amazon CloudWatch 指标 ActiveControllerCount,以验证该控制器在此期间是否处于活动状态。如果指标值不是 1,则表示集群中的其中一个代理可能不可用。
- 查看 ZooKeeperSessionState 指标,以确认代理一直在与 Apache ZooKeeper 节点通信。
- 要了解代理失败的原因,请查看 KafkaDataLogsDiskUsed 指标,以确定代理的存储空间是否耗尽。有关详细信息,请参阅用于使用 CloudWatch 监控标准代理的 Amazon MSK 指标。
- 检查网络配置是否导致了此问题。Amazon MSK 资源在 VPC 内预调配。您必须连接到 Amazon MSK 集群,或者通过同一 VPC 中的私有网络从该集群中生产和使用。有关信息,请参阅无法从 AWS 内部访问集群:网络问题和如何从 AWS 网络内部但在集群的 Amazon VPC 外部连接到我的 Amazon MSK 集群?
元数据中不存在主题
“org.apache.kafka.common.errors.TimeoutException: 60000 毫秒后元数据中不存在主题测试”
当您尝试写入的主题在 Amazon MSK 中不存在时,您会收到上述错误。检查 Amazon MSK 集群中是否存在该主题。确认您在客户端配置中使用了正确的代理字符串和端口。如果该主题不存在,请在 Amazon MSK 中创建主题,或在集群配置中将 auto.create.enable 设置为 true。当 auto.create.enable 设置为 true 时,会自动创建主题。
当主题存在但分区不存在时,您也可能会收到此错误。例如,您有一个分区 [0],但您的生产者尝试发送到分区 [1]。
确保您的 Amazon MSK 集群的安全组允许来自客户端应用程序安全组的入站流量通过相应端口。
如果在系统之前正常运行后突然出现错误,请执行以下操作来检查 Amazon MSK 代理的状态:
- 查看 ActiveControllerCount 指标。该值必须为 1。当该指标有任何其他值时,则表示集群中的其中一个代理不可用。
- 查看 ZooKeeperSessionState 指标,以确认代理一直在与 ZooKeeper 节点通信。
- 监控 KafkaDataLogsDiskUsed 指标,以确保代理没有耗尽存储空间。
确认您没有尝试在没有正确配置的情况下从 VPC 外部访问集群。默认情况下,Amazon MSK 资源在 VPC 内预调配。您必须通过同一 VPC 中的私有网络进行连接。
如果您尝试从 VPC 外部访问集群,请确保设置必要的联网配置,例如 AWS Client VPN 或 AWS Direct Connect。
Kafka 客户端生产者或使用者的配置不正确
要解决 Kafka 客户端生产者或使用者的不正确配置问题,请验证您的客户端配置是否包含正确的引导服务器。此外,请确认配置包含必要的安全设置以及 Kafka-Client 和 Spring Boot 的兼容版本。
特定于 TLS 客户端身份验证的错误
引导代理断开连接
“引导代理 <broker-host>:9094 (id: -<broker-id> rack: null) 断开连接”
当您尝试连接到启用了 SSL/TLS 客户端身份验证的集群时,您可能会收到上述错误。
当生产者或使用者尝试通过 TLS 端口 9094 连接到使用 SSL/TLS 加密的集群,但未通过 SSL/TLS 配置时,您也可能会收到此错误。要解决此问题,请设置 SSL/TLS 配置。
在以下示例中,当生产者尝试连接到集群时发生错误:
./kafka-console-producer.sh --broker-list b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test[2020-04-10 18:57:58,019] WARN [Producer clientId=console-producer] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
输出示例:
[2020-04-10 18:57:58,342] WARN [Producer clientId=console-producer] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient) [2020-04-10 18:57:58,666] WARN [Producer clientId=console-producer] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
在以下示例中,当使用者尝试连接到集群时发生错误:
./kafka-console-consumer.sh --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test[2020-04-10 19:09:03,277] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
输出示例:
[2020-04-10 19:09:03,596] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient) [2020-04-10 19:09:03,918] WARN [Consumer clientId=consumer-console-consumer-79102-1, groupId=console-consumer-79102] Bootstrap broker b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 (id: -2 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
如果您的集群启用了客户端身份验证,则必须为 AWS Private Certificate Authority 添加其他参数。有关详细信息,请参阅 Amazon MSK 的双向 TLS 客户端身份验证。
密钥库访问错误
“错误:无法获取密钥库的修改时间: <configure-path-to-truststore>”
-或-
“无法加载密钥库”
当您错误地配置了信任库并为生产者和使用者加载信任库文件时,您可能会收到上述错误。要解决此问题,请在 SSL/TLS 配置中为信任库文件提供正确的路径。
错误的使用者代理字符串示例:
./kafka-console-consumer --bootstrap-server b-2.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094,b-1.encryption.3a3zuy.c7.kafka.us-east-1.amazonaws.com:9094 --topic test --consumer.config /home/ec2-user/ssl.config
输出示例:
[2020-04-11 10:39:12,194] ERROR Modification time of key store could not be obtained: /home/ec2-ser/certs/kafka.client.truststore.jks (org.apache.kafka.common.security.ssl.SslEngineBuilder) java.nio.file.NoSuchFileException: /home/ec2-ser/certs/kafka.client.truststore.jks [2020-04-11 10:39:12,253] ERROR Unknown error when running consumer: (kafka.tools.ConsoleConsumer$) Caused by: org.apache.kafka.common.KafkaException: org.apache.kafka.common.KafkaException: org.apache.kafka.common.KafkaException: Failed to load SSL keystore /home/ec2-ser/certs/kafka.client.truststore.jks of type JKS
当您的信任库或密钥库文件损坏或信任库文件密码不正确时,也可能会发生此错误。
SSL/TLS 握手失败
“向主题测试发送消息时出错,密钥:null,值: 0 字节,显示错误 (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.SslAuthenticationException: SSL 握手失败”
-或-
“与节点 -<broker-id> (<broker-hostname>/<broker-hostname>:9094) 的连接未通过身份验证,原因是: SSL 握手失败 (org.apache.kafka.clients.NetworkClient)”
当您错误地配置了生产者或使用者的密钥库,且出现身份验证失败时,您可能会收到上述错误之一。确保正确配置密钥库。
生产者密钥库的错误代理字符串示例:
./kafka-console-producer --broker-list b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-1.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094 --topic example --producer.config/home/ec2-user/ssl.config
输出示例:
[2020-04-11 11:13:19,286] ERROR [Producer clientId=console-producer] Connection to node -3 (b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com/172.31.6.195:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
使用者密钥库的错误代理字符串示例:
./kafka-console-consumer --bootstrap-server b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-1.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094,b-4.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com:9094 --topic example --consumer.config/home/ec2-user/ssl.config
输出示例:
[2020-04-11 11:14:46,958] ERROR [Consumer clientId=consumer-1, groupId=console-consumer-46876] Connection to node -1 (b-2.tlscluster.5818ll.c7.kafka.us-east-1.amazonaws.com/172.31.15.140:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient) [2020-04-11 11:14:46,961] ERROR Error processing message, terminating consumer process: (kafka.tools.ConsoleConsumer$) org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
密钥库密码不正确
“java.io.IOException:密钥库密码不正确”
当密钥库或信任库的密码不正确时,您可能会收到上述错误。
要对此问题进行故障排除,请运行以下命令来检查密钥库或信任库的密码是否正确:
keytool -list -keystore kafka.client.keystore.jksEnter keystore password: Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 1 entry schema-reg, Jan 15, 2020, PrivateKeyEntry, Certificate fingerprint (SHA1): 4A:F3:2C:6A:5D:50:87:3A:37:6C:94:5E:05:22:5A:1A:D5:8B:95:ED
如果密钥库或信任库的密码不正确,则您会收到以下错误:
“keytool 错误:java.io.IOException:密钥库密码不正确”
要查看前面命令的详细输出,请添加 -v 标志:
keytool -list -v -keystore kafka.client.keystore.jks
您也可以运行上述命令来检查密钥库是否损坏。
当您在生产者和使用者的 SSL/TLS 配置中错误地配置了与别名关联的密钥时,您也可能会收到此错误。要检查是否由于此问题,请运行以下命令:
keytool -keypasswd -alias schema-reg -keystore kafka.client.keystore.jks
如果别名密钥的密码正确,则系统会要求您输入密钥的新密码:
Enter keystore password: Enter key password for <schema-reg> New key password for <schema-reg>: Re-enter new key password for <schema-reg>:
否则,该命令会失败并显示以下消息:
“keytool 错误:java.security.UnrecoverableKeyException: 获取密钥失败: 指定的最后一个块未正确填充。如果在解密期间使用了错误的密钥,则可能会出现此类问题。”
要验证别名是否是密钥库的一部分,请运行以下命令:
keytool -list -keystore kafka.client.keystore.jks -alias schema-reg
输出示例:
Enter keystore password: schema-reg, Jan 15, 2020, PrivateKeyEntry, Certificate fingerprint (SHA1): 4A:F3:2C:6A:5D:50:87:3A:37:6C:94:5E:05:22:5A:1A:D5:8B:95:ED
特定于 IAM 客户端身份验证的错误
身份验证失败,拒绝访问
“与节点 1 (b-1.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9098) 的连接未通过身份验证,原因是: 拒绝访问”
-或-
“org.apache.kafka.common.errors.SaslAuthenticationException: 拒绝访问”
当访问策略、权限边界和 SCP 阻止未通过所需授权的用户时,您会收到上述错误之一。
要解决此问题,请使用 IAM 访问控制来确保 IAM 角色可以执行集群操作。
SaslAuthenticationException
“org.apache.kafka.common.errors.SaslAuthenticationException: 连接太多”
-或-
“org.apache.kafka.common.errors.SaslAuthenticationException: 内部错误”
当您在具有 IAM 访问控制的 kafka.t3.small 代理类型上运行集群且超出连接配额时,您会收到上述错误。kafka.t3.small 实例类型仅接受每个代理每秒进行一次 TCP 连接。当超过连接配额时,创建测试操作将失败。有关详细信息,请参阅 Amazon MSK 如何与 IAM 协同工作。
要解决这些错误,请执行以下操作:
- 在您的 Amazon MSK Connect Worker 配置中,将 reconnect.backoff.ms 和 reconnect.backoff.max.ms 的值更新为 1000 或更高。
- 升级到更大的代理实例类型,例如 kafka.m5.large。有关详细信息,请参阅适当调整集群的大小: 每个标准代理的分区数。
特定于 SASL/SCRAM 客户端身份验证的错误
客户端 SASL 机制已关闭
“与节点 1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9098) 的连接未通过身份验证,原因是: 服务器中未启用客户端 SASL 机制“SCRAM-SHA-512”,启用的机制是 [AWS_MSK_IAM]”
-或-
“与节点 1 (b-1-testcluster.abc123.c7.kafka.us-east-1.amazonaws.com/3.11.111.123:9096) 的连接未通过身份验证,原因是: 服务器中未启用客户端 SASL 机制“AWS_MSK_IAM”,启用的机制是 [SCRAM-SHA-512]”
当端口号与客户端属性文件中的 Simple Authentication and Security Layer (SASL) 机制不匹配时,您会收到上述错误。这是您在运行集群操作的命令中使用的属性文件。
要与使用 Simple Authentication 和 Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM) 的集群中的代理通信,请使用以下端口:
- 端口 9096,用于从 AWS 内部进行访问
- 端口 9196,用于公共访问
要与使用 IAM 访问控制的集群中的代理通信,请使用端口 9098 从 AWS 内部进行访问,使用端口 9198 进行公共访问。
SASL 凭证身份验证错误
“与节点 1 (b-3.testcluster.abc123.c2.kafka.us-east-1.amazonaws.com/10.11.111.123:9096) 的连接未通过身份验证,原因是: 由于使用 SASL 机制 SCRAM-SHA-512 的凭证无效,身份验证在身份验证期间失败”
确保将用户凭证存储在 AWS Secrets Manager 中,并将这些凭证与 Amazon MSK 集群相关联。
当您通过端口 9096 访问集群时,AWS Secrets Manager 中的用户和密码必须与客户端属性相同。
当您运行 get-secret-value 命令来检索密钥时,请确保 AWS Secrets Manager 中的密码不包含任何特殊字符。
ClusterAuthorizationException
“org.apache.kafka.common.errors.ClusterAuthorizationException: 请求 Request(processor=11, connectionId=INTERNAL_IP-INTERNAL_IP-0, session=Session(User:ANONYMOUS,/INTERNAL_IP), listenerName=ListenerName(REPLICATION_SECURE), securityProtocol=SSL, buffer=null) 未获授权”
当以下两个条件都成立时,您会收到上述错误:
- 您的 Amazon MSK 集群启用了 SASL/SCRAM 身份验证。
- 在集群的 ACL 中,resourceType 设置为 CLUSTER,operation 设置为 CLUSTER_ACTION。
Amazon MSK 集群不支持上述设置,因为这些设置会阻止 Apache Kafka 的内部复制。代理的身份在代理间通信中会显示为 ANONYMOUS。如果您的集群必须支持 ACL 并使用 SASL/SCRAM 身份验证,请允许 ANONYMOUS 用户使用 ALL 操作。
运行以下命令将 ALL 操作授予 ANONYMOUS 用户:
./kafka-acls.sh --authorizer-propertieszookeeper.connect=example-ZookeeperConnectString --add --allow-principal User:ANONYMOUS --operation ALL --cluster
相关信息

相关内容
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前