用于 Redis 的 Amazon ElastiCache
ElastiCache for Redis 用户指南 (API 版本 2015-02-02)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

最大程度地减少停机时间:具有自动故障转移功能的多可用区

在某些情况下,ElastiCache for Redis 会检测并替换主节点。这些情况包括特定类型的计划维护以及出现主节点或可用区故障的意外事件。

此替换会导致集群短暂停机。如果在集群上启用了带自动故障转移功能的多可用区,则会最大限度地缩短停机时间。在此情况下,主节点的角色会故障转移到其中一个只读副本。无需创建和预配置新的主节点。此故障转移和副本提升可确保您在提升完成后立即继续写入新的主节点。

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

如果计划更换节点,则由维护更新或自助服务更新而启动:

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

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

  • 对于启用了多可用区自动故障转移并在 5.0.4 或更高版本引擎上运行的禁用 Redis 集群模式的集群,您可能会注意到与 DNS 更新相关的短暂写入中断(长达几秒钟)。此过程比重新创建并预配置行的主节点过程要快得多,后者是在您未启用具有自动故障转移功能的多可用区的情况下使用的过程。

您可以使用 ElastiCache 管理控制台、AWS CLI 或 ElastiCache API 启用具有自动故障转移功能的多可用区。

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

有关具有自动故障转移功能的 Redis 多可用区的重要说明

对于支持自动故障转移的 Redis 多可用区,需要注意以下要点:

  • Redis 版本 2.8.6 和更高版本支持具有自动故障转移功能的多可用区。

  • T1 节点类型不支持具有自动故障转移功能的 Redis 多可用区。

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

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

  • 在手动将只读副本提升为主副本时,只有在禁用具有自动故障转移功能的多可用区时才能执行此操作。要将只读副本提升为主副本,请执行以下步骤:

    1. 在集群上禁用具有自动故障转移功能的多可用区。

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

    3. 重新启用具有自动故障转移功能的多可用区。

    无法在 Redis (已启用集群模式) 集群上禁用具有自动故障转移功能的多可用区。因此,您无法在任何 Redis (已启用集群模式) 集群上手动将副本提升为主节点。

  • 具有自动故障转移功能的 ElastiCache for Redis 多可用区和仅附加文件 (AOF) 相互排斥。启用了一个则不能启用另一个。

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

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

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

  • 在提升只读副本后,另一个副本将与新的主节点同步。在初始同步后,将删除副本的内容,并且将同步新的主节点中的数据,这会导致短暂的中断,此期间副本是不可访问的。此同步过程还导致在与副本同步时增加主节点上的临时负载。此行为是 Redis 固有的,并且不是 ElastiCache 多可用区所独有的。有关此 Redis 行为的详细信息,请参阅 http://redis.io/topics/replication

重要

  • 对于 Redis 版本 2.8.22 和更高版本,不允许外部副本。

  • 对于 2.8.22 之前的 Redis 版本,建议您不要将外部 Redis 副本连接到作为启用自动故障转移功能的多可用区的 ElastiCache Redis 集群。这是不受支持的配置,该配置会引发导致 ElastiCache 无法正常执行故障转移和恢复的问题。如果需要将外部 Redis 副本连接到 ElastiCache 集群,请确保在建立连接之前禁用具有自动故障转移功能的多可用区。

具有多可用区和自动故障转移响应的故障情况

在引入具有自动故障转移功能的多可用区之前,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 创建或修改集群(API 或 CLI:复制组)时启用具有自动故障转移功能的多可用区。

您只能在具有至少一个可用只读副本的 Redis (已禁用集群模式) 集群上启用具有自动故障转移功能的多可用区。具有自动故障转移功能的多可用区对于所有 Redis (已启用集群模式) 集群都是必需的,不论该集群是否有只读副本。没有只读副本的集群不提供高可用性或容错能力。有关创建具有复制功能的集群的更多信息,请参阅创建 Redis 复制组。有关将只读副本添加到具有复制功能的集群的信息,请参阅添加只读副本(对于 Redis(已禁用集群模式) 复制组)

(控制台) 启用具有自动故障转移功能的多可用区

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

默认情况下启用支持自动故障转移的多可用区,并且不能在 Redis (已启用集群模式) 集群上禁用这样的多可用区。

在使用 ElastiCache 控制台创建集群时启用具有自动故障转移功能的多可用区

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

(控制台) 在现有的集群上启用具有自动故障转移功能的多可用区

有关此过程的更多信息,请参阅修改集群使用 AWS 管理控制台

(AWS CLI) 启用具有自动故障转移功能的多可用区

以下代码示例使用 AWS CLI 为复制组 redis12 启用具有自动故障转移功能的多可用区。

重要

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

对于 Linux, OS X, or Unix:

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

对于 Windows:

aws elasticache modify-replication-group ^ --replication-group-id redis12 ^ --automatic-failover-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", "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 &ReplicationGroupId=redis12 &Version=2015-02-02 &SignatureVersion=4 &SignatureMethod=HmacSHA256 &Timestamp=20140401T192317Z &X-Amz-Credential=<credential>

有关更多信息,请参阅 ElastiCache API 参考中的下列主题:

测试具有自动故障转移功能的多可用区

在您启用了支持自动故障转移的多可用区之后,您可以使用 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 master node <primary-node-id> to replica node <node-id> completed

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

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

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

     

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

 

使用 AWS 管理控制台 测试自动故障转移

以下过程引导您完成自动故障转移的测试。

测试自动故障转移

  1. 登录 AWS 管理控制台 并通过以下网址打开 ElastiCache 控制台:https://console.amazonaws.cn/elasticache/

  2. 在导航窗格中,选择 Redis

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

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

    图:启用多可用区的 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, OS X, or 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", "SnapshotWindow": "11:30-12:30", "SnapshottingClusterId": "redis1x3-002", "MemberClusters": [ "redis1x3-001", "redis1x3-002", "redis1x3-003" ], "CacheNodeType": "cache.m3.medium", "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 API DescribeEvents 操作。

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