使用 Valke ElastiCache y 和 Redis 的多可用区,最大限度地减少停机时间 OSS - 亚马逊 ElastiCache

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Valke ElastiCache y 和 Redis 的多可用区,最大限度地减少停机时间 OSS

在许多情况下, ElastiCache 使用 Valkey 和 Redis OSS 可能需要更换主节点;其中包括某些类型的计划内维护以及不太可能发生的主节点故障或可用区故障。

在这些情形下进行替换时,会导致集群出现停机时间,但如果启用了多可用区,则会最大限度缩短停机时间。主节点的角色会自动将故障转移到其中一个只读副本。无需创建和配置新的主节点,因为 ElastiCache 这将以透明的方式处理这个问题。此故障转移和副本提升可确保您在提升完成后立即继续写入新的主节点。

ElastiCache 还会传播已升级副本的域名服务 (DNS) 名称。这样做的原因是,如果您的应用程序写入到主终端节点,则无需在应用程序中进行终端节点更改。如果您从单个终端节点进行读取,请确保将提升为主节点的副本的读取终端节点更改为新副本的终端节点。

如果由于维护更新或自助服务更新而启动了计划的节点替换,请注意以下事项:

  • 对于 ElastiCache Valkey 和 Redis OSS 集群,当集群处理传入的写入请求时,计划中的节点更换已完成。

  • 对于在 5.0.6 或更高版本的引擎上运行且启用了多可用区的已禁用 Valkey 和 Redis 集OSS群模式的集群,在集群处理传入的写入请求的同时,计划中的节点更换已完成。

  • 对于在 4.0.10 或更早版本的引擎上运行且启用了多可用区的禁用 Valkey 和 Redis 集OSS群模式的集群,您可能会注意到与更新相关的短暂写入中断。DNS此中断可能需要几秒钟。此过程比重新创建并预置新的主节点过程要快得多,后者是在您未启用多可用区的情况下使用的过程。

您可以使用 ElastiCache 管理控制台、或 AWS CLI,启用多可用区。 ElastiCache API

在 Valkey 或 Redis OSS 集群(在API和CLI的复制组中)上启用 ElastiCache 多可用区可以提高容错能力。在集群的读取/写入主集群出于任何原因变得无法连接或发生故障时,此情况尤其如此。只有每个分片中有多个节点的 Valkey 和 Redis OSS 集群才支持多可用区。

启用多可用区

在使用 ElastiCache 控制台CLI、或创建或修改集群(API或复制组)时 AWS CLI,您可以启用多可用区。 ElastiCache API

您只能在至少有一个可用只读副本的 Valkey 或 RedisOSS(已禁用集群模式)集群上启用多可用区。没有只读副本的集群不提供高可用性或容错能力。有关创建具有复制功能的集群的更多信息,请参阅创建 Valkey 或 Redis 复制组 OSS。有关将只读副本添加到具有复制功能的集群的信息,请参阅为 Valkey 或 Redis 添加只读副本OSS(已禁用集群模式)

启用多可用区(控制台)

在创建新的 Valkey 或 Redis 集群时,您可以使用 ElastiCache 控制台启用多可用区,也可以通过复制修改现有OSS集群来启用多可用区。

默认情况下,在 Valkey 或 RedisOSS(已启用集群模式)集群上启用多可用区。

重要

ElastiCache 仅当集群在与主分片不同的可用区中至少包含一个副本时,才会自动启用多可用区。

使用控制台创建集群时启用多可用区 ElastiCache

有关此过程的更多信息,请参阅 创建 Valkey(已禁用集群模式)集群(控制台)。确保有一个或多个副本并启用多可用区。

在现有集群上启用多可用区(控制台)

有关此过程的更多信息,请参阅修改集群使用 ElastiCache AWS Management Console

启用多可用区 (AWS CLI)

以下代码示例使用 AWS CLI 为复制组redis12启用多可用区。

重要

复制组 redis12 必须已存在且具有至少一个可用只读副本。

对于 Linux、macOS 或 Unix:

aws elasticache modify-replication-group \ --replication-group-id redis12 \ --automatic-failover-enabled \ --multi-az-enabled \ --apply-immediately

对于 Windows:

aws elasticache modify-replication-group ^ --replication-group-id redis12 ^ --automatic-failover-enabled ^ --multi-az-enabled ^ --apply-immediately

此命令的JSON输出应如下所示。

{ "ReplicationGroup": { "Status": "modifying", "Description": "One shard, two nodes", "NodeGroups": [ { "Status": "modifying", "NodeGroupMembers": [ { "CurrentRole": "primary", "PreferredAvailabilityZone": "us-west-2b", "CacheNodeId": "0001", "ReadEndpoint": { "Port": 6379, "Address": "redis12-001.v5r9dc.0001.usw2.cache.amazonaws.com" }, "CacheClusterId": "redis12-001" }, { "CurrentRole": "replica", "PreferredAvailabilityZone": "us-west-2a", "CacheNodeId": "0001", "ReadEndpoint": { "Port": 6379, "Address": "redis12-002.v5r9dc.0001.usw2.cache.amazonaws.com" }, "CacheClusterId": "redis12-002" } ], "NodeGroupId": "0001", "PrimaryEndpoint": { "Port": 6379, "Address": "redis12.v5r9dc.ng.0001.usw2.cache.amazonaws.com" } } ], "ReplicationGroupId": "redis12", "SnapshotRetentionLimit": 1, "AutomaticFailover": "enabling", "MultiAZ": "enabled", "SnapshotWindow": "07:00-08:00", "SnapshottingClusterId": "redis12-002", "MemberClusters": [ "redis12-001", "redis12-002" ], "PendingModifiedValues": {} } }

有关更多信息,请参阅 AWS CLI 命令参考中的下列主题:

启用多可用区 (ElastiCache API)

以下代码示例使用 ElastiCache API为复制组redis12启用多可用区。

注意

要使用此示例,复制组 redis12 必须已存在且具有至少一个可用只读副本。

https://elasticache.us-west-2.amazonaws.com/ ?Action=ModifyReplicationGroup &ApplyImmediately=true &AutoFailover=true &MultiAZEnabled=true &ReplicationGroupId=redis12 &Version=2015-02-02 &SignatureVersion=4 &SignatureMethod=HmacSHA256 &Timestamp=20140401T192317Z &X-Amz-Credential=<credential>

有关更多信息,请参阅《ElastiCache API参考资料》中的以下主题:

故障情形及多可用区响应

在引入多可用区之前,通过重新创建和重新配置故障节点来 ElastiCache 检测并替换集群的故障节点。如果启用多可用区,发生故障的主节点将故障转移至复制滞后最小的副本。选定副本会自动提升为主节点,这比创建并重新预配置新的主节点快得多。提升过程通常只需几秒钟的时间,然后您可以再次对集群进行写入。

启用多可用区后, ElastiCache 持续监控主节点的状态。如果主节点发生故障,则根据故障的类型执行以下操作之一。

仅主节点出现故障时的故障情形

如果只有主节点出现故障,则复制滞后最小的只读副本将提升为主节点。然后,将在与发生故障的主节点相同的可用区域中创建和预置替换只读副本。

当只有主节点出现故障时, ElastiCache 多可用区会执行以下操作:

  1. 发生故障的主节点脱机。

  2. 复制滞后最小的只读副本将提升为主节点。

    一旦提升过程完成(通常只需几秒钟的时间),写入操作就会恢复。如果您的应用程序正在写入主终端节点,则无需更改写入或读取的终端节点。 ElastiCache传播已升级副本的DNS名称。

  3. 启动和预配置替代只读副本。

    将在可用区 (发生故障的主节点的位置) 启动替换只读副本,以便维护节点的分配。

  4. 该副本将与新的主节点同步。

新的副本可用后,请注意以下影响:

  • 主终端节点 — 您无需对应用程序进行任何更改,因为新的主节点的DNS名称会传播到主终端节点。

  • 读取端点 – 读取器终端节点会自动更新为指向新的副本节点。

有关查找集群的终端节点的信息,请参阅以下主题:

 

当主节点和一些只读副本发生故障时的故障情形

如果主节点和至少一个只读副本发生故障,则具有最低复制滞后的可用副本将提升到主集群,并在与故障节点以及提升为主节点的副本相同的可用区中创建新只读副本。

当主节点和某些只读副本出现故障时, ElastiCache 多可用区会执行以下操作:

  1. 发生故障的主节点和发生故障的只读副本脱机。

  2. 复制滞后最小的可用副本将提升为主节点。

    一旦提升过程完成(通常只需几秒钟的时间),写入操作就会恢复。如果您的应用程序正在写入主终端节点,则无需更改用于写入的终端节点。 ElastiCache 传播已升级副本的DNS名称。

  3. 创建和预配置替换副本。

    将在可用区(发生故障的节点的位置)创建替换副本,以便维护节点的分配。

  4. 所有集群将与新的主节点同步。

在新节点可用后,对应用程序进行以下更改:

  • 主端点 – 不要对应用程序进行任何更改。新的主节点的DNS名称将传播到主端点。

  • 读取端点 – 读取端点会自动更新为指向新的副本节点。

 

整个集群出现故障时的故障情形

如果整个集群全部发生故障,则在与原始节点相同的可用区中重新创建所有节点并预配置。

在此情况下,由于集群中的每个节点均发生故障,因此集群中的所有数据将丢失。这种情况很少出现。

当整个集群出现故障时, ElastiCache 多可用区会执行以下操作:

  1. 发生故障的主节点和只读副本脱机。

  2. 创建和预配置替换主节点。

  3. 创建和预配置替换副本。

    将在可用区(发生故障的节点的位置)创建替换,以便维护节点的分配。

    由于整个集群发生故障,因此数据将丢失,并且所有新节点将冷启动。

由于每个替换节点具有与其要替换的节点相同的终端节点,因此不需要在应用程序中对任何终端节点进行更改。

有关查找复制组的终端节点的信息,请参阅以下主题:

建议您在不同的可用区内创建主节点和只读副本以提高容错能力水平。

测试自动故障转移

启用自动故障转移后,您可以使用 ElastiCache 控制台 AWS CLI、和对其进行测试 ElastiCache API。

在测试时,请注意以下内容:

  • 在任何连续的 24 小时内,您可以使用此操作在最多 15 个分片( ElastiCache API和中称为节点组 AWS CLI)上测试自动故障转移。

  • 如果您对不同集群中的分片(在API和中称为复制组CLI)调用此操作,则可以同时进行调用。

  • 在某些情况下,您可能会在同一 Valkey 或 RedisOSS(已启用集群模式)复制组中的不同分片上多次调用此操作。在这种情况下,必须先完成第一个节点替换,然后再进行后续调用。

  • 要确定节点更换是否已完成,请使用 Amazon ElastiCache 控制台 AWS CLI、或,检查事件 ElastiCache API。查找下列与自动故障转移相关的事件,此处按事件的可能发生顺序列出:

    1. 复制组消息:Test Failover API called for node group <node-group-id>

    2. 缓存集群消息:Failover from primary node <primary-node-id> to replica node <node-id> completed

    3. 复制组消息:Failover from primary node <primary-node-id> to replica node <node-id> completed

    4. 缓存集群消息:Recovering cache nodes <node-id>

    5. 缓存集群消息:Finished recovery for cache nodes <node-id>

    有关更多信息,请参阅下列内容:

  • API这是为在 ElastiCache 故障转移时测试应用程序的行为而设计的。它不是用于启动故障转移以解决集群问题的操作工具。此外,在某些情况下,例如大规模运营事件, AWS 可能会阻碍这一点API。

使用测试自动故障转移 AWS Management Console

使用以下过程测试通过控制台进行自动故障转移。

测试自动故障转移
  1. 登录 AWS Management Console 并打开 ElastiCache 控制台,网址为 https://console.aws.amazon.com/elasticache/

  2. 在导航窗格中,选择 ValkeyRedis OSS

  3. 从集群列表中,选择要测试的集群左侧的复选框。此集群必须至少有一个只读副本节点。

  4. Details 区域中,确认此集群已启用多可用区。如果集群未启用多可用区,则选择其他集群或者修改此集群以启用多可用区。有关更多信息,请参阅 使用 ElastiCache AWS Management Console

    图片:启用多可用区的集群的详细信息区域
  5. 对于 Valkey 或 RedisOSS(已禁用集群模式),请选择集群的名称。

    对于 Valkey 或 RedisOSS(已启用集群模式),请执行以下操作:

    1. 选择集群的名称。

    2. 分片页面上,对于要测试故障转移的分片(在API和中称为节点组CLI),选择该分片的名称。

  6. 在“Nodes”页面上,选择 Failover Primary

  7. 选择 Continue 可对主节点进行故障转移,选择 Cancel 可取消操作,不对主节点进行故障转移。

    故障转移过程中,控制台继续将节点状态显示为可用。要跟踪您的故障转移测试进度,请从控制台导航窗格选择 Events。在 Events 选项卡上,观察指示故障转移已开始(Test Failover API called)和已完成(Recovery completed)的事件。

 

使用测试自动故障转移 AWS CLI

您可以使用该 AWS CLI 操作test-failover在任何启用多可用区的集群上测试自动故障转移。

参数
  • --replication-group-id – 必需。要测试的复制组 (在控制台上为集群)。

  • --node-group-id – 必需。要在其上测试自动故障转移的节点组的名称。在连续的 24 小时内,您最多可以测试 15 个节点组。

以下示例使用在 Valkey 或 RedisOSS(已启用集群模式)集群redis00-0003中测试节点组上的自动故障转移。 AWS CLI redis00

例 测试自动故障转移

对于 Linux、macOS 或 Unix:

aws elasticache test-failover \ --replication-group-id redis00 \ --node-group-id redis00-0003

对于 Windows:

aws elasticache test-failover ^ --replication-group-id redis00 ^ --node-group-id redis00-0003

上面命令的输出类似于下面所示。

{ "ReplicationGroup": { "Status": "available", "Description": "1 shard, 3 nodes (1 + 2 replicas)", "NodeGroups": [ { "Status": "available", "NodeGroupMembers": [ { "CurrentRole": "primary", "PreferredAvailabilityZone": "us-west-2c", "CacheNodeId": "0001", "ReadEndpoint": { "Port": 6379, "Address": "redis1x3-001.7ekv3t.0001.usw2.cache.amazonaws.com" }, "CacheClusterId": "redis1x3-001" }, { "CurrentRole": "replica", "PreferredAvailabilityZone": "us-west-2a", "CacheNodeId": "0001", "ReadEndpoint": { "Port": 6379, "Address": "redis1x3-002.7ekv3t.0001.usw2.cache.amazonaws.com" }, "CacheClusterId": "redis1x3-002" }, { "CurrentRole": "replica", "PreferredAvailabilityZone": "us-west-2b", "CacheNodeId": "0001", "ReadEndpoint": { "Port": 6379, "Address": "redis1x3-003.7ekv3t.0001.usw2.cache.amazonaws.com" }, "CacheClusterId": "redis1x3-003" } ], "NodeGroupId": "0001", "PrimaryEndpoint": { "Port": 6379, "Address": "redis1x3.7ekv3t.ng.0001.usw2.cache.amazonaws.com" } } ], "ClusterEnabled": false, "ReplicationGroupId": "redis1x3", "SnapshotRetentionLimit": 1, "AutomaticFailover": "enabled", "MultiAZ": "enabled", "SnapshotWindow": "11:30-12:30", "SnapshottingClusterId": "redis1x3-002", "MemberClusters": [ "redis1x3-001", "redis1x3-002", "redis1x3-003" ], "CacheNodeType": "cache.m3.medium", "DataTiering": "disabled", "PendingModifiedValues": {} } }

要跟踪故障转移的进度,请使用 AWS CLI describe-events操作。

有关更多信息,请参阅下列内容:

 

使用测试自动故障转移 ElastiCache API

您可以使用该 ElastiCache API操作TestFailover在任何启用了多可用区的集群上测试自动故障转移。

参数
  • ReplicationGroupId – 必需。要测试的复制组(在控制台上为集群)。

  • NodeGroupId – 必需。要在其上测试自动故障转移的节点组的名称。在连续的 24 小时内,您最多可以测试 15 个节点组。

以下示例在复制组 (在控制台上为集群) redis00 中的节点组 redis00-0003 上测试自动故障转移。

例 测试自动失效转移
https://elasticache.us-west-2.amazonaws.com/ ?Action=TestFailover &NodeGroupId=redis00-0003 &ReplicationGroupId=redis00 &Version=2015-02-02 &SignatureVersion=4 &SignatureMethod=HmacSHA256 &Timestamp=20140401T192317Z &X-Amz-Credential=<credential>

要跟踪故障转移的进度,请使用 ElastiCache DescribeEventsAPI操作。

有关更多信息,请参阅下列内容:

 

多可用区的限制

请注意多可用区的以下限制:

  • Valkey 以及 Redis OSS 版本 2.8.6 及更高版本都支持多可用区。

  • T1 节点类型不支持多可用区。

  • Valkey 和 Redis 的OSS复制是异步的。因此,当主节点故障转移到副本时,可能因复制滞后导致丢失少量数据。

    在选择要升级为主副本时,请 ElastiCache 选择复制延迟最小的副本。换句话说,它选择最新的副本。这样做有助于最大程度地减少丢失的数据量。复制滞后最小的副本可以位于同一发生故障的主节点中,也可以位于不同于发生故障的主节点的可用区中。

  • 在禁用集群模式的 Valkey 或 Redis OSS 集群上手动将只读副本提升为主副本时,只有在禁用多可用区和自动故障转移的情况下才能这样做。要将只读副本提升为主副本,请执行以下步骤:

    1. 禁用集群上的多可用区。

    2. 禁用集群上的自动故障转移。您可以通过控制台清除复制组的 “自动故障转移” 复选框来执行此操作。您也可以 AWS CLI 通过在调用ModifyReplicationGroup操作false时将AutomaticFailoverEnabled属性设置为来实现此目的。

    3. 将只读副本提升为主集群。

    4. 重新启用多可用区。

  • ElastiCache (RedisOSS) 多可用区和仅限追加的文件 (AOF) 是互斥的。启用了一个则不能启用另一个。

  • 节点的故障可能是因极少出现的整个可用区故障造成的。在此情况下,仅在备份可用区时才会创建替换故障主副本的副本。例如,假设一个复制组的主节点在 AZ-a 中且副本在 AZ-b 和 AZ-c 中。如果主节点出现故障,则复制滞后最小的副本将提升为主集群。然后,仅当 AZ-a 已备份且可用时,才在 AZ-a(出现故障的主节点所在的位置)中 ElastiCache 创建新的副本。

  • 客户发起的主节点重启不会触发自动故障转移。其他重启和故障会触发自动故障转移。

  • 在重启主节点后,将在其重新联机时清除其数据。当只读副本查看清除的主集群时,它们将清除其数据的副本,这会导致数据丢失。

  • 在提升只读副本后,另一个副本将与新的主节点同步。初始同步后,副本的内容将被删除,它们会同步来自新主节点的数据。此同步过程会导致短暂的中断,在此期间无法访问复制副本。此同步过程还导致在与副本同步时增加主节点上的临时负载。这种行为是 Valkey 和 Redis 的原生行为,OSS并不是多可用区所 ElastiCache独有的。有关此行为的详细信息,请参阅 Valkey 网站上的复制

重要

对于 Valkey 7.2.6 及更高版本或 Redis OSS 版本 2.8.22 及更高版本,你无法创建外部副本。

对于 2.8.22 之前的 Redis OSS 版本,我们建议您不要将外部副本连接到启用了多可用 ElastiCache 区的集群。这种不支持的配置可能会导致无法正常执行故障转移和恢复的问题。 ElastiCache 要将外部副本连接到 ElastiCache集群,请确保在建立连接之前未启用多可用区。