ElastiCache 的常见故障排除步骤和最佳实践
以下主题为您在使用 ElastiCache 时可能遇到的错误和问题提供了故障排除建议。如果您发现某个问题未在此处列出,可以使用此页上的反馈按钮来报告。
有关更多故障排除建议和常见支持问题的答案,请访问 Amazon 知识中心
连接问题
如果您无法连接到 ElastiCache 缓存,请考虑以下事项:
使用 TLS:如果您在尝试连接 ElastiCache 端点时遇到连接挂起的情况,可能是没有在客户端中使用 TLS。如果您使用的是 ElastiCache 无服务器,则传输中加密会始终处于启用状态。请确保您的客户端使用 TLS 连接到缓存。了解有关连接到启用了 TLS 的缓存的更多信息。
VPC:ElastiCache 缓存只能在 VPC 中访问。确保您访问缓存的 EC2 实例和 ElastiCache 缓存是在同一 VPC 中创建的。或者,您必须在 EC2 实例所在的 VPC 与创建缓存的 VPC 之间启用 VPC 对等连接。
安全组:ElastiCache 使用安全组来控制对缓存的访问。请考虑以下事项:
如果连接仍然有问题,请参阅持续连接问题了解其他步骤。
Valkey 或 Redis OSS 客户端错误
ElastiCache 无服务器只能使用支持 Valkey 或 Redis OSS 集群模式协议的客户端进行访问。基于节点的集群可通过客户端以任一模式访问,具体取决于集群配置。
如果您在客户端中遇到错误,请考虑以下事项:
集群模式:如果您遇到 CROSSLOT 错误或 SELECT
命令错误,可能是尝试使用不支持集群协议的 Valkey 或 Redis OSS 客户端访问启用了集群模式的缓存。ElastiCache 无服务器只能使用支持 Valkey 或 Redis OSS 集群协议的客户端。如果您想使用“已禁用集群模式”(CMD)的 Valkey 或 Redis OSS,则必须创建基于节点的集群。 CROSSLOT 错误:如果遇到
ERR CROSSLOT Keys in request don't hash to the same slot错误,可能是因为您正在尝试访问不属于集群模式缓存中同一槽的键。提醒一下,ElastiCache 无服务器始终在集群模式下运行。仅当涉及的所有键都在同一个哈希槽中时,才允许使用涉及多个键的多键操作、事务或 Lua 脚本。
有关配置 Valkey 或 Redis OSS 客户端的其他最佳实践,请查看本博客文章
对 ElastiCache 无服务器中的高延迟进行故障排除
如果您的工作负载出现高延迟,您可以分析 SuccessfulReadRequestLatency 和 SuccessfulWriteRequestLatency 指标,以检查延迟是否与 ElastiCache 无服务器有关。这些指标衡量的是 ElastiCache 无服务器内部的延迟,不包括客户端延迟以及客户端与 ElastiCache 无服务器端点之间的网络往返时间。
对客户端延迟进行故障排除
如果您发现客户端延迟增加,但 CloudWatch SuccessfulReadRequestLatency 和 SuccessfulWriteRequestLatency 指标(用于衡量服务器端延迟)没有相应增加,请考虑以下情况:
确保安全组允许访问端口 6379 和 6380:ElastiCache 无服务器使用 6379 端口作为主端点,使用 6380 端口作为读取器端点。某些客户端会为每个新连接建立与这两个端口的连接,即使您的应用程序没有使用“从副本读取”功能也是如此。如果您的安全组不允许对这两个端口进行入站访问,那么建立连接可能需要更长的时间。点击此处详细了解如何设置端口访问权限。
对服务器端延迟进行故障排除
一些变化和偶尔的峰值不用担心 但是,如果 Average 统计数据显示急剧增加并且持续存在,则应查看 Amazon Health Dashboard和您的 Personal Health Dashboard 来了解更多信息。如有必要,可以考虑向 Amazon Web Services 支持提交支持工单。
考虑采用以下最佳实践和策略来减少延迟:
启用从副本读取:如果您的应用程序允许,我们建议您在 Valkey 或 Redis OSS 客户端中启用“从副本读取”功能,以扩展读取并降低延迟。启用该功能后,ElastiCache 无服务器会尝试将您的读取请求路由到与客户端位于同一可用区(AZ)的副本缓存节点,从而避免跨可用区网络延迟。请注意,在客户端启用“从副本读取”功能意味着您的应用程序接受数据的最终一致性。如果在写入键后尝试读取,您的应用程序可能会在一段时间内收到较旧的数据。
确保您的应用程序部署在与缓存相同的可用区中:如果您的应用程序没有部署在与缓存相同的可用区中,则可能会出现较高的客户端延迟。创建无服务器缓存时,您可以提供您的应用程序将从中访问缓存的子网,ElastiCache 无服务器会在这些子网中创建 VPC 端点。确保您的应用程序部署在相同的可用区中。否则,您的应用程序在访问缓存时可能会产生跨可用区跳转,导致客户端延迟增加。
重复使用连接:ElastiCache 无服务器请求是通过使用 RESP 协议的 TLS TCP 连接发出的。启动连接(包括验证连接,如果已配置)需要时间,因此第一个请求的延迟会高于一般延迟。通过已经初始化的连接发出的请求可提供 ElastiCache 的一致低延迟。因此,您应该考虑使用连接池或重复使用现有的 Valkey 或 Redis OSS 连接。
扩展速度:ElastiCache 无服务器会随着请求速率的增长而自动扩展。如果请求率突然大幅增加,速度快于 ElastiCache 无服务器的扩展速度,可能会在一段时间内导致延迟增加。ElastiCache 无服务器通常可以快速提高其支持的请求速率,最多需要 10-12 分钟即可将请求速率提高一倍。
检查长时间运行的命令:某些 Valkey 或 Redis OSS 命令(包括 Lua 脚本或大型数据结构上的命令)可能会运行很长时间。为了识别这些命令,ElastiCache 会发布命令级别的指标。借助 ElastiCache 无服务器,您可以使用
BasedECPUs指标。节流的请求:当请求在 ElastiCache 无服务器中被节流时,您的应用程序客户端延迟可能会增加。当请求在 ElastiCache 无服务器中被节流时,您应该会看到
ThrottledRequestsElastiCache 无服务器 指标有所增加。请查看以下部分,了解如何对节流的请求进行故障排除。密钥和请求的均匀分布:在 ElastiCache for Valkey 和 ElastiCache for Redis OSS 中,每个槽的键或请求分布不均会导致热槽,从而导致延迟增加。在执行简单的 SET/GET 命令的工作负载中,ElastiCache 无服务器在单个槽上支持高达 30000 ECPU/秒(使用“从副本读取”时为 90000 ECPU/秒)的速度。建议您评估键和请求在槽中的分布情况,并确保在您的请求速率超过此限制时实现均匀分配。
对 ElastiCache 中的节流问题进行故障排除
在服务导向型架构和分布式系统中,限制各种服务组件处理 API 调用的速率称为“限制”。这有助于让峰值变得平滑,控制组件吞吐量不匹配情况,并在出现意外操作事件时进行可预测性更高的恢复。ElastiCache 无服务器专为这类架构而设计,而且大多数 Valkey 或 Redis OSS 客户端都内置了针对节流请求的重试功能。一定程度上的限制对应用程序而言不一定是问题,但是持续限制数据工作流中对延迟敏感的部分可能会对用户体验产生负面影响,并会降低系统的整体效率。
当请求在 ElastiCache 无服务器中被节流时,您应该会看到 ThrottledRequests ElastiCache 无服务器 指标有所增加。如果您发现被节流的请求数量较多,请考虑以下事项:
扩展速度:ElastiCache 无服务器会在您获取更多数据或请求率增长时自动扩展。如果您的应用程序扩展速度超过了 ElastiCache 无服务器 的扩展速度,则您的请求可能会被节流,而 ElastiCache 无服务器 会扩展以适应您的工作负载。ElastiCache 无服务器通常可以快速增加存储容量,最多需要 10-12 分钟即可将缓存中的存储容量增加一倍。
密钥和请求的均匀分布:在 ElastiCache for Valkey 和 ElastiCache for Redis OSS 中,每个槽的键或请求分布不均会导致热槽。在执行简单的 SET/GET 命令的工作负载中,如果单个槽的请求速率超过 30000 ECPU/秒,则热槽可能会导致请求被节流。同样,在 ElastiCache for Memcached 中,如果请求速率超过 30000 ECPU/秒,则热键可能会导致请求被节流。
从副本读取:如果您的应用程序允许,可以考虑“从副本读取”功能。大多数 Valkey 或 Redis OSS 客户端都可以配置为“扩展读取”,将读取定向到副本节点。通过该功能,您可以扩展读取流量。此外,ElastiCache 无服务器还会自动将从副本读取的请求路由到与应用程序位于同一可用区的节点,从而降低延迟。启用“从副本读取”功能后,对于使用简单的 SET/GET 命令的工作负载,您可以在单个槽上实现高达 90000 ECPU/秒的速度。