数据分层 - 适用于 Redis 的 Amazon MemoryDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

数据分层

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

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

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

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

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

最佳实践

我们建议您遵循以下最佳实践:

  • 数据分层非常适合经常访问的数据不超过总体数据集的 20% 的工作负载,以及能够容忍访问 SSD 中数据时所出现的额外延迟的应用程序。

  • 在数据分层节点上使用可用的 SSD 容量时,我们建议值大小大于键。值大小不能大于 128MB;否则无法将其移动到磁盘。在 DRAM 和 SSD 之间移动项目时,键将始终保留在内存中,并且只有值会移动到 SSD 层。

限制

数据分层功能存在以下限制:

  • 您使用的节点类型必须属于 r6gd 系列,目前可在以下区域使用:us-east-2us-east-1us-west-2us-west-1eu-west-1eu-west-3eu-central-1ap-northeast-1ap-southeast-1ap-southeast-2ap-south-1ca-central-1sa-east-1

  • 除非两个集群都为 r6gd 集群,否则不能将 r6gd 集群的快照还原到其他集群。

  • 不能将使用数据分层功能的集群快照导出到 Amazon S3。

  • 不支持无分支保存。

  • 不支持将使用数据分层功能的集群(例如,使用 r6gd 节点类型的集群)扩缩至不使用数据分层功能的集群(例如,使用 r6g 节点类型的集群)。

  • 数据分层仅支持 volatile-lruallkeys-lrunoeviction maxmemory 策略。

  • 大于 128MiB 的项目不会移动到 SSD。

数据分层定价

与 R6g 节点(仅内存)相比,R6gd 节点的总存储容量(内存 + SSD)提高了 5 倍,以最大利用率运行时可帮助实现超过 60% 的存储成本节省。有关更多信息,请参阅 MemoryDB 定价

监控

MemoryDB 提供了若干专用于监控使用数据分层功能的高性能集群的指标。要监控 DRAM 中的项目与 SSD 的比例,可以使用 MemoryDB 的指标 中的 CurrItems 指标。您可以按以下方式计算百分比:(CurrItems with Dimension: Tier = Memory * 100) / (CurrItems with no dimension filter)。当内存中的项目百分比降至 5% 以下时,我们建议您考虑 扩展 MemoryDB 集群

有关更多信息,请参阅 MemoryDB 的指标 中的适用于使用数据分层功能的 MemoryDB 集群的指标

数据分层功能的使用

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

有关创建集群的更多信息,请参阅步骤 1:创建集群

您可在使用 Amazon 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 \ --acl-name my-acl \ --subnet-group my-sg \ --data-tiering

对于 Windows:

aws memorydb create-cluster ^ --cluster-name my-cluster ^ --node-type db.r6gd.xlarge ^ --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": "6.2", "EnginePatchVersion": "6.2.6", "ParameterGroupName": "default.memorydb-redis6", "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 } }

将数据从快照还原到启用数据分层的集群

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

将数据从快照还原到启用数据分层的集群(控制台)

要将快照还原到启用数据分层的新集群(控制台),请按照 从快照还原(控制台) 中的步骤操作

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

使用 Amazon 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 \ --acl-name my-acl \ --subnet-group my-sg \ --data-tiering \ --snapshot-name my-snapshot

对于 Linux、macOS 或 Unix:

aws memorydb create-cluster ^ --cluster-name my-cluster ^ --node-type db.r6gd.xlarge ^ --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": "6.2", "EnginePatchVersion": "6.2.6", "ParameterGroupName": "default.memorydb-redis6", "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" }