Memorystore for Valkey 最佳实践

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

内存管理最佳实践

本部分介绍了管理实例内存的策略,以便 Memorystore for Valkey 可以高效地为您的应用提供服务。

内存管理概念

  • 内存用量:实例使用的内存量。您拥有固定的内存容量。您可以使用指标来监控内存用量。

  • 驱逐政策:Memorystore for Valkey 使用 volatile-lru 驱逐 政策。您可以使用 Valkey 命令(例如 EXPIRE 命令)为键设置驱逐。

监控实例的内存用量

如需监控 Memorystore for Valkey 实例的内存用量,我们建议 您查看 /instance/memory/maximum_utilization 指标。如果实例的内存 用量接近 80%,并且您预计数据用量会增加,请 纵向扩容实例,以便为新数据腾出空间。

如果实例的内存用量较高,请执行以下操作来提高性能:

如果您遇到问题,请与Google Cloud 客户服务团队联系。

在已启用集群模式下扩缩分片

扩缩实例中的分片数量时,我们建议您在写入量较低的时段进行扩缩。在高用量时段进行扩缩可能会因复制或槽迁移造成的内存开销而导致实例的内存不足。

如果您的 Valkey 用例使用键驱逐,则伸缩到较小的实例大小可能会降低缓存命中率。不过,在这种情况下,您无需担心数据丢失,因为键驱逐是预期行为。

对于您不希望丢失键的 Valkey 用例,您应仅缩容到仍有足够空间存储数据的较小实例。新的目标分片数应至少是数据所用内存的 1.5 倍。 换句话说,您应预配足够的分片,以存储实例中 1.5 倍的数据量。您可以使用 /instance/memory/total_used_memory 指标 来查看实例中存储的数据量。

CPU 用量最佳实践

如果发生意外的可用区服务中断,则由于不可用可用区中的节点容量丢失,实例的 CPU 资源会减少。我们 建议您使用高可用性 实例。每个分片使用多个副本(而不是每个分片使用一个副本)可在服务中断期间提供额外的 CPU 资源。每个分片最多可以有五个副本。

此外,我们建议您管理节点 CPU 用量,以便节点有足够的 CPU 开销来处理因意外可用区服务中断而丢失的容量所产生的额外流量。您应使用 主线程 CPU 秒数/instance/cpu/maximum_utilization指标监控主实例和副本的 CPU 用量。

根据您为每个节点预配的副本数量,我们建议以下 /instance/cpu/maximum_utilization CPU 用量目标:

  • 对于每个节点有一个副本的实例,主实例的目标 /instance/cpu/maximum_utilization 值为 0.5 秒,副本的目标值为 0.5 秒。
  • 对于每个节点有两个或更多副本的实例,主实例的目标 /instance/cpu/maximum_utilization 值为 0.9 秒,每个副本的目标值为 0.5 秒。

如果该指标的值超过这些建议值,我们建议您纵向扩容实例中的分片数量。如果实例的副本数少于五个,您还可以纵向扩容副本数量,最多扩容到五个副本。

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

资源密集型 Valkey 命令

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

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

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

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

Valkey 客户端最佳实践

避免 Valkey 连接过载

为了缓解因连接突然涌入而造成的影响,我们建议您执行以下操作:

  • 确定最适合您的客户端连接池大小。每个客户端的良好起始大小是每个 Valkey 节点一个连接。然后,您可以进行基准评测,看看增加连接数是否有助于提高性能,而不会使允许的最大连接数饱和。

  • 当客户端因服务器超时而与服务器断开连接时,请使用带抖动的指数退避算法进行重试。这有助于避免多个客户端同时使服务器过载。

对于已启用集群模式的实例

您的应用在连接到 Memorystore for Valkey 已启用集群模式的实例时,必须使用集群感知型 Valkey 客户端。如需查看 集群感知型客户端的示例和示例配置,请参阅客户端库代码示例。您的客户端必须维护从哈希槽到实例中相应节点的映射,以便将请求发送到正确的节点。 这样可以防止因重定向而导致的性能开销。

