如何解决连接到我的 Amazon MSK 集群时出现的问题?

6 分钟阅读
0

我在尝试连接到 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 集群时遇到了问题。

解决方法

当您尝试连接到 Amazon MSK 集群时,可能会遇到以下类型的错误:

  • 并非特定于集群身份验证类型的错误
  • 特定于 TLS 客户端身份验证的错误
  • 特定于 AWS Identity and Access Management (IAM) 客户端身份验证的错误
  • 特定于 Simple Authentication and Security Layer/Salted Challenge Response Mechanism (SASL/SCARM) 客户端身份验证的错误

与特定身份验证类型无关的错误

当您尝试连接到 Amazon MSK 集群时,无论为集群启用了哪种身份验证类型,都可能会出现以下错误之一。

java.lang.OutOfMemoryError: Java 堆空间

如果在使用任何类型的身份验证运行集群操作命令时不提及客户端属性文件,就会出现此错误:

例如,当您使用 IAM 身份验证端口运行以下命令时,会出现 OutOfMemoryError:

./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

要解决此错误,请务必在 client.properties 文件中基于身份验证类型包含相应属性。

org.apache.kafka.common.errors.TimeoutException: 等待节点分配时超时。调用:createTopics

当客户端应用程序与 Amazon MSK 集群之间存在网络配置错误时,通常会出现此错误。

要解决此问题,请通过执行以下连接测试来检查网络连接。

从客户端计算机运行命令。

telnet bootstrap-broker port-number

请务必执行以下操作:

  • bootstrap-broker 替换为 Amazon MSK 集群中的一个代理地址。
  • 根据为集群启用的身份验证,请将 port-number 替换为相应的端口值。

如果客户端计算机能够访问代理,则不存在连接问题。如果不能,请查看网络连接,尤其是安全组的入站和出站规则。

org.apache.kafka.common.errors.TopicAuthorizationException: 未获授权,无法访问主题:[test_topic]

当您使用 IAM 身份验证且您的访问策略阻止主题操作(例如 WriteData 和 ReadData)时,就会出现此错误。

请注意,权限边界和服务控制策略还会阻止用户在未经必要授权的情况下尝试连接到集群。

如果使用的是非 IAM 身份验证,请检查您是否添加了阻止操作的主题级访问控制列表 (ACL)。

运行以下命令列出应用于某个主题的 ACL:

bin/kafka-acls.sh --bootstrap-server $BOOTSTRAP:PORT --command-config adminclient-configs.conf –-list –-topic testtopic

与节点 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]

当您使用的端口号与客户端属性文件中的 SASL 机制或协议不匹配时,就会出现此类错误。这是您在运行集群操作的命令中使用的属性文件。

  • 要与设置为使用 SASL/SCRAM 的集群中的代理通信,请使用以下端口: 9096 用于从 AWS 内部访问,9196 用于公共访问
  • 要与设置为使用 IAM 访问控制的集群中的代理通信,请使用以下端口: 9098 用于从 AWS 内部访问,9198 用于公共访问

处于以下状态时等待连接超时: 正在连接

当客户端尝试通过 Apache ZooKeeper 字符串连接到集群并且无法建立连接时,可能会出现此错误。当 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.

当您尝试使用代理字符串从 VPC 外部访问集群来消费数据时,会出现以下错误:

./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 指标,并检查代理的存储空间是否用完。有关 Amazon MSK 指标和预期值的详细信息,请参阅使用 CloudWatch 进行监控的 Amazon MSK 指标
  • 确保错误不是由网络配置引起的。Amazon MSK 资源在 VPC 内预调配。因此,默认情况下,客户端应连接到 Amazon MSK 集群或通过同一 VPC 中的私有网络从集群生产和使用。如果您从 VPC 外部访问集群,则可能会出现此类错误。有关排除客户端与集群位于同一 VPC 中的错误的信息,请参阅无法从 AWS 中访问集群:网络问题。有关从 VPC 外部访问集群的信息,请参阅如何连接到 VPC 之外的 Amazon MSK 集群?

特定于 TLS 客户端身份验证的错误

当您尝试连接到启用了 TLS 客户端身份验证的集群时,可能会出现以下错误。此类错误可能是由于 SSL 相关配置问题引起的。

引导代理 <broker-host>:9094 (id: -<broker-id> rack: null) 断开连接

当生产者或使用者在不通过 SSL 配置的情况下尝试通过 TLS 端口 9094 连接到 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)

要解决此错误,请设置 SSL 配置。有关详细信息,请参阅如何开始加密?

如果您的集群启用了客户端身份验证,则必须添加与 ACM Private CA 证书相关的其他参数。有关详细信息,请参阅双向 TLS 身份验证

错误 无法获得密钥库的修改时间: <configure-path-to-truststore>

-或者-

无法加载密钥库

如果信任库配置存在问题,则在为生产者和使用者加载信任库文件时,可能会发生此错误。您可能会在日志中查看与以下内容类似的信息:

./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 配置中错误地配置了信任库文件的路径。您可以通过在 SSL 配置中提供信任库文件的正确路径来解决此错误。

此错误还可能在以下情况下发生:

  • 您的信任库或密钥库文件已损坏。
  • 信任库文件的密码不正确。

向主题测试发送消息时出错,密钥: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.jks
Enter 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 -list -keystore kafka.client.keystore.jks
Enter keystore password:
keytool error: java.io.IOException: keystore password was incorrect

您可以通过添加 -v 标志来查看上述命令的详细输出:

keytool -list -v -keystore kafka.client.keystore.jks

您还可以使用这些命令来检查密钥库是否损坏。

当生产者和使用者的 SSL 配置中与别名关联的密钥配置不正确时,可能还会出现此错误。要验证此根本原因,请运行以下命令:

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>:

如果您的别名密钥(例如:schema-reg)的密码是正确的,则该命令会要求您输入另一个密钥的新密码。否则,该命令会失败并显示以下消息:

keytool -keypasswd -alias schema-reg -keystore kafka.client.keystore.jks
Enter keystore password:
Enter key password for <schema-reg>
keytool error: java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

您还可以通过运行以下命令来验证某个别名是否在密钥库中:

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: 访问被拒绝

确保访问 Amazon MSK 集群的 IAM 角色允许 IAM 访问控制中提到的集群操作。

除访问策略外,权限边界和服务控制策略还会阻止尝试连接到集群但未能传递所需授权的用户。

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.msreconnect.backoff.max.ms 的值更新为 1000 或更高。
  • 升级到更大的代理实例类型(例如 kafka.m5.large 或更高版本)。有关详细信息,请参阅代理类型调整集群规模: 每个代理的分区数

特定于 SASL/SCRAM 客户端身份验证的错误

与节点 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 API 检索密钥时,请确保 AWS Secrets Manager 中使用的密码不包含任何特殊字符,例如 (/])。

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。如果您在使用 SASL/SCRAM 身份验证时需要集群支持这些 ACL,则必须向该 ANONYMOUS 用户授予针对所有操作的权限。这样可以防止限制代理之间的复制。

运行以下命令将此权限授予 ANONYMOUS 用户:

./kafka-acls.sh --authorizer-properties
zookeeper.connect=example-ZookeeperConnectString --add --allow-principal
User:ANONYMOUS --operation ALL --cluster

相关信息

连接到 Amazon MSK 集群

如何解决使用已启用 SASL/SCRAM 身份验证的 Amazon MSK 集群时出现的常见问题?

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