Amazon ElastiCache
用户指南 (API Version 2015-02-02)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

复制:具有自动故障转移功能的多可用区 (Redis)

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

自动故障转移概述

支持复制的 ElastiCache Redis 集群包含 1 到 15 个分片 (在 API 和 CLI 中,称作节点组)。每个分片均包含一个主节点和 1 到 5 个只读副本节点。在某些情况下,如果您的集群启用了多可用区,ElastiCache 会自动检测主节点的故障,选择只读副本节点并将其提升为主节点。这些情况包括特定类型的计划维护,或者出现主节点或可用区故障的意外事件。此故障检测和副本提升可确保在提升完成后,您可以马上继续写入新的主节点。

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

提升过程通常只需几分钟即可完成。此过程比重新创建并预配置行的主节点过程要快得多,后者是在您未启用具有自动故障转移功能的多可用区的情况下使用的过程。

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

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

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

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

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

  • 仅当您运行支持集群模式的 Redis 版本 3.2.4 或更高版本时,T2 节点模型才支持具有自动故障转移功能的 Redis 多可用区。

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

  • 在选择要提升为主节点的副本时,ElastiCache 会选择复制滞后最小的副本 (即最新的副本)。

  • 将只读副本提升为主节点:

    • 仅当在禁用具有自动故障转移功能的多可用区时,才能将只读副本提升为主节点。要将只读副本节点提升为主节点,您必须先在集群上禁用具有自动故障转移功能的多可用区,再执行提升,然后重新启用具有自动故障转移功能的多可用区。

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

  • 具有自动故障转移功能的 ElastiCache 多可用区和仅附加文件 (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 集群时使用 ElastiCache 控制台,或通过修改具有复制功能的现有 Redis 集群来启用具有自动故障转移功能的多可用区。

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

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

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

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

有关此过程的更多信息,请参阅 修改群集(控制台)

(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 区域中,确认此集群已启用多可用区。如果集群未启用多可用区,则选择其他集群或者修改此集群,以启用多可用区。有关更多信息,请参阅 修改群集(控制台)

    图:启用多可用区的 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

要跟踪故障转移的进度,请使用 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 操作。

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