为什么我无法连接到 ElastiCache for Redis 集群?

上次更新日期:2022 年 6 月 24 日

我无法连接到 Amazon ElastiCache for Redis 集群。我应该如何排查此问题?

简短描述

连接问题可能有多个根本原因。最常见的问题是:

  • 集群尚未准备就绪。
  • 集群运行状况不佳。
  • 网络配置不正确。
  • 客户端配置不正确。

解决方法

验证集群是否已准备就绪

如果您最近创建了集群,请验证集群创建是否已完成,并且集群是否已准备好接受连接。

使用 ElastiCache 控制台、AWS 命令行界面(AWS CLI)或 ElastiCache API 检查集群的状态。查看 Status(状态)列,了解以下内容:

  • 如果 Status(状态)列显示 Available(可用),则表示集群已准备就绪。
  • 如果 Status(状态)列显示 Creating(正在创建),则表示集群创建仍在进行中。等待几分钟,直到它更新为 Available(可用)。
  • 如果 Status(状态)列显示 Modifying(正在修改),则表示集群的配置正在更新。等待几分钟,直到修改完成并且状态变为 Available(可用)。

验证集群是否运行正常

在正常运行的集群中,每个单独的节点都应处于 Available(可用)状态。要验证集群的运行状况,请执行以下操作:

验证集群和客户端资源之间的网络级连接

要最大限度地减少延迟,请从 Amazon Elastic Compute Cloud(Amazon EC2)实例访问 ElastiCache。从同一 Amazon Virtual Private Cloud(Amazon VPC)中的其他资源访问 Amazon ElastiCache 也有助于最大限度地减少延迟。但是,可以从 VPC 外部,甚至在 AWS 外部进行连接。

有关连接到 ElastiCache 的更多信息,请参阅以下内容:

要自动执行连接过程,请使用 VPC Network Access Analyzer 服务对 AWS 资源之间的连接问题进行问题排查。

验证安全组和网络 ACL 是否允许连接

在 ElastiCache 集群和正在启动连接的资源上执行此步骤。客户端资源的示例有:

  • Amazon EC2 实例。
  • AWS Lambda 函数。
  • Amazon Elastic Container Service(Amazon ECS)或 Amazon Elastic Kubernetes Service(Amazon EKS)容器等。

在 ElastiCache 中,请确保安全组配置正确。对于其他资源,请验证安全组和网络 ACL。

确认 ElastiCache 集群上的安全组

1.    从 Redis clusters(Redis 集群)菜单中选择集群名称,然后选择 Network and security(网络和安全)选项卡。

2.    确认至少有一个关联的安全组允许从客户端资源到集群端口上的集群的入站连接

3.    要确认端口号,请检查集群的任何端点。端点采用 domain_name:port 格式。

注意:默认情况下,集群的端口为 6379/TCP。您可以在集群创建期间覆盖端口号。

4.    在客户端资源上,验证安全组是否允许出站连接到集群的端口和集群子网的 CIDR 块。

5.    验证网络 ACL 是否允许客户端和集群之间的传出和传入连接。默认的网络 ACL 通常允许所有连接。

注意:您可以使用 VPC Network Access Analyzer 服务对安全组和网络 ACL 配置进行问题排查。

确定正确的连接端点

推荐的连接端点因集群配置而异。有关查找正确端点和可能配置的更多信息,请参阅查找连接端点

验证 DNS 解析在客户端是否有效

DNS 问题通常通过 Name or service not known(名称或服务未知)和 NXDOMAIN 错误消息来识别。

$ nslookup nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com
Server:         172.31.0.2
Address:        172.31.0.2#53

** server can't find nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com: NXDOMAIN
$ redis-cli -h nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com
Could not connect to Redis at nonexistent.1234id.clustercfg.euw1.cache.amazonaws.com:6379: Name or service not known

如果您看到上述错误,请检查 VPC 客户端资源的 DNS 属性。

如果可能,最好使用 Amazon DNS 服务器。有关更多信息,请参阅 Amazon DNS 服务器

验证客户端和 Redis 之间的 TCP 连接性

使用 curltelnet 命令建立 TCP 连接并验证连接性:

$ curl -v telnet://test.1234id.clustercfg.euw1.cache.amazonaws.com:6379
*  Trying 172.31.1.242:6379...
* Connected to test.1234id.clustercfg.euw1.cache.amazonaws.com (172.31.1.242) port 6379 (#0)

在前面的示例中,Connected(已连接)关键字显示 TCP 连接正常工作。

如果命令结果中未显示 Connected(已连接),请检查以下内容:

在 ElastiCache 集群上

  • 安全组必须允许在集群的端口上进行连接。验证集群配置页面上的端口值(默认为 TCP/6379)。有关更多信息,请参阅修改 ElastiCache 集群
  • 集群及其所有分片和节点必须处于 available(可用)状态。有关更多信息,请参阅查看集群的详细信息

在客户端资源上

  • 安全组必须允许到集群的 IP 和端口的传出连接。
  • 路由表必须具有相应的路由,这样集群才能到达。
  • 资源可以位于同一 VPC 中。或者,如果资源位于其他 VPC 中或 AWS 之外,请确保它配置了适当的连接。可能是 VPN 或 VPC 对等连接、DirectLink 等。有关更多信息,请参阅访问您的集群或复制组
    注意:Amazon ElastiCache 旨在从同一 VPC 进行访问,以确保低延迟。VPC 外部的连接会带来额外的延迟。这种额外的延迟对于直接或通过隧道使用公共互联网的连接尤其常见。由于 Redis 对延迟非常敏感,因此额外的延迟可能会导致连接和超时问题。

VPC Reachability Analyzer 是一种工具,可帮助确定阻止访问的内容。

对与集群(使用传输中加密)的连接进行问题排查

传输中加密的工作原理是通过 TLS 发送 Redis 流量。客户端必须具有 TLS 支持才能使连接正常工作。

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com

如果您安装了 redis-cli 并且它支持 TLS,则在命令中添加 --tls 参数:

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com --tls
encrypted.1234id.clustercfg.euw1.cache.amazonaws.com:6379>

如果 redis-cli 是在没有 TLS 支持的情况下编译的,则会显示以下错误:

$ redis-cli -h encrypted.1234id.clustercfg.euw1.cache.amazonaws.com --tls
Unrecognized option or bad number of args for: '--tls'

要排查上述错误,请执行以下其中一项操作:

如果您稍后要使用 redis-cli,最好在支持 TLS 的情况下编译 redis-cli。有关适用于 Amazon Linux 2 和 Amazon Linux 的步骤,请参阅步骤 4:连接到集群节点中的下载并安装 redis-cli

–或者–

使用备用命令,例如 opensslopenssl 命令在大多数系统上都可用,如果支持 TLS 的 redis-cli 不可用,则该命令非常有用。以下是 openssl 命令的示例:

$ openssl s_client -connect encrypted.1234id.clustercfg.euw1.cache.amazonaws.com:6379
CONNECTED(00000003)
----- omitted --------
INFO
# Server
redis_version:6.2.6
----- omitted -----

有关更多信息,请参阅步骤 4:连接到集群节点中的连接到已启用加密/身份验证的集群部分。

对与集群(使用身份验证)的连接进行问题排查

redis-cli

所有使用身份验证的集群都需要 TLS。redis-cli 命令同时需要 --tls--askpass(或 -a)参数。

如果未提供 --askpass 参数,则会收到以下输出:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls
auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com:6379> INFO # or any other Redis command
NOAUTH Authentication required.

如果命令包含不正确的密码,则会收到以下输出:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls --askpass
Please input password: *************
Warning: AUTH failed

以下是具有正确密码的 Redis 命令的示例,该命令按预期工作:

$ redis-cli -h auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com --tls --askpass
Please input password: ******************
auth-cluster.1234id.clustercfg.euw1.cache.amazonaws.com:6379> INFO
# Server
redis_version:6.2.6
----- omitted -----

openssl

您可以使用 openssl 命令测试连接性。此命令仅用于调试目的:

$ openssl s_client -connect master.auth-cluster.3i1yig.euw1.cache.amazonaws.com:6379
CONNECTED(00000003)
----- omitted -----
---
AUTH topsecretpassword
+OK
INFO
# Server
redis_version:6.2.6
----- omitted -----

有关更多信息,请参阅步骤 4:连接到集群节点中的连接到已启用加密/身份验证的集群部分。

有关对 ElastiCache 连接进行问题排查的其他详细信息,请参阅问题排查


这篇文章对您有帮助吗?


您是否需要账单或技术支持?