

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

# ElastiCache 中的数据分层
<a name="data-tiering"></a>

包含复制组且使用 r6gd 系列节点类型的 ElastiCache for Valkey 或 ElastiCache for Redis OSS 集群将在内存和本地 SSD（固态硬盘）存储之间进行数据分层。借助数据分层功能，除可在内存中存储数据外，还可以在每个集群节点中使用成本更低的固态硬盘（SSD），从而为 Valkey 或 Redis OSS 工作负载提供新的高性价比选择。它非常适合经常访问的数据不超过总体数据集的 20% 的工作负载，以及能够容忍访问 SSD 中数据时所出现的额外延迟的应用程序。

对于启用了数据分层功能的 ElastiCache 集群，ElastiCache 会监控集群所存储每个项目的最近访问时间。当可用内存 (DRAM) 耗尽时，ElastiCache 将使用最近最少使用 (LRU) 算法，自动将不频繁访问的项目从内存移动到 SSD 中。随后访问 SSD 上的数据时，ElastiCache 会在处理请求之前自动异步将其移回内存中。如果您的工作负载只会经常访问部分数据，则数据分层将是经济高效地扩缩容量的极佳方法。

请注意，使用数据分层时，键本身始终保留在内存中，而 LRU 将控制值在内存和磁盘上的位置。通常，在使用数据分层时，我们建议您的键大小小于值。

数据分层旨在将对应用程序工作负载的性能影响降至最低。例如，假设 500 字节的字符串值，与请求存储在内存中的数据相比，请求存储在 SSD 上的数据预计平均会增加 300 微秒的延迟。

如果使用最大型号的数据分层节点 (cache.r6gd.16xlarge)，您可以在单个 500 节点集群中存储最高 1PB 的数据（使用 1 个只读副本时 500TB）。数据分层功能兼容 ElastiCache 中支持的所有 Valkey 或 Redis OSS 命令和数据结构。使用此功能无需任何客户端更改。

**Topics**
+ [最佳实践](#data-tiering-best-practices)
+ [限制](#data-tiering-prerequisites)
+ [定价](#data-tiering-pricing)
+ [监控](#data-tiering-monitoring)
+ [数据分层功能的使用](#data-tiering-enabling)
+ [将数据从备份还原到启用数据分层的集群](#data-tiering-enabling-snapshots)

## 最佳实践
<a name="data-tiering-best-practices"></a>

我们建议您遵循以下最佳实践：
+ 数据分层非常适合经常访问的数据不超过总体数据集的 20% 的工作负载，以及能够容忍访问 SSD 中数据时所出现的额外延迟的应用程序。
+ 在数据分层节点上使用可用的 SSD 容量时，我们建议值大小大于键。在 DRAM 和 SSD 之间移动项目时，键将始终保留在内存中，并且只有值会移动到 SSD 层。

## 限制
<a name="data-tiering-prerequisites"></a>

数据分层功能存在以下限制：
+ 您只能在复制组中的集群上使用数据分层。
+ 您使用的节点类型必须属于 r6gd 系列，目前可在以下区域使用：`us-east-2`、`us-east-1`、`us-west-2`、`us-west-1`、`eu-west-1`、`eu-central-1`、`eu-north-1`、`eu-west-3`、`ap-northeast-1`、`ap-southeast-1`、`ap-southeast-2`、`ap-south-1`、`ca-central-1` 和 `sa-east-1`。
+ 您必须使用 Valkey 7.2 或更高版本的引擎，或者使用 Redis OSS 6.2 或更高版本的引擎。
+ 除非两个集群都为 r6gd 集群，否则不能将 r6gd 集群的备份还原到其他集群。
+ 不能将使用数据分层功能的集群备份导出到 Amazon S3。
+ 在 r6gd 节点类型上运行的集群不支持在线迁移。
+ 不支持将使用数据分层功能的集群（例如，使用 r6gd 节点类型的集群）扩缩至不使用数据分层功能的集群（例如，使用 r6g 节点类型的集群）。有关更多信息，请参阅 [缩放 ElastiCache](Scaling.md)。
+ 对于 Valkey 7.2 及更高版本和 Redis OSS 7.0.7 及更高版本，使用数据分层的集群支持自动扩缩。有关更多信息，请参阅 [自动扩缩 Valkey 和 Redis OSS 集群](AutoScaling.md)。
+ 数据分层仅支持 `volatile-lru`、`allkeys-lru`、`volatile-lfu`、`allkeys-lfu` 和 `noeviction` maxmemory 策略。
+ Valkey 7.2 及更高版本和 Redis OSS 7.0.7 及更高版本支持无分支保存。有关更多信息，请参阅 [如何实施同步和备份](Replication.Redis.Versions.md)。
+ 大于 128MiB 的项目不会移动到 SSD。
+ 从 Valley 8.1 及更高版本开始，键 \$1 值大小小于 40 字节的项目将不会移至 SSD。

## 定价
<a name="data-tiering-pricing"></a>

与 R6g 节点（仅内存）相比，R6gd 节点的总存储容量（内存 \$1 SSD）提高了 4.8 倍，以最大利用率运行时可帮助实现超过 60% 的节省。有关更多信息，请参阅 [ElastiCache 定价](https://aws.amazon.com/elasticache/pricing/)。

## 监控
<a name="data-tiering-monitoring"></a>

ElastiCache 提供了若干专用于监控使用数据分层功能的高性能集群的指标。要监控 DRAM 中的项目与 SSD 的比例，可以使用 [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)中的 `CurrItems` 指标。您可以按以下方式计算百分比：*（带维度的 CurrItems：分层 = 内存 \$1 100）/（不带维度筛选器的 CurrItems）*。

 如果配置的 eviction 策略允许，那么当内存中的项目百分比降至 5% 以下时，ElastiCache 将开始移出项目。在配置了 noeviction 策略的节点上，写入操作将收到内存不足错误。

 当内存中的项目百分比降至 5% 以下时，我们建议您考虑横向扩展已启用集群模式的集群的规模，或纵向扩展已禁用集群模式的集群的规模。有关扩展的更多信息，请参阅[扩缩 Valkey 或 Redis OSS（已启用集群模式）集群](scaling-redis-cluster-mode-enabled.md)。有关使用数据分层的 Valkey 或 Redis OSS 集群指标的更多信息，请参阅 [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)。

## 数据分层功能的使用
<a name="data-tiering-enabling"></a>

### 通过 AWS 管理控制台使用数据分层功能
<a name="data-tiering-enabling-console"></a>

您可在创建复制组中的集群时选择 r6gd 系列的节点类型（例如 *cache.r6gd.xlarge*），从而使用数据分层功能。选择该节点类型将会自动启用数据分层功能。

有关创建集群的更多信息，请参阅[创建 Valkey 或 Redis OSS 集群](Clusters.Create.md)。

### 通过 AWS CLI 启用数据分层
<a name="data-tiering-enabling-cli"></a>

您可在使用 AWS CLI 创建复制组时选择 r6gd 系列的节点类型（例如 *cache.r6gd.xlarge*）并设置 `--data-tiering-enabled` 参数，从而使用数据分层功能。

选择 r6gd 系列的节点类型时，您将不能选择停止使用数据分层功能。如果您设置 `--no-data-tiering-enabled` 参数，操作将会失败。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
   --replication-group-id redis-dt-cluster \
   --replication-group-description "Redis OSS cluster with data tiering" \
   --num-node-groups 1 \
   --replicas-per-node-group 1 \
   --cache-node-type cache.r6gd.xlarge \
   --engine redis \   
   --cache-subnet-group-name default \
   --automatic-failover-enabled \
   --data-tiering-enabled
```

对于 Windows：

```
aws elasticache create-replication-group ^
   --replication-group-id redis-dt-cluster ^
   --replication-group-description "Redis OSS cluster with data tiering" ^
   --num-node-groups 1 ^
   --replicas-per-node-group 1 ^
   --cache-node-type cache.r6gd.xlarge ^
   --engine redis ^   
   --cache-subnet-group-name default ^
   --automatic-failover-enabled ^
   --data-tiering-enabled
```

运行此操作后，您将会看到一条与以下类似的响应：

```
{
    "ReplicationGroup": {
        "ReplicationGroupId": "redis-dt-cluster",
        "Description": "Redis OSS cluster with data tiering",
        "Status": "creating",           
        "PendingModifiedValues": {},
        "MemberClusters": [
            "redis-dt-cluster"
        ],
        "AutomaticFailover": "enabled",
        "DataTiering": "enabled",
        "SnapshotRetentionLimit": 0,
        "SnapshotWindow": "06:00-07:00",
        "ClusterEnabled": false,
        "CacheNodeType": "cache.r6gd.xlarge",       
        "TransitEncryptionEnabled": false,
        "AtRestEncryptionEnabled": false
    }
}
```

## 将数据从备份还原到启用数据分层的集群
<a name="data-tiering-enabling-snapshots"></a>

您可以通过（控制台）、(AWS CLI) 或 (ElastiCache API) 将数据从备份还原到启用数据分层的新集群。当您使用 r6gd 系列的节点类型创建集群时，系统会启用数据分层。

### 将数据从备份还原到启用数据分层的集群（控制台）
<a name="data-tiering-enabling-snapshots-console"></a>

**从备份还原到启用数据分层的集群（控制台）**

1. 登录 AWS 管理控制台 并打开 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.aws.amazon.com/elasticache/)）。

1. 从导航窗格中，选择 **Backups**（备份）。

1. 在备份列表中，选择您要从中进行还原的备份名称左侧的复选框。

1. 选择 **Restore**（还原）。

1. 完成 **Restore Cluster**（还原集群）对话框。务必要填写所有 **Required**（必填）字段以及您希望更改原定设置的任何其他字段。

   1. **Cluster ID**（集群 ID）– 必填。新集群的名称。

   1. **已启用集群模式（横向扩展）**– 对 Valkey 或 Redis OSS（已启用集群模式）集群选择此项。

   1. **Node Type**（节点类型）– 选择 **cache.r6gd.xlarge** 或 r6gd 系列中的任何其他节点类型。

   1. **Number of Shards**（分片数量）– 选择您希望新集群拥有的分片（API/CLI：节点组）数量。

   1. **Replicas per Shard（每个分区的副本数）**– 选择您希望各分区拥有的只读副本节点数量。

   1. **Slots and keyspaces（槽和键空间）** – 选择您希望如何在分区之间分布键。如果您选择指定键分配，请完成为各分片指定键范围的表。

   1. **Availability zone(s)（可用区）**– 指定您希望如何选择集群的可用区。

   1. **Port（端口）**– 仅当您希望新集群使用不同端口时才更改此项。

   1. **Choose a VPC（选择 VPC）**– 选择要在其中创建此集群的 VPC。

   1. **参数组** – 选择为所选节点类型预留了足够 Valkey 或 Redis OSS 内存开销的参数组。

1. 根据需要进行设置后，选择**创建**。

有关创建集群的更多信息，请参阅[创建 Valkey 或 Redis OSS 集群](Clusters.Create.md)。

### 将数据从备份还原到启用数据分层的集群 (AWS CLI)
<a name="data-tiering-enabling-snapshots-cli"></a>

使用 AWS CLI 创建复制组时，选择 r6gd 系列的节点类型（例如 *cache.r6gd.xlarge*）并设置 `--data-tiering-enabled` 参数后，系统会默认启用数据分层。

选择 r6gd 系列的节点类型时，您将不能选择停止使用数据分层功能。如果您设置 `--no-data-tiering-enabled` 参数，操作将会失败。

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group \
   --replication-group-id redis-dt-cluster \
   --replication-group-description "Redis OSS cluster with data tiering" \
   --num-node-groups 1 \
   --replicas-per-node-group 1 \
   --cache-node-type cache.r6gd.xlarge \
   --engine redis \   
   --cache-subnet-group-name default \
   --automatic-failover-enabled \
   --data-tiering-enabled \
   --snapshot-name my-snapshot
```

对于 Linux、macOS 或 Unix：

```
aws elasticache create-replication-group ^
   --replication-group-id redis-dt-cluster ^
   --replication-group-description "Redis OSS cluster with data tiering" ^
   --num-node-groups 1 ^
   --replicas-per-node-group 1 ^
   --cache-node-type cache.r6gd.xlarge ^
   --engine redis ^   
   --cache-subnet-group-name default ^
   --automatic-failover-enabled ^
   --data-tiering-enabled ^
   --snapshot-name my-snapshot
```

运行此操作后，您将会看到一条与以下类似的响应：

```
{
    "ReplicationGroup": {
        "ReplicationGroupId": "redis-dt-cluster",
        "Description": "Redis OSS cluster with data tiering",
        "Status": "creating",           
        "PendingModifiedValues": {},
        "MemberClusters": [
            "redis-dt-cluster"
        ],
        "AutomaticFailover": "enabled",
        "DataTiering": "enabled",
        "SnapshotRetentionLimit": 0,
        "SnapshotWindow": "06:00-07:00",
        "ClusterEnabled": false,
        "CacheNodeType": "cache.r6gd.xlarge",        
        "TransitEncryptionEnabled": false,
        "AtRestEncryptionEnabled": false
    }
}
```