Memorystore for Redis 最佳实践

本页面提供了如何以最优方式使用 Memorystore for Redis 的指导。本页面还指出了需要避免的潜在问题。

如需问题排查方案的列表,请参阅问题排查

RDB 导出

导出 RDB 备份时,请遵循以下指南:

资源密集型操作

对于标准层级 Redis 实例,以下操作会在操作期间使用额外的内存:

由于复制功能,版本升级、扩缩和手动故障切换会占用额外的内存(对于标准层级实例而言)。这些操作遵循标准层级实例升级行为中所述的复制过程。

导入和导出操作需要额外的内存,因为存在与这些操作相关的分支 Redis 进程和写入时复制数据管理。

为了减少资源密集型操作的缺点,您应该:

需要连接重试的操作和情景

以下操作和情景会中断您的网络与 Redis 实例之间的网络连接:

这些操作会修改您的实例,需要临时中断连接。您需要在运行这些操作前先设置具有指数退避算法的重试逻辑,以便您的应用能够自动重新连接并继续正常运行。

例行维护

Memorystore for Redis 实例会定期进行维护。如需了解详情,请参阅 Memorystore for Redis 维护政策

实施以下最佳做法,为日常维护做好准备:

内存管理

内存管理可能是一道难题,因为开源 Redis 会发生常见的 内存碎片 。我们建议您降低实例的 maxmemory 配置,以便在出现高内存压力时产生开销。

在 Memorystore 实例上监控内存压力的最佳方法是使用系统内存使用率指标。如需查看详细指南以了解如何管理 Memorystore for Redis 的内存, 请参阅 内存管理最佳实践

管理空闲连接

如果连接未正常终止,您可能会看到 Memorystore 实例的连接数量会随着时间的推移不断增加。此操作可能会对性能产生负面影响,尤其是在使用传输加密时,该功能会根据您的容量层级施加最大连接数限制。为了缓解此问题,我们建议使用 timeout Redis 配置参数 ,该参数可让您设置自动终止空闲客户端连接之前的秒数。

Access Transparency 资源名称

不应在 Memorystore for Redis 资源名称中存储敏感数据。资源名称是指 Memorystore for Redis 实例名称和实例元数据,例如标签。存储在资源名称中的数据无法保证受到 Google Cloud 保护,并且可能与您组织的Access Transparency合规性要求相冲突。

部分无服务器环境需要无服务器 VPC 访问通道连接器

某些无服务器环境需要无服务器 VPC 访问通道连接器才能连接到 Memorystore for Redis。如果要使用其中一种环境进行连接,请为项目设置无服务器 VPC 访问通道连接器。

网络

我们建议您使用专用服务访问通道连接模式。Memorystore for Redis 使用两种连接模式:专用服务访问通道和直接对等互连。专用服务访问通道连接模式使 IP 范围管理更加简单,并允许您使用共享 VPC。

创建实例后,连接模式便无法更改。

如需了解详情,请参阅网络

监控和提醒

建议使用监控提醒 ,因为它们提供了 Redis 实例内存用量的关键信号。此外,您还可以深入了解 Redis 实例响应传入缓存请求的效率。

您应该设置以下默认警报:

CPU 使用率最佳实践

不当使用开销大的 Redis 命令会导致延迟时间较长、无响应或连接问题。标准层级实例在灾难恢复期间提供高可用性,并依赖于主节点和副本节点之间的异步复制。如果其中一个节点具有阻止 Redis 主线程的开销大的命令处理,则复制可能会受到影响。如果问题仍然存在并且发生位置中断,则在中断位置写入的最新数据可能在其他位置不可用。

我们建议您使用 Cloud Monitoring主线程 CPU 秒数redis.googleapis.com/stats/cpu_utilization_main_thread)指标设置警报,以确保 当副本被指定为只读副本时,主节点的 CPU 利用率不超过 0.8 秒,每个副本节点的 CPU 利用率不超过 0.5 秒。

如果 Redis 实例超过建议的值,我们建议您将实例扩缩 到更高的容量层级 ,或按照问题排查说明 避免 CPU 密集型操作。

如果实例的 CPU 利用率过高,或者实例的资源耗尽(例如,连接过多),则实例可能会出现异常行为,并且外部指标可能会缺失。

资源密集型命令

我们强烈建议您避免使用资源密集型 Redis 命令。使用这些命令可能会导致以下性能问题:

  • 延迟时间较长和客户端超时
  • 由增加内存用量的命令导致的内存压力
  • 由于 Redis 主线程被阻止,导致节点复制和同步期间的数据丢失
  • 健康检查、可观测性和复制资源不足

下表列出了资源密集型 Redis 命令的示例,并为您提供了资源高效的替代方案。

类别 资源密集型命令 资源高效的替代方案
针对整个键空间运行 KEYS SCAN
针对可变长度的密钥集运行 LRANGE 限制用于查询的范围的大小。
ZRANGE 限制用于查询的范围的大小。
HGETALL HSCAN
SMEMBERS SSCAN
阻止脚本运行 EVAL 确保脚本不会无限期运行。
EVALSHA 确保脚本不会无限期运行。
移除文件和链接 DEL UNLINK
发布和订阅 PUBLISH SPUBLISH
SUBSCRIBE SSUBSCRIBE

Redis 客户端最佳实践

本部分提供了有关以最优方式使用 Redis 客户端的指导。

检测和处理无响应的连接

我们强烈建议您将客户端应用配置为检测与 Memorystore for Redis 的无响应连接。检测到无响应的连接后,客户端必须重置该连接。如需构建弹性应用,我们建议使用以下客户端配置:

  • 配置 TCP keep-alive 参数:设置 TCP keepalive timeTCP keepalive intervalTCP keepalive probes 参数,以便客户端 主动检测并断开无响应的连接,即使连接处于 空闲状态也是如此。例如,如果您将 TCP keepalive time 参数设置为 30 秒,将 TCP keepalive interval 设置为 10 秒,并将 TCP keepalive probes 设置为 3,则客户端会在一分钟内重置无响应的空闲连接。
  • 配置 TCP 用户超时:在客户端中设置此超时,以重置 有未完成请求且停止响应的连接。例如,如果您将超时设置为 15 秒,则客户端会在 15 秒后重置有未完成请求的无响应连接。