高可用性和副本

本页面介绍了 Memorystore for Valkey 的架构如何提供和支持高可用性 (HA)。本页面还介绍了如何通过我们推荐的高可用性配置来提高实例性能和稳定性。

高可用性

Memorystore for Valkey 基于高可用性架构构建,您的客户端可直接访问托管式 Memorystore for Valkey 节点。您的客户端通过连接到各个端点来执行此操作,如连接到 Memorystore for Valkey 实例中所述。

直接连接到分片具有以下优势:

  • 直接连接可避免中间跃点,从而最大限度地缩短客户端与 Memorystore for Valkey 节点之间的往返时间(客户端延迟时间)。

  • 在“已启用集群模式”下,直接连接可避免任何单点故障,因为每个分片都设计为独立故障。例如,如果来自多个客户端的流量使槽(键空间块)过载,则分片故障会将影响限制在负责为槽提供服务的分片。

我们建议您创建高可用性的多可用区实例,而不是单可用区实例,因为多可用区实例可提供更高的可靠性。不过,如果您选择预配不带副本的实例,我们建议您选择单可用区实例。如需了解详情,请参阅何时使用单可用区实例。

如需为实例启用高可用性,您必须为每个分片预配至少 1 个副本。您可以在创建实例时执行此操作,也可以扩缩副本数量,使每个分片至少有 1 个副本。副本在计划内维护和意外分片故障期间提供自动故障切换。

我们建议您按照客户端最佳实践中的指南配置客户端。使用推荐的最佳实践可让您的客户端自动处理实例的以下各项,而无需任何停机时间:

  • 角色(自动故障切换)
  • 端点(节点替换)
  • 与“已启用集群模式”相关的槽分配更改(使用方横向扩容和缩容)

副本

高可用性 Memorystore for Valkey 实例是区域级资源。 Memorystore for Valkey 将分片的主虚拟机和副本虚拟机分布在多个可用区中,以防范可用区级服务中断。Memorystore for Valkey 支持每个分片具有 0-5 个副本的实例。

您可以使用副本来提高读取吞吐量,但代价是数据可能会过时。

  • 已启用集群模式:使用 READONLY 命令建立连接,以便客户端从副本中读取数据。
  • 已停用集群模式:连接到读取器端点,以连接到任何可用副本。

已启用集群模式的实例示例

下图展示了已启用集群模式的实例的示例:

包含三个分片且每个分片有零个副本的实例示例

一个 Memorystore for Valkey 已启用集群模式的实例,每个分片没有副本,节点均匀分布在三个可用区中。

包含三个分片且每个分片有一个副本的实例示例

一个 Memorystore for Valkey 已启用集群模式的实例,每个分片有一个副本,节点均匀分布在三个可用区中。

包含三个分片且每个分片有多个副本的实例示例

一个 Memorystore for Valkey 实例,已启用集群模式,每个分片有多个副本,节点均匀分布在三个可用区中。

已停用集群模式的实例示例

下图展示了停用集群模式的实例的示例:

具有多个副本的实例示例

一个 Memorystore for Valkey 已停用集群模式的实例,具有多个副本和节点,均匀分布在三个可用区中。

故障切换对应用有何影响

当 Memorystore for Valkey 将副本提升为主实例时,它会断开与实例主端点的现有连接。在自动修复和维护事件期间,实例平均有 30 秒不可用。

实例可用后,Memorystore for Valkey 会使用相同的连接字符串或 IP 地址,自动将您的应用重定向到新的主实例。您无需更新应用。

在故障切换期间,如果存在与读取端点的连接,Memorystore for Valkey 会断开与它提升为主实例的副本的连接。不过,Memorystore for Valkey 不会断开与其他副本的连接。故障切换完成且新副本可用后,Memorystore for Valkey 会将连接重定向到新副本。

自动故障切换

分片内的自动故障切换可能会因维护或主节点发生意外故障而发生。在故障切换期间,副本会被提升为主实例。您可以明确配置副本。该服务还可以在内部维护期间临时预配额外的副本,以避免任何停机时间。

自动故障切换可防止在维护更新期间丢失数据。如需详细了解维护期间的自动故障切换行为,请参阅维护期间的自动故障切换行为。

故障切换和节点修复时长

对于主节点进程崩溃或硬件故障等非计划内事件,自动故障切换可能需要数十秒的时间。在此期间,系统会检测到故障,并选择一个副本作为新的主实例。

节点修复可能需要几分钟时间,服务才能替换故障节点。所有主节点和副本节点都是如此。对于非高可用性实例(未预配副本),修复故障主节点也需要几分钟的时间。

计划外故障切换期间的客户端行为

客户端连接可能会重置,具体取决于故障的性质。自动恢复后,您可以使用指数退避算法重试连接,以避免主节点和副本节点过载。

使用副本提高读取吞吐量的客户端可能会遇到容量暂时下降的情况,直到故障节点被自动替换。

写入丢失

在因意外故障而导致的故障切换期间,由于 Valkey 复制协议的异步特性,已确认的写入可能会丢失。

客户端应用可以利用 Valkey WAIT 命令来提高实际数据安全性。

单个可用区服务中断对键空间的影响

本部分介绍了单个可用区服务中断对 Memorystore for Valkey 实例的影响。

多可用区实例

  • 高可用性实例:如果某个可用区发生服务中断,整个键空间仍可用于读取和写入,但由于某些读取副本不可用,读取容量会减少。我们强烈建议您超额预配集群容量,以便在极少数情况下发生单可用区服务中断时,实例仍有足够的读取容量。服务中断结束后,受影响可用区中的副本会恢复,集群的读取容量也会恢复到其配置的值。如需了解详情,请参阅构建可伸缩且可靠的应用时应遵循的模式。

  • 非高可用性实例(无副本):如果某个可用区发生服务中断,则在受影响的可用区中预配的键空间部分会进行数据刷新,并且在服务中断期间无法进行写入或读取。服务中断结束后,受影响可用区中的主实例会恢复,集群的容量也会恢复到其配置的值。

单可用区实例

  • HA 和非 HA 实例:如果预配实例的可用区发生服务中断,则集群不可用,并且数据会被清空。如果其他可用区发生服务中断,集群会继续处理读取和写入请求。

最佳做法

本部分介绍了高可用性和副本的最佳实践。

添加副本

添加副本需要 RDB 快照。RDB 快照使用进程分叉和“写时复制”机制来创建节点数据的快照。根据对节点的写入模式,节点的已用内存会随着写入操作所涉及的页面被复制而增加。内存占用量最多可达到节点中数据大小的两倍。

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