跳至内容

如何对 ElastiCache Redis 客户端中的错误消息进行故障排除?

3 分钟阅读
0

当使用 Redis 客户端连接我的 Amazon ElastiCache Redis 集群时,我收到错误消息。

解决方法

"Connection reset by peer" 错误

当 Redis 服务器终止连接时,您会收到以下错误消息:

"java.io.IOException: Connection reset by peer
io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer"

此错误可能源于服务器或客户端。

如果您收到来自服务器的错误,请执行以下操作来解决问题:

  • 检查底层硬件或网络问题。
  • 运行 CLIENT LIST 命令以检查客户端输出缓冲区配额。有关详细信息,请参阅 Redis 网站上的 CLIENT LIST集群参数组中的参数定义了 ElastiCache 中的客户端输出缓冲区配额。
  • 检查您的 ElastiCache 参数组中的超时值是否已达到其配额。

如果您收到来自客户端的错误,请执行以下操作来解决问题:

  • 检查应用程序中的超时设置是否过低。
  • 请查看 Redis 客户端库的官方文档或支持页面,了解与连接重置相关的已知错误。
  • 确认您拥有最新版本的 Redis 客户端。
  • 如果您为集群启用了 TLS,请确认您在客户端上配置了加密。

"Connection refused" 或 "Unable to connect to Redis" 错误

当服务器拒绝连接时,您会收到以下错误消息:

"JedisConnectionException: java.net.ConnectException: Connection refused
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException:
Connection refused
ECONNREFUSED
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis org.redisson.client.RedisConnectionException: Unable to connect to Redis server ###"

要解决此问题,请验证以下内容:

**注意:**您可以使用 tcpdump 等工具来分析连接尝试。

"Connection timed out" 错误

当连接超时时,您会收到以下错误消息:

"redis.exceptions.TimeoutError: Timeout connecting to server io.netty.channel.ConnectTimeoutException: connection timed out org.redisson.client.RedisTimeoutException: Unable to acquire connection!"

连接超时错误可能是持续性的,也可能是间歇性的。

如果超时错误仍然存在,请执行以下操作来解决问题:

  • 验证网络连接和配置,以确认与 ElastiCache Redis 集群的连接。
  • 确认您指定了正确的 Redis 端点

要解决持续超时错误,请参阅持续的连接问题

如果超时错误是间歇性的,请执行以下操作来解决问题:

"Read timed out" 错误

当命令未在您配置的超时值内完成时,您会收到以下错误消息:

"StackExchange.Redis.RedisTimeoutException: Timeout performing GET (5000ms) io.lettuce.core.RedisCommandTimeoutException: Command timed out org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketTimeoutException: Read timed out redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out"

当 Redis 线程处理复杂或长时间运行的命令时,将会发生此错误。

要解决此问题,请执行以下操作:

  • 检查内存、CPU、网络或连接资源限制
  • 确认客户端没有资源限制。
  • 检查问题发生时是否延迟过高
  • 检查是否存在阻塞 Redis 引擎的长时间运行命令,因为 Redis 是一个单线程引擎,一次只能处理一个查询。有关说明,请参阅 Redis 网站上的 SLOWLOG GET
  • 检查单位时间内是否有过多的命令。有关说明,请参阅 Redis 网站上的 INFO

"Operation timed out" 错误

当连接的空闲时间超过您配置的超时值时,您会收到以下错误消息:

"io.lettuce.core.RedisException: java.io.IOException: Operation timed out"

由于以下原因,您可能会收到操作超时错误:

  • ElastiCache 集群的负载很高,无法及时处理命令。
  • 网络流量超过集群或客户端的带宽配额。

要解决此问题,请执行以下操作:

"NOAUTH Authentication required" 错误

当连接到需要身份验证但不提供有效凭证的 Redis 服务器时,您会收到 NOAUTH Authentication required 错误消息。

要解决此问题,请执行以下操作:

  • 提供正确的用户名和密码以连接到集群。
  • 确认客户端库配置和连接字符串的语法正确。

"ERR max number of clients reached" 错误

当集群节点达到其最大连接配额时,您会收到 ERR max number of clients reached 错误消息。

要解决此问题,请执行以下操作:

  • 检查 CurrConnections 指标并确认其在 maxclients 配额范围内。有关详细信息,请参阅 Redis 网站上的最大并发连接客户端数
  • 使用连接池来重用连接。
  • 在客户端配置中设置适当的超时值。
  • 将客户端配置为直接连接到只读副本进行读取操作,从而在集群节点之间分配负载。

"LOADING Redis is loading the dataset in memory" 错误

当连接到在启动或副本同步期间将其数据集加载到内存中的节点时,您会收到以下错误消息:

"LOADING Redis is loading the dataset in memory (error) LOADING Redis is loading the dataset in memory"

最佳做法是实施回退。有关信息,请参阅 Redis 集群客户端发现和指数回退部分(最佳实践: Redis 客户端和 Amazon ElastiCache for Redis)。

"OOM command not allowed when used memory > 'maxmemory'" 错误

maxmemory 参数用于设置 Redis 节点可用于数据存储的最大内存量。

当内存使用量超过 maxmemory 配额时,Redis 会应用您在参数组中设置的 maxmemory-policy。根据 maxmemory-policy,Redis 会驱逐密钥或返回 OOM command not allowed 错误。

要解决此问题,请执行以下操作:

  • 配置 maxmemory-policy 以根据您的应用程序要求驱逐密钥。
  • 当内存使用量持续超过配额时,将集群升级到更大的节点类型。

"CROSSSLOT Keys in request don't hash to the same slot" 错误

当在已开启集群模式和具有不同哈希槽的集群上运行多密钥操作时,您会收到 CROSSSLOT 错误。

要解决此问题,请参阅如何解决在 ElastiCache (Redis OSS) 自行设计的集群上使用多密钥操作时收到的 CROSSSLOT 错误?

"CLUSTERDOWN The cluster is down" 错误

当节点停止响应时,集群将变得不可用,您会收到 The cluster is down 错误消息。

要解决此问题,请执行以下操作:

"READONLY You can't write against a read-only replica" 错误

以下是您在尝试写入已配置为只读副本的 Redis 节点时收到错误的原因:

  • 您的应用程序直接连接到只读副本。
  • 应用程序中的 DNS 缓存将流量路由到旧的主节点。

要解决此问题,请参阅如何排查在 ElastiCache for Redis 自设计集群中进行失效转移后收到的 READONLY 错误?

"MOVED [slot] [IP address] [port]" 错误

MOVED 重定向消息包含所请求密钥的哈希槽、IP 地址和节点端口:

"-MOVED 3999 127.0.0.1:6381"

以下是您可能会收到 MOVED 错误的原因:

  • 客户端尝试访问不在连接节点上的哈希槽中的密钥。
  • 您为集群开启了集群模式,但客户端不支持集群。
  • 您的只读副本没有 readonly 标志。
  • 您的客户端的集群信息已过期,例如分片或节点数量的变化。

要解决这些问题,请执行以下操作:

AWS 官方已更新 10 个月前