

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

# 管理 Valkey 和 Redis OSS 的预留内存
<a name="redis-memory-management"></a>

预留内存是为非数据使用情况留出的内存。执行备份或失效转移时，Valkey 和 Redis OSS 使用可用的内存来记录将集群数据写入 .rdb 文件时对集群执行的写入操作。如果您没有足够的内存可供所有写入使用，则进程失败。以下部分介绍了管理 ElastiCache for Redis OSS 预留内存的选项的相关信息，以及如何应用这些选项。

**Topics**
+ [您需要预留多少内存？](#redis-memory-management-need)
+ [用于管理预留内存的参数](#redis-memory-management-parameters)
+ [指定您的预留内存管理参数](#redis-reserved-memory-management-change)

## 您需要预留多少内存？
<a name="redis-memory-management-need"></a>

如果您在运行 2.8.22 版之前的 Redis OSS，则针对备份和失效转移预留的内存量，要高于运行 Redis OSS 2.8.22 版或更高版本时所需的内存量。这是由于 ElastiCache for Redis OSS 采用不同方法实现备份流程。经验法则是，对于 2.8.22 版之前的 Redis OSS，预留节点类型 `maxmemory` 值一半的内存，对于 Redis OSS 2.8.22 版和更高版本则为四分之一。

由于 ElastiCache 实现备份和复制过程的方式不同，经验法则是使用 `maxmemory` 参数预留节点类型 `reserved-memory-percent` 值的 25%。这是默认值，建议在大多数情况下使用。

当可突增微型和小型实例类型在接近 `maxmemory` 限制时运行，可能会出现交换使用情况。为了提高这些实例类型在备份、复制和高流量期间的运行可靠性，我们建议将 `reserved-memory-percent` 参数的值提高到 30%（小型实例类型）和 50%（微型实例类型）。

对于有数据分层功能的 ElastiCache 集群上的写入密集型工作负载，我们建议将 `reserved-memory-percent` 提高到节点可用内存的 50%。

有关更多信息，请参阅下列内容：
+ [确保具有用于创建 Valkey 或 Redis OSS 快照的足够内存](BestPractices.BGSAVE.md)
+ [如何实施同步和备份](Replication.Redis.Versions.md)
+ [ElastiCache 中的数据分层](data-tiering.md)

## 用于管理预留内存的参数
<a name="redis-memory-management-parameters"></a>

自 2017 年 3 月 16 日起，Amazon ElastiCache 提供两个互斥参数（`reserved-memory` 和 `reserved-memory-percent`），用于管理 Valkey 或 Redis OSS 内存。Valkey 或 Redis OSS 发行版中不包含这两个参数。

这二者中的其一将是默认内存管理参数，具体取决于您开始使用 ElastiCache 的时间。在您创建新的 Valkey 或 Redis OSS 集群或复制组并使用默认参数组时，此参数适用。
+ 对于在 2017 年 3 月 16 日之前开始使用 ElastiCache 的客户，当您使用默认参数组创建 Redis OSS 集群或复制组时，内存管理参数为 `reserved-memory`。在此情况下，将预留零 (0) 字节内存。
+ 对于在 2017 年 3 月 16 日或之后开始使用 ElastiCache 的客户 – 当您使用默认参数组创建 Valkey 或 Redis OSS 集群或复制组时，内存管理参数为 `reserved-memory-percent`。在此情况下，将预留 25% 的节点 `maxmemory` 值用于非数据目的。

在了解了两个 Valkey 或 Redis OSS 内存管理参数后，您可能首选使用不是默认值或具有非默认值的该内存管理参数。如若如此，您可以更改为其他预留内存管理参数。

要更改该参数的值，您可以创建一个自定义参数组并对其进行修改以使用首选内存管理参数和值。然后，每当您创建新的 Valkey 或 Redis OSS 集群或复制组时，都可以使用自定义参数组。对于现有集群或复制组，您可以修改它们以使用自定义参数组。

 有关更多信息，请参阅下列内容：
+ [指定您的预留内存管理参数](#redis-reserved-memory-management-change)
+ [创建 ElastiCache 参数组](ParameterGroups.Creating.md)
+ [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)
+ [修改 ElastiCache 集群](Clusters.Modify.md)
+ [修改复制组](Replication.Modify.md)

### reserved-memory 参数
<a name="redis-memory-management-parameters-reserved-memory"></a>

在 2017 年 3 月 16 日之前，所有 ElastiCache for Redis OSS 预留内存管理均采用 `reserved-memory` 参数完成。`reserved-memory` 的默认值为 0。此默认值不为 Valkey 或 Redis OSS 开销预留内存，并允许 Valkey 或 Redis OSS 将所有节点内存用于数据。

您需要创建自定义参数组，才可更改 `reserved-memory` 以使您有足够的内存可用于备份和故障转移。在此自定义参数组中，您可将 `reserved-memory` 设置为适用于您的集群和集群节点类型上所运行的 Valkey 或 Redis OSS 版本的值。有关更多信息，请参阅 [您需要预留多少内存？](#redis-memory-management-need)。

参数 `reserved-memory` 特定于 ElastiCache，而且 Redis OSS 正式发行版中不包含此参数。

以下过程显示如何使用 `reserved-memory` 来管理 Valkey 或 Redis OSS 集群上的内存。

**使用 reserved-memory 预留内存**

1. 创建一个自定义参数组，指定与正在运行的引擎版本匹配的参数组系列，例如，指定 `redis2.8` 参数组系列。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

   ```
   aws elasticache create-cache-parameter-group \
      --cache-parameter-group-name redis6x-m3xl \
      --description "Redis OSS 2.8.x for m3.xlarge node type" \
      --cache-parameter-group-family redis6.x
   ```

1. 计算要为 Valkey 或 Redis OSS 开销预留的内存大小。在`maxmemory`中可找到适合您节点类型的 [特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific) 值。

1. 修改自定义参数组，使得参数 `reserved-memory` 为您在上一步中计算得到的字节数。以下 AWS CLI 示例假设您正在运行 2.8.22 版之前的 Redis OSS，需要预留节点的 `maxmemory` 的一半。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

   ```
   aws elasticache modify-cache-parameter-group \
      --cache-parameter-group-name redis28-m3xl \
      --parameter-name-values "ParameterName=reserved-memory, ParameterValue=7130316800"
   ```

   您使用的每个节点类型需要一个单独的自定义参数组，因为每个节点类型的 `maxmemory` 值不同。因此，每个节点类型需要不同的 `reserved-memory` 值。

1. 修改您的 Redis OSS 集群或复制组以使用自定义参数组。

   以下 CLI 示例修改集群 ` my-redis-cluster` 以立即开始使用自定义参数组 `redis28-m3xl`。有关更多信息，请参阅 [修改 ElastiCache 集群](Clusters.Modify.md)。

   ```
   aws elasticache modify-cache-cluster \
      --cache-cluster-id my-redis-cluster \
      --cache-parameter-group-name redis28-m3xl \
      --apply-immediately
   ```

   以下 CLI 示例修改复制组 `my-redis-repl-grp` 以立即开始使用自定义参数组 `redis28-m3xl`。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

   ```
   aws elasticache modify-replication-group \
      --replication-group-id my-redis-repl-grp \
      --cache-parameter-group-name redis28-m3xl \
      --apply-immediately
   ```

### reserved-memory-percent 参数
<a name="redis-memory-management-parameters-reserved-memory-percent"></a>

2017 年 3 月 16 日，Amazon ElastiCache 引入了参数 `reserved-memory-percent`，并在 ElastiCache for Redis OSS 所有版本上提供。`reserved-memory-percent` 的用途是简化所有集群上的预留内存管理。这是因为它让您可以对各参数组系列 (例如 `redis2.8`) 使用单个参数组来管理集群的预留内存，而不管节点类型如何。`reserved-memory-percent` 的默认值是 25 (25%)。

参数 `reserved-memory-percent` 特定于 ElastiCache，而且 Redis OSS 正式发行版中不包含此参数。

如果您的集群使用 r6gd 系列的节点类型，且内存利用率达到 75%，则会自动触发数据分层。有关更多信息，请参阅 [ElastiCache 中的数据分层](data-tiering.md)。

**使用 reserved-memory-percent 预留内存**  
如果要使用 `reserved-memory-percent` 管理 ElastiCache for Redis OSS 集群上的内存，请执行以下操作之一：
+ 如果您运行的是 Redis OSS 2.8.22 或更高版本，请向集群分配默认参数组。默认值 25% 应已足够。否则，请执行以下所述步骤更改该值。
+ 如果您运行的是 Redis OSS 2.8.22 以前的版本，则可能需要预留比 `reserved-memory-percent` 默认值的 25% 更高的内存。为此，请使用以下过程。

**更改 reserved-memory-percent 的百分比值**

1. 创建一个自定义参数组，指定与正在运行的引擎版本匹配的参数组系列，例如，指定 `redis2.8` 参数组系列。由于您无法修改默认参数组，所以需要自定义参数组。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

   ```
   aws elasticache create-cache-parameter-group \
      --cache-parameter-group-name redis28-50 \
      --description "Redis OSS 2.8.x 50% reserved" \
      --cache-parameter-group-family redis2.8
   ```

   由于 `reserved-memory-percent` 以节点 `maxmemory` 的百分比来预留内存，因此您无需为每个节点类型设置一个自定义参数组。

1. 修改自定义参数组，使得 `reserved-memory-percent` 为 50 (50%)。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

   ```
   aws elasticache modify-cache-parameter-group \
      --cache-parameter-group-name redis28-50 \
      --parameter-name-values "ParameterName=reserved-memory-percent, ParameterValue=50"
   ```

1. 为任何运行的 Redis OSS 版本早于 2.8.22 的 Redis OSS 集群或复制组使用此自定义参数组。

   以下 CLI 示例修改 Redis OSS 集群 `my-redis-cluster` 以立即开始使用自定义参数组 `redis28-50`。有关更多信息，请参阅 [修改 ElastiCache 集群](Clusters.Modify.md)。

   ```
   aws elasticache modify-cache-cluster \
      --cache-cluster-id my-redis-cluster \
      --cache-parameter-group-name redis28-50 \
      --apply-immediately
   ```

   以下 CLI 示例修改 Redis OSS 复制组 `my-redis-repl-grp` 以立即开始使用自定义参数组 `redis28-50`。有关更多信息，请参阅 [修改复制组](Replication.Modify.md)。

   ```
   aws elasticache modify-replication-group \
      --replication-group-id my-redis-repl-grp \
      --cache-parameter-group-name redis28-50 \
      --apply-immediately
   ```

## 指定您的预留内存管理参数
<a name="redis-reserved-memory-management-change"></a>

如果您在 2017 年 3 月 16 日之前已开始使用 ElastiCache，则默认预留内存管理参数为 `reserved-memory`，且预留内存为零 (0) 字节。如果您在 2017 年 3 月 16 日之后才开始使用 ElastiCache，则默认预留内存管理参数为 `reserved-memory-percent`，且节点的预留内存为 25%。无论您何时创建 ElastiCache for Redis OSS 集群或复制组，参数和预留内存都是如此。但是，您可以使用 AWS CLI 或 ElastiCache API 更改预留内存管理参数。

参数 `reserved-memory` 和 `reserved-memory-percent` 互斥。参数组始终有这两个参数之一，但不能同时有它们两者。您可以通过修改参数组，更改参数组用于管理预留内存的参数。由于您无法修改默认参数组，因此参数组必须是自定义参数组。有关更多信息，请参阅 [创建 ElastiCache 参数组](ParameterGroups.Creating.md)。

**指定 reserved-memory-percent**  
要将 `reserved-memory-percent` 用作预留内存管理参数，请使用 `modify-cache-parameter-group` 命令修改自定义参数组。使用 `parameter-name-values` 参数指定 `reserved-memory-percent` 及其值。

以下 CLI 示例修改自定义参数组 `redis32-cluster-on`，以便使用 `reserved-memory-percent` 管理预留内存。必须为参数组的 `ParameterValue` 分配一个值，才能将 `ParameterName` 参数用于预留内存管理。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

```
aws elasticache modify-cache-parameter-group \
   --cache-parameter-group-name redis32-cluster-on \
   --parameter-name-values "ParameterName=reserved-memory-percent, ParameterValue=25"
```

**指定 reserved-memory**  
要将 `reserved-memory` 用作预留内存管理参数，请使用 `modify-cache-parameter-group` 命令修改自定义参数组。使用 `parameter-name-values` 参数指定 `reserved-memory` 及其值。

以下 CLI 示例修改自定义参数组 `redis32-m3xl`，以便使用 `reserved-memory` 管理预留内存。必须为参数组的 `ParameterValue` 分配一个值，才能将 `ParameterName` 参数用于预留内存管理。因为引擎版本比 2.8.22 新，所以我们将该值设置为 `3565158400`，它是 `cache.m3.xlarge` 的 `maxmemory` 的 25%。有关更多信息，请参阅 [修改 ElastiCache 参数组](ParameterGroups.Modifying.md)。

```
aws elasticache modify-cache-parameter-group \
   --cache-parameter-group-name redis32-m3xl \
   --parameter-name-values "ParameterName=reserved-memory, ParameterValue=3565158400"
```