

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

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

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

**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 版或更高版本时所需的内存量。这一要求是由于 Redis OSS 实现备份过程的方式不同。 ElastiCache 经验法则是，对于 2.8.22 版之前的 Redis OSS，预留节点类型 `maxmemory` 值一半的内存，对于 Redis OSS 2.8.22 版和更高版本则为四分之一。

由于 ElastiCache 实现备份和复制过程的方式不同，经验法则是使用`reserved-memory-percent`参数保留节点类型`maxmemory`值的 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 日起，亚马逊 ElastiCache 提供了两个相互排斥的参数来管理你的 Valkey 或 Redis OSS 内存，`reserved-memory`以及。`reserved-memory-percent`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 对 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 开销预留的内存大小。在[特定于 Redis OSS 节点类型的参数](ParameterGroups.Engine.md#ParameterGroups.Redis.NodeSpecific)中可找到适合您节点类型的 `maxmemory` 值。

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 日，亚马逊 ElastiCache 推出了该参数，`reserved-memory-percent`并使其在 Redis OSS 的所有 ElastiCache 版本上都可用。`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 适用于 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 适用于 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}}"
```