利用多可用区最大限度减少 ElastiCache for Redis 中的停机时间 - ElastiCache 适用于 Redis 的 Amazon

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

利用多可用区最大限度减少 ElastiCache for Redis 中的停机时间

有许多情况下,ElastiCache for Redis 可能需要替换主节点;这些情况包括特定类型的计划维护以及主节点或可用区出现故障的意外事件。

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

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

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

  • 对于 ElastiCache for Redis 集群,在集群处理传入的写请求时,完成计划的节点替换。

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

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

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

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

启用多可用区

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

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

启用多可用区(控制台)

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

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

重要

仅当集群在除所有分区中的主可用区以外的可用区中包含至少一个副本时,ElastiCache 才会自动启用多可用区。

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

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

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

有关此过程的更多信息,请参阅修改集群使用 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 小时滚动期间,您可以使用此操作测试最多五个分区(在 ElastiCache API 和 AWS CLI 中称为节点组)上的自动故障转移。

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

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

  • 要确定节点替换是否已完成,您可以使用 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. 在导航窗格中,选择 Redis

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

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

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

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

    1. 选择集群的名称。

    2. Shards 页面上,对于要测试故障转移的分片 (在 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 小时滚动期间您最多可以测试 5 个节点组。

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

例 测试自动故障转移

对于 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 小时滚动期间您最多可以测试 5 个节点组。

以下示例在复制组 (在控制台上为集群) 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 DescribeEvents API 操作。

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

 

Redis 多可用区的限制

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

  • Redis 版本 2.8.6 和更高版本支持多可用区。

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

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

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

  • 在 Redis(已禁用集群模式)上手动将只读副本提升为主副本时,只有在多可用区和自动故障转移功能已禁用时才能执行此操作。要将只读副本提升为主副本,请执行以下步骤:

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

    2. 禁用集群上的自动故障转移。您可以在 Redis 控制台中取消勾选复制组的 Auto failover(自动故障转移)复选框来执行此操作。您可以在 AWS CLI 中在调用 ModifyReplicationGroup 操作时将 AutomaticFailoverEnabled 属性设置为 false 来执行此操作。

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

    4. 重新启用多可用区。

  • ElastiCache for Redis 多可用区和仅附加文件 (AOF) 相互排斥。启用了一个则不能启用另一个。

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

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

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

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

重要

对于 Redis 版本 2.8.22 及更高版本,您无法创建外部副本。

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