

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

# 确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存
<a name="BestPractices.BGSAVE"></a>

**Valkey 7.2 及更高版本和 Redis OSS v2.8.22 及更高版本中的快照和同步功能**  
Valkey 默认支持快照和同步功能。Redis OSS 2.8.22 引入了无分支的保存过程，使您能够在同步和保存期间将更多内存分配给应用程序使用，而不会增加交换分区使用率。有关更多信息，请参阅 [如何实施同步和备份](Replication.Redis.Versions.md)。

**2.8.22 版本之前的版本中的 Redis OSS 快照和同步**

使用 ElastiCache for Redis OSS 时，Redis OSS 会在许多情况下调用后台写入命令：
+ 为备份创建快照时。
+ 将副本与复制组中的主副本同步时。
+ 为 Redis OSS 启用仅附加文件功能（AOF）时。
+ 将副本提升为主快照时（这会导致主集群/副本同步）。

每当 Redis OSS 执行后台写入进程时，您都必须有足够的可用内存来处理进程开销。内存不足会导致该进程失败。因此，重要的是在创建 Redis OSS 集群时应选择有足够内存的节点实例类型。

## Valkey 和 Redis OSS 的后台写入进程和内存使用情况
<a name="BestPractices.BGSAVE.Process"></a>

每当调用后台写入进程时，Valkey 和 Redis OSS 都会创建进程分叉（请记住，这些引擎是单线程的）。一个分叉将您的数据保存到磁盘上的 Redis OSS .rdb 快照文件中，另一个分叉为所有读取和写入操作提供服务。为了确保您的快照是时间点快照，所有数据更新和增加都写入与数据区域不同的可用内存区域。

只要您在数据保存到磁盘期间拥有足够的可用内存来记录所有写入操作，便不会遇到内存不足的问题。如果出现以下任何情况，您便可能会遇到内存不足的问题：
+ 您的应用程序执行很多写入操作，因此需要大量可用内存来接收新数据或更新的数据。
+ 可用于写入新数据或更新的数据的内存非常少。
+ 您的数据集很大，需要很长时间才能保存到磁盘，因而需要大量写入操作。

下图说明了执行后台写入进程时的内存使用情况。

![\[图像：后台写入过程中的内存使用情况图。\]](http://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/dg/images/ElastiCache-bgsaveMemoryUseage.png)


有关执行备份对性能的影响的信息，请参阅[备份基于节点的集群对性能的影响](backups.md#backups-performance)。

有关 Valkey 和 Redis OSS 如何执行快照的更多信息，请参阅 [http://valkey.io](http://valkey.io)。

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

## 避免在执行后台写入时耗尽内存
<a name="BestPractices.BGSAVE.memoryFix"></a>

每当调用后台写入进程（例如 `BGSAVE` 或 `BGREWRITEAOF`）时，为防止该进程失败，您拥有的可用内存必须多于写入操作在该进程执行期间所消耗的内存量。最糟糕的情况是，在后台写入操作期间，每个记录都会更新，并且有一些新的记录增加到缓存。因此，对于 2.8.22 版之前的 Redis OSS，建议您将 `reserved-memory-percent` 设置为 50（50%）；对于 Valkey 和所有 2.8.22 及之后的 Redis OSS 版本，建议您将此参数设置为 25（25%）。

`maxmemory` 值指示可供您用于数据和操作开销的内存。因为您无法修改默认参数组中的 `reserved-memory` 参数，所以必须为集群创建自定义参数组。`reserved-memory` 的默认值是 0，这允许 Redis OSS 为数据消耗所有 *maxmemory*，因此可能不会为其他用途（例如后台写入进程）留下内存。有关各种节点实例类型的 `maxmemory` 值，请参阅 [特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific)。

您还可以使用 `reserved-memory` 参数来减少在框架上使用的内存量。

有关 ElastiCache 中特定于 Valkey 和 Redis 的参数的更多信息，请参阅 [Valkey 和 Redis OSS 参数](ParameterGroups.Engine.md#ParameterGroups.Redis)。

有关创建和修改参数组的信息，请参阅[创建 ElastiCache 参数组](ParameterGroups.Creating.md)和[修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。