客户端映射

在以下情况下,客户端必须获取槽的完整列表和映射的节点:

  • 客户端初始化时,必须填充初始槽到节点映射。

  • 当从服务器收到 MOVED 重定向时,例如在故障切换情况下,当先前主节点服务的所有槽都被副本接管时,或者在重新分片时,当槽从源主节点移动到目标主节点时。

  • 当从服务器收到 CLUSTERDOWN 错误或与特定服务器的连接持续超时时。

  • 当从服务器收到 READONLY 错误时。当主实例降级为副本时,可能会发生这种情况。

  • 此外,客户端应定期刷新拓扑,以便客户端为任何更改做好准备,并了解可能不会导致服务器重定向或错误的更改,例如添加新副本节点时。请注意,作为拓扑刷新的一部分,还应关闭任何过时的连接,以减少在命令运行时处理失败连接的需求。

客户端发现

客户端发现通常通过向 Valkey 服务器发出 SLOTSNODESCLUSTER SHARDS 命令来完成。我们建议您使用 CLUSTER SHARDS 命令。CLUSTER SHARDS 通过提供更高效且可扩展的实例表示形式,取代了 SLOTS 命令(已废弃)。

客户端发现命令的响应大小可能会因实例大小和拓扑而异。具有更多节点的较大实例会产生更大的响应。因此,务必确保执行节点拓扑发现的客户端数量不会无限增长。

这些节点拓扑刷新在 Valkey 服务器上开销很大,但对于应用可用性也很重要。因此,务必确保每个客户端在任何给定时间发出单个发现请求(并将结果缓存在内存中),并限制发出请求的客户端数量,以避免服务器过载。

例如,当客户端应用启动或与服务器断开连接并且必须执行节点发现时,一个常见的错误是客户端应用发出多个重新连接和发现请求,而不会在重试时添加指数退避算法。这可能会导致 Valkey 服务器在很长一段时间内无响应,从而导致 CPU 利用率非常高。

使用发现端点进行节点发现

使用 Memorystore for Valkey 发现端点执行节点发现。发现端点具有高可用性,并且在实例中的所有节点之间进行负载平衡。此外,发现端点会尝试将节点发现请求路由到具有最新拓扑视图的节点。

对于已停用集群模式的实例

连接到已停用集群模式的实例时,您的应用必须连接到主端点才能写入实例并检索最新的写入。您的应用还可以连接到读取器端点,以便从副本读取数据并将流量与主节点隔离。

如果您在对实例执行维护时使用先创建后销毁策略,则可能会收到以下错误 消息:

READONLY You can't write against a read only replica.

如需解决此问题,请停止与实例的连接。然后,重新创建连接。

持久性最佳实践

本部分介绍了持久性的最佳实践。

RDB 持久性和添加副本

如需通过 RDB 快照备份实例或向实例添加副本以获得最佳结果,请使用以下最佳实践:

内存管理

RDB 快照使用进程 fork 和 “写入时复制”机制 来截取节点数据的快照。根据写入节点的模式,节点的已用内存会随着写入所触及的页面的复制而增长。 内存占用量可能高达节点中数据大小的两倍。

为了确保节点有足够的内存来完成快照,请将或 设置 maxmemory 为节点容量的 80% ,以便为开销预留 20%。除了监控快照之外,此内存开销还有助于您管理工作负载以成功截取快照。此外,在添加副本时,请尽可能降低写入流量。如需了解详情,请参阅监控实例的内存用量

过时的快照

从过时的快照恢复节点可能会导致应用出现性能问题,因为应用会尝试协调大量过时的键或对数据库的其他更改,例如架构更改。如果您担心从过时的快照恢复,可以停用 RDB 持久性功能。 重新启用持久性后,系统会在下一个计划的快照间隔截取快照。

RDB 快照的性能影响

根据您的工作负载模式,RDB 快照可能会影响实例的性能,并会增加应用的延迟时间。如果您可以接受不太频繁的快照,可以将 RDB 快照安排在低实例流量期间运行,以最大限度地降低 RDB 快照的性能影响。

例如,如果实例在凌晨 1 点到凌晨 4 点的流量较低,则可以将开始时间设置为凌晨 3 点,并将时间间隔设置为 24 小时。

如果您的系统具有恒定负载,并且需要频繁的快照,我们建议您仔细评估性能影响,并权衡将 RDB 快照用于工作负载的好处。

添加副本

添加副本需要 RDB 快照。如需详细了解 RDB 快照,请参阅内存管理

何时使用单可用区实例

如果您将实例配置为不使用副本,我们建议您使用 单可用区实例。 原因如下:

费用和性能

如果您主要考虑的是最大限度地降低费用,并为位于同一区域的客户端提供最佳性能,我们建议您选择单可用区实例。

最大限度地减少服务中断的影响

选择单可用区实例时,可用区服务中断不太可能影响您的实例。通过将所有节点放置在单个可用区内,可用区服务中断影响服务器的可能性从 100% 降至 33%。实例所在的可用区发生故障的可能性为 33%,而位于不可用可用区中的节点受到影响的可能性为 100%。

快速恢复

如果单可用区实例发生可用区服务中断,Memorystore for Valkey 会简化数据恢复过程。您可以快速在正常运行的可用区中预配新实例,并重定向应用以最大限度地减少操作中断。

启用传输层安全协议 (TLS)

本部分介绍了使用传输层安全协议 (TLS) 的安全优势和性能影响,以及有关启用 TLS 的建议。

安全优势

通过使用 TLS,您可以获得以下安全优势:

  • 身份和访问权限管理 (IAM) 身份验证: TLS 使用此类型的身份验证来防范服务器欺骗攻击, 例如中间人攻击。
  • 传输加密: Google CloudGoogle 的内置加密功能可在 基础架构级别保护 Google 网络中的流量。不过,这需要信任 Google 的主机和网络堆栈。虽然此加密是透明的并且默认处于启用状态,但它不是端到端的。另一方面,TLS 在应用层使用传输加密。这种端到端加密让您可以更好地控制加密密钥和流程。
  • 身份验证令牌保护: 如果您使用 IAM 身份验证,则启用 TLS 可以最大限度地降低公开和泄露身份验证令牌的风险。

性能影响

TLS 会通过以下方式影响性能:

  • 建立连接:已建立 TLS 会话的客户端和服务器可以恢复会话, 而无需重复执行在客户端和服务器之间建立连接的资源密集型过程。通过启用 TLS 恢复,您可以减少在客户端和服务器之间建立连接的开销。

    如果您不建立 TLS 恢复,则建立连接是资源密集型的。对于新连接和现有连接,客户端和服务器之间的许多连接都可能导致连接超时。这可能会导致滚雪球效应,因为 Memorystore for Valkey 会尝试重新建立超时的连接,从而增加其用于建立连接的资源。

  • 加密和解密数据: 数据加密和解密涉及 CPU 密集型操作,这些操作会影响 客户端和服务器。这可能会降低实例的容量并增加实例的延迟时间。

建议

在考虑是否启用 TLS 时,我们建议您在评估安全政策的同时考虑 TLS 的优缺点。如果您选择启用 TLS,请注意以下事项:

  • 启用 TLS 恢复可以减少建立连接的开销。客户端和服务器之间的连接仅在初始连接时需要。不过,客户端实例大小的突然扩大可能会导致短暂中断,这是由每个新客户端主机的初始完整握手造成的。
  • 虽然某些 客户端库 可能不 提供用于启用 TLS 的内置控件,但您可以使用自定义代码将 此功能集成到实例中。