

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

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

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

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

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

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

如果使用最大型号的数据分层节点（db.r6gd.8xlarge），您可以在单个 500 节点集群中存储最高 \$1500TB 的数据（使用 1 个只读副本时 250TB）。对于数据分层，请 MemoryDB 为每个节点预留 19% 的（DRAM）内存用于非数据目的。数据分层功能兼容 MemoryDB 中支持的所有 Valkey 和 Redis OSS 命令和数据结构。使用此功能无需任何客户端更改。

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

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

我们建议您遵循以下最佳实践：
+ 数据分层非常适合经常访问的数据不超过总体数据集的 20% 的工作负载，以及能够容忍访问 SSD 中数据时所出现的额外延迟的应用程序。
+ 在数据分层节点上使用可用的 SSD 容量时，我们建议值大小大于键。值大小不能大于 128MB；否则无法将其移动到磁盘。在 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-west-3`、`eu-central-1`、`ap-northeast-1`、`ap-southeast-1`、`ap-southeast-2`、`ap-south-1`、`ca-central-1` 和 `sa-east-1`。
+ 除非两个集群都为 r6gd 集群，否则不能将 r6gd 集群的快照还原到其他集群。
+ 不能将使用数据分层功能的集群快照导出到 Amazon S3。
+ 不支持无分支保存。
+ 不支持将使用数据分层功能的集群（例如，使用 r6gd 节点类型的集群）扩缩至不使用数据分层功能的集群（例如，使用 r6g 节点类型的集群）。
+ 数据分层仅支持 `volatile-lru`、`allkeys-lru` 和 `noeviction` maxmemory 策略。
+ 大于 128MiB 的项目不会移动到 SSD。

# 数据分层定价
<a name="data-tiering-pricing"></a>

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

# 数据分层监控
<a name="data-tiering-monitoring"></a>

MemoryDB 提供了若干专用于监控使用数据分层功能的高性能集群的指标。要监控 DRAM 中项目与 SSD 中项目的比率，您可以在 [MemoryDB 的指标](metrics.memorydb.md) 使用 `CurrItems` 指标。您可以按以下方式计算百分比：`(CurrItems with Dimension: Tier = Memory * 100) / (CurrItems with no dimension filter)`。

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

 当内存中项目的百分比降至 5% 以下时，仍建议您考虑 [扩展 MemoryDB 集群](scaling-cluster.md)。有关更多信息，请参阅 [MemoryDB 的指标](metrics.memorydb.md) 中的*适用于使用数据分层功能的 MemoryDB 集群的指标*。

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

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

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

有关创建集群的更多信息，请参阅[步骤 2：创建集群](getting-started.md#getting-started.createcluster)。

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

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

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

对于 Linux、macOS 或 Unix：

```
aws memorydb create-cluster \
   --cluster-name my-cluster \
   --node-type db.r6gd.xlarge \
   --engine valkey  \
   --acl-name my-acl \
   --subnet-group my-sg \
   --data-tiering
```

对于 Windows：

```
aws memorydb create-cluster ^
   --cluster-name my-cluster ^
   --node-type db.r6gd.xlarge ^
   --engine valkey ^
   --acl-name my-acl ^
   --subnet-group my-sg
   --data-tiering
```

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

```
{
    "Cluster": {
        "Name": "my-cluster",
        "Status": "creating",
        "NumberOfShards": 1,
        "AvailabilityMode": "MultiAZ",
        "ClusterEndpoint": {
            "Port": 6379
        },
        "NodeType": "db.r6gd.xlarge",
        "EngineVersion": "7.2",
        "EnginePatchVersion": "7.2.6",
        "Engine": "valkey"
        "ParameterGroupName": "default.memorydb-valkey7",
        "ParameterGroupStatus": "in-sync",
        "SubnetGroupName": "my-sg",
        "TLSEnabled": true,
        "ARN": "arn:aws:memorydb:us-east-1:xxxxxxxxxxxxxx:cluster/my-cluster",
        "SnapshotRetentionLimit": 0,
        "MaintenanceWindow": "wed:03:00-wed:04:00",
        "SnapshotWindow": "04:30-05:30",        
        "ACLName": "my-acl",
        "DataTiering":"true",
        "AutoMinorVersionUpgrade": true
    }
}
```

# 将数据从快照还原到集群
<a name="data-tiering-enabling-snapshots"></a>

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

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

要将快照还原到启用数据分层的新集群（控制台），请按照 [从快照还原（控制台）](snapshots-restoring.md#snapshots-restoring-CON) 中的步骤操作

请注意，如要启用数据分层，需要选择 r6gd 系列的节点类型。

## 将数据从快照还原到启用数据分层的集群（AWS CLI）
<a name="data-tiering-enabling-snapshots-cli"></a>

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

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

对于 Linux、macOS 或 Unix：

```
aws memorydb create-cluster \
   --cluster-name my-cluster \
   --node-type db.r6gd.xlarge \
   --engine valkey 
   --acl-name my-acl \
   --subnet-group my-sg \
   --data-tiering \
   --snapshot-name my-snapshot
```

对于 Windows：

```
aws memorydb create-cluster ^
   --cluster-name my-cluster ^
   --node-type db.r6gd.xlarge ^
   --engine valkey ^
   --acl-name my-acl ^
   --subnet-group my-sg ^
   --data-tiering ^
   --snapshot-name my-snapshot
```

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

```
{
    "Cluster": {
        "Name": "my-cluster",
        "Status": "creating",
        "NumberOfShards": 1,
        "AvailabilityMode": "MultiAZ",
        "ClusterEndpoint": {
            "Port": 6379
        },
        "NodeType": "db.r6gd.xlarge",
        "EngineVersion": "7.2",
        "EnginePatchVersion": "7.2.6",
        "Engine": "valkey"
        "ParameterGroupName": "default.memorydb-valkey7",
        "ParameterGroupStatus": "in-sync",
        "SubnetGroupName": "my-sg",
        "TLSEnabled": true,
        "ARN": "arn:aws:memorydb:us-east-1:xxxxxxxxxxxxxx:cluster/my-cluster",
        "SnapshotRetentionLimit": 0,
        "MaintenanceWindow": "wed:03:00-wed:04:00",
        "SnapshotWindow": "04:30-05:30",
        "ACLName": "my-acl",       
        "DataTiering": "true"
}
```