

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

# 亚马逊的弹性 ElastiCache
<a name="disaster-recovery-resiliency"></a>

AWS全球基础设施是围绕AWS区域和可用区构建的。AWS区域提供多个物理隔离和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络相连。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

有关AWS区域和可用区的更多信息，请参阅[AWS全球基础设施](https://aws.amazon.com/about-aws/global-infrastructure/)。

除了AWS全球基础设施外，Amazon 还 ElastiCache 提供多项功能来帮助支持您的数据弹性和备份需求。

**Topics**
+ [缓解故障](#FaultTolerance)

## 缓解故障
<a name="FaultTolerance"></a>

在规划 Amazon ElastiCache 实施时，您应做好计划，尽量减少故障对应用程序和数据的影响。本部分中的主题涵盖了可用来防止应用程序和数据出现故障的方法。

**Topics**
+ [缓解运行 Memcached 时发生的故障](#FaultTolerance.Memcached)
+ [缓解运行 Valkey 或 Redis OSS 时发生的故障](#FaultTolerance.Redis)
+ [建议](#FaultTolerance.Recommendations)

### 缓解运行 Memcached 时发生的故障
<a name="FaultTolerance.Memcached"></a>

运行 Memcached 引擎时，您有以下选择来最大程度地减小故障的影响。故障缓解计划中有两类需要解决的故障：节点故障和可用区故障。

#### 缓解节点故障
<a name="FaultTolerance.Memcached.Node"></a>

无服务器缓存使用复制的多可用区架构，自动缓解节点故障，因此节点故障对您的应用程序是透明的。在基于节点的集群中，要缓解节点故障的影响，请将缓存数据分布到多个节点。由于基于节点的集群不支持复制，因此节点故障始终会导致集群中的一些数据丢失。

在创建 Memcached 集群时，您可以创建具有 1 到 60 个或以上（根据特殊请求）的节点的集群。跨更多节点对数据进行分区意味着，在节点出现故障时丢失的数据更少。例如，如果您跨 10 个节点对数据进行分区，则任一节点均可存储您的约 10% 的缓存数据。在此情况下，在创建和预配置替换节点时，节点故障会导致丢失约 10% 的需替换的缓存数据。如果在 3 个较大的节点中对相同的数据进行缓存，则节点故障将导致丢失约 33% 的缓存数据。

有关指定 Memcached 集群中的节点数的信息，请参阅[创建 Memcached 集群（控制台）](Clusters.Create-mc.md#Clusters.Create.CON.Memcached)。

#### 缓解可用区故障
<a name="FaultTolerance.Memcached.AZ"></a>

无服务器缓存使用复制的多可用区架构，自动缓解可用区故障，因此可用区故障对您的应用程序是透明的。

在基于节点的集群中，要缓解可用区故障的影响，请将节点置于尽可能多的可用区中。万一出现可用区故障，您将丢失该可用区中缓存的数据，而不是其他可用区中缓存的数据 AZs。

**为何要使用如此多的节点？**  
*如果我的区域只有 3 个可用区，既然在可用区出现故障时，我会丢失约三分之一的数据，那么为何我需要 3 个以上的节点？*

这个问题问得很好。请记住，我们正在尝试缓解两种不同类型的故障，即节点故障和可用区故障。您说得对，如果您的数据跨可用区分布且其中一个区域发生故障，则无论您拥有多少个节点，都只会丢失该可用区中缓存的数据。但是，如果节点出现故障，则拥有更多节点将减少丢失的数据的比例。

没有用于确定集群中拥有的节点数的“神奇公式”。您必须权衡数据丢失的影响、发生故障的可能性与成本，并得出您自己的结论。

有关指定 Memcached 集群中的节点数的信息，请参阅[创建 Memcached 集群（控制台）](Clusters.Create-mc.md#Clusters.Create.CON.Memcached)。

有关区域和可用区的更多信息，请参阅[为 ElastiCache 选择区域和可用区](RegionsAndAZs.md)。

### 缓解运行 Valkey 或 Redis OSS 时发生的故障
<a name="FaultTolerance.Redis"></a>

在运行 Valkey 或 Redis OSS 引擎时，您可以使用以下选项将节点或可用区故障的影响降至最低。

#### 缓解节点故障
<a name="FaultTolerance.Redis.Cluster"></a>

无服务器缓存使用多可用区架构，自动缓解节点故障，因此节点故障对您的应用程序是透明的。基于节点的集群必须得到妥善配置，以缓解单个节点出现故障的情况。

在基于节点的集群中，要缓解 Valkey 或 Redis OSS 节点故障的影响，您有以下选择：

**Topics**
+ [缓解故障：Valkey 或 Redis OSS 复制组](#FaultTolerance.Redis.Cluster.Replication)

##### 缓解故障：Valkey 或 Redis OSS 复制组
<a name="FaultTolerance.Redis.Cluster.Replication"></a>

Valkey 或 Redis OSS 复制组由一个主节点（应用程序可以从中读取和写入数据）和 1 到 5 个只读副本节点组成。在向主节点写入数据时，也会在只读副本节点上异步更新此数据。

**在只读副本发生故障的情况下**

1. ElastiCache 检测失败的只读副本。

1. ElastiCache 使故障节点下线。

1. ElastiCache 在同一 AZ 中启动并配置替换节点。

1. 新节点与主节点同步。

在此期间，应用程序可使用其他节点继续读取和写入。

**Valkey 或 Redis OSS 多可用区**  
您可以在 Valkey 或 Redis OSS 复制组上启用多可用区。无论是否启用多可用区，都将自动检测并替换发生故障的主节点。执行此操作的方式因是否启用多可用区而异。

**启用多可用区时**

1. ElastiCache 检测主节点故障。

1. ElastiCache 将复制延迟最小的只读副本节点提升到主节点。

1. 其他副本将与新的主节点同步。

1. ElastiCache 在出现故障的主节点的 AZ 中启动只读副本。

1. 新节点将与新提升的主节点同步。

故障转移到副本节点的速度通常比创建并预置新主节点的速度要快。这意味着，与未启用多可用区的情况相比，您的应用程序可更快地恢复对主节点的写入。

有关更多信息，请参阅 [利用多可用区以及 Valkey 和 Redis OSS 最大限度减少 ElastiCache 中的停机时间](AutoFailover.md)。

**禁用多可用区时**

1. ElastiCache 检测主故障。

1. ElastiCache 使主服务器脱机。

1. ElastiCache 创建并置备一个新的主节点来替换出现故障的主节点。

1. ElastiCache 将新的主副本与其中一个现有副本同步。

1. 同步完成时，新节点将发挥集群主节点的功能。

在此过程的步骤 1 到 4 中，您的应用程序无法写入主节点。不过，您的应用程序会继续从副本节点进行读取。

为了增强保护，我们建议您在不同的可用区（AZs）中启动复制组中的节点。如果这样做，可用区故障将仅影响该可用区中的节点，而不会影响其他节点。

有关更多信息，请参阅 [使用复制组时的高可用性](Replication.md)。

#### 缓解可用区故障
<a name="FaultTolerance.Redis.AZ"></a>

无服务器缓存使用复制的多可用区架构，自动缓解可用区故障，因此可用区故障对您的应用程序是透明的。

在基于节点的集群中，要缓解可用区故障的影响，对于每个分片，请将节点置于尽可能多的可用区中。

无论您的一个分片有多少个节点，如果所有这些节点都位于相同的可用区内，则该可用区的灾难性故障会导致您丢失分片的所有数据。但是，如果您在多个可用区中找到节点 AZs，则任何可用区出现故障都会导致您只丢失该可用区中的节点。

只要您丢失节点，就会导致性能下降，因为现在共享读取操作的节点更少了。在替换节点之前，性能下降将继续。

有关为 Valkey 或 Redis OSS 节点指定可用区的信息，请参阅[创建 Valkey（已禁用集群模式）集群（控制台）](SubnetGroups.designing-cluster-pre.valkey.md#Clusters.Create.CON.valkey-gs)。

有关区域和可用区的更多信息，请参阅[为 ElastiCache 选择区域和可用区](RegionsAndAZs.md)。

### 建议
<a name="FaultTolerance.Recommendations"></a>

我们建议对基于节点的集群创建无服务器缓存，因为这样您无需额外配置即可自动获得更好的容错能力。但是，在创建基于节点的集群时，您需要规划两种类型的故障：单个节点故障和广泛的可用区故障。最佳的故障缓解计划将解决这两种故障。

#### 尽可能减少节点故障的影响
<a name="FaultTolerance.Recommendations.NodeFailure"></a>

在使用 Valkey 或 Redis OSS 时，为了尽可能减少节点故障的影响，我们建议您的实施在每个分片中使用多个节点，并将节点分布在多个可用区中。对于无服务器缓存，此过程自动完成。

对于 Valkey 或 Redis OSS 上基于节点的集群，我们建议您在复制组上启用多可用区， ElastiCache 以便在主节点出现故障时自动故障转移到副本。

如果您正在运行 Memcached 并且正在跨节点对数据进行分区，在任一节点出现故障的情况下，您使用的节点越多，丢失的数据就越少。

#### 最大程度地减小可用区故障的影响
<a name="FaultTolerance.Recommendations.AZFailure"></a>

要最大程度地减小可用区故障的影响，建议您在提供的不同可用区内启动节点。在不太可能发生的可用区故障的情况下，均匀分布 AZs 节点可以最大限度地减少影响。对于无服务器缓存，此过程自动完成。

#### 其他预防措施
<a name="FaultTolerance.Recommendations.Other"></a>

如果您正在运行 Valkey 或 Redis OSS，那么除了上述措施外，我们还建议您定期对集群进行备份。备份（快照）会创建一个 .rdb 文件，在出现故障或损坏时，可使用此文件还原缓存。有关更多信息，请参阅 [快照和还原](backups.md)。