Amazon ElastiCache for Redis 是一种完全托管的与 Redis 和 Memcached 兼容的服务,能够为现代应用程序提供实时、成本优化的性能。它可以支持每秒数百万次操作且响应时间在微秒级。同时,它还具备企业级的安全性和可靠性。
您可以轻松以无缝方式扩展 ElastiCache for Redis,以适应应用程序使用模式的变化。通过更改缓存节点使用的实例类型,可以向上或向下扩展。此外,在集群模式下,通过更改集群中的分片数量,可以向外或向内扩展。
创建或修改 ElastiCache for Redis 集群时,有多个与大小相关的选项需要考虑:我应该使用哪种实例类型?我应该有多少个分片?我应该优先考虑更大的实例及较少的分片,还是反之?
正确回答这些问题取决于识别您的工作负载类型,因为不同的工作负载会利用不同的资源。例如,您的工作负载是内存受限内存是最主要的资源、CPU 受限,还是网络受限?在这篇文章中,我们提供了指南和建议,帮助您在价格和性能之间找到良好的平衡。
第一步是确定您的工作负载属于哪种类型:
内存受限工作负载 数据集的总大小通常决定集群的布局。ElastiCache for Redis 的数据集可以从几兆字节到几 TB 的数据不等。几 GB 的数据集可以轻松适配到单个 ElastiCache 实例,只需要一个分片一个主节点和零个或多个副本节点,而较大的工作负载由于内存限制可能无法适配单个实例,必须分布到多个分片上。对并发访问不是很高的大型数据集可以被视为内存受限。
CPU 受限工作负载 需要高并发度和因高 CPU 利用率而扩展的工作负载被认为是 CPU 受限。单个核心通常能为简单的 GET/SET 命令提供大约 100000 个请求每秒RPS的能力。然而,命令类型和其他因素比如 TLS可能会影响 RPS 的能力。例如,HGETALL 命令的复杂度会比简单的 GET 命令高 50100 倍。总体而言,遍历多个键或子键的命令会被认为是较慢的。您可以通过 Amazon CloudWatch 中的 XXXCmdLatency 指标观察到哪些命令快,哪些慢。您还可以在官方的 Redis 命令参考 中找到每个命令的计算复杂性O(1) O(N) 等。
网络受限工作负载 在 Redis 中存储和检索大型对象通常会导致响应在网络字节上非常大,并且可能会暗示这是一个网络受限工作负载。如果您使用的分片过少或实例类型过小,可能会导致超出实例网络带宽限制。您可以通过 CloudWatch 的 NetworkBandwidthOutAllowanceExceeded 和 NetworkBandwidthInAllowanceExceeded 指标观察到这一点。对于网络受限的工作负载,通常会有数千个 RPS 和响应大小为10 KB或以上。
ElastiCache for Redis 提供多个实例系列供您选择。这包括通用实例 (M 系列)、内存优化实例 (R 系列,具有更高的内存与核心比)、数据分级实例 (R6gd 家族),这些实例的数据在内存和 SSD 之间进行分层,以及网络优化实例 (C7gn),它们具有更高的网络带宽限制,还有瞬时突发实例 (T 系列),通常适合非生产用途。
每个实例系列有多个不同的实例大小,每种实例大小具有不同的核心数、总内存和网络带宽,因此适合不同类型的工作负载。
可以!ElastiCache 团队一直在不断努力改善多 CPU 实例上的性能。借助 增强 I/ORedis 503 及以上版本和 增强 I/O 多路复用Redis 7 及以上版本等内置功能,使用具有附加 CPU 的实例的客户可以期待更高的 RPS 能力和更低的延迟。这些功能提供性能提升,并且在具有 4 个 vCPU 或更多的实例中可用。有关功能兼容性的更多信息,请参考 支持的节点类型。
在为特定工作负载创建或扩展集群时,您可以选择较大的实例和较少的分片向上扩展或较小的实例和更多的分片向外扩展。我们建议选择最适合您工作负载的实例大小,然后根据所需的总容量选择分片数。
所选的实例大小应考虑多个因素,我们将在本节中讨论。
单个键或哈希槽的预期并发量ElastiCache for Redis 通过将键空间分配到多个分片来进行扩展。每个键始终映射到 16384 个哈希槽中的一个,而每个哈希槽则由一个分片所有一个分片可以拥有许多或所有哈希槽。因此,单个键总是由一个分片提供服务,因此选择的实例大小必须支持单个键或哈希槽的最大预期 RPS。这要求选择具有适当核心数量和充足网络带宽容量的实例类型。例如,假设我们有一个 4 KB 的键值,在高峰期读取速度为每秒 10000 个请求。簇中任何节点所需的额外带宽将是 300 Mbit/s。
较大的实例类型更好地支持使用突发,因为在许多应用程序中,这种热点可以在不同的时间发生在不同的键上。
例如,假设我们应用程序在稳定状态下需要总共 12 Gbit/s 的带宽,但因热键或哈希槽的原因偶尔会发生突发。我们可以使用两个基于 m7glarge 实例的分片,或者在同样的成本下,使用一个基于 m7gxlarge 实例的分片。在这两种情况下,总可用带宽都是 1876 Gbit/s。然而,使用两个大型实例时,我们在每个实例上以 600 Mbit/s 的稳定状态使用,留下的额外容量仅有 337 Mbit/s 供单个键使用的突发。使用 xlarge 实例时,我们以 12 Gbit/s 使用,留下 676 Mbit/s 的额外容量。
并发或新连接数量在集群模式中,客户端必须与所有分片以及可能的所有节点保持连接,以便能够读取任意键。这意味着集群中的任何节点必须能够支持预期的总连接数以及新连接的速率。较大的实例类型更适合处理更多连接,原因有几个:
较大的实例的网络容量和限制高于较小的实例。在 ElastiCache for Redis 中,额外的 vCPU例如,具有 4 个 vCPU 及以上的实例被用于卸载和并行处理网络 I/O 操作以及 TLS 会话建立。启用了传输加密TLS的集群使用 TLS 时,我们建议使用增强 I/O 功能,这些功能在 ElastiCache for Redis 62 及以上版本中自动包含,适用于 m/r7gxlarge 或更大的4 个以上 vCPU实例类型。这些增强功能通过将加密卸载到其他 vCPU,改善了吞吐量并减少了客户端连接建立时间。对于大量连接的工作负载,将会看到延迟改善,因为长时间的 TLS 握手不会阻塞主线程处理其他请求。
在识别工作负载的主要资源类型并选择最合适的实例类型后,创建有效的自动扩展策略就显得相对简单,它可以自动检测和响应使用情况变化,并添加额外的分片。例如,CPU 受限的工作负载可以根据 EngineCPUUtilization CloudWatch 指标设置策略,内存受限的工作负载可以使用 BytesUsedForCache 指标,网络受限的工作负载可以使用 NetworkBytesOut/In 指标。通过自动扩展策略,您可以根据选定实例类型的容量为这些指标中的一个设置目标值。有关详细信息,请参阅 自动扩展 ElastiCache for Redis 集群。
考虑到所有这些因素,让我们回顾一下根据工作负载类型进行规模配置的指导。
自然,内存数据库通常是内存受限,内存优化实例类型是默认选择。
以下表提供了此类工作负载的基本规模指南。它依赖于 R 家族实例,实例大小为 xlarge 和 2xlarge,这些实例足够满足大多数生产工作负载的内存和连接数要求。
总数据大小实例类型分片备注0416 GBr7gxlarge116按 BytesUsedForCache 设置自动扩展策略416 GBr7g2xlarge8按 BytesUsedForCache 设置自动扩展策略此外,对于大数据集而且不需要高并发的工作负载,可以在使用支持数据分层的实例 (r6gd 家族) 时进一步优化成本和性能。D 系列实例的数据在内存和本地 SSD固态驱动器存储之间分层,与 r6g 节点相比,可以实现超过 60 的成本节省。数据分层集群最适合用在常访问小部分键而其他较大数据仅偶尔访问的工作负载中。
加速器排行榜第一名这些工作负载的特点是在网络字节上发送和接收的大请求和响应。这类工作负载可能在达到内存或 CPU 限制之前超过实例带宽限制。每种实例类型都有定义的带宽限制有关更多信息,请参阅 内存优化实例。当超过限制时,可能会发生节流。
例如,在 m6glarge 实例类型上运行的应用程序执行 GET 命令,返回 25 KB 的值,预计最大 RPS 为 3750,因为其带宽限制是 075 Gbps。如果该应用程序发送更高速率的命令,则会发生节流,导致数据包延迟或丢失,最终导致 TCP 重发、超时,并可能对复制和集群总线通信造成干扰。
这就是为什么在网络受限工作负载中,选择能够支持某个特定键或哈希槽请求突发的实例大小尤其重要。
以下表提供了网络受限工作负载的指南。我们使用 M 型实例,这些实例相对于 R 实例的每个网络 Gbps 的价格较低。
预期带宽实例类型分片备注037 Gbpsm7gxlarge12按 NetworkBytesOut 设置自动扩展策略37120 Gbpsm7g2xlarge132按 NetworkBytesOut 设置自动扩展策略120 Gbpsm7g4xlarge16按 NetworkBytesOut 设置自动扩展策略对于运行网络带宽更加主导的工作负载的客户,可以选择 C7gn 实例,它们提供更高的网络性能,但相对于 M 和 R 实例内存较少。
预期带宽实例类型分片备注125 Gbpsc7gnxlarge1按 NetworkBytesOut 设置自动扩展策略我们将 CPU 受限工作负载分为两类:
高 RPS 工作负载 这类工作负载执行许多快速命令比如 GET 和 SET。高计算复杂度工作负载 这类工作负载执行慢速命令如 EVAL、HGETALL、LRANGE 等。高 RPS 工作负载主要包含快速命令,通常需要大量 CPU 资源以从网络读取和写入数据,还需要执行 TLS 加密和解密如果使用加密传输。这类工作负载能够受益于利用内置的增强 I/O 特性,网络和 TLS 工作被卸载到额外线程。有关兼容的实例类型和引擎版本的完整列表,请参见 支持的节点类型。
实例类型分片备注m7gxlarge132按 EngineCPUUtilization 设置自动扩展策略m7g2xlarge16按 EngineCPUUtilization 设置自动扩展策略高计算复杂度工作负载对主线程的压力最大,因此这类工作负载从额外核心的收益较少,通常通过扩展来增加额外的容量是最优选择。这类工作负载可以通过 GetTypeCmdLatency 和 SetTypeCmdLatency 指标来识别,平均延迟值超过 20 微秒。
实例类型分片备注m7glarge132按 EngineCPUUtilization 设置自动扩展策略m7gxlarge16按 EngineCPUUtilization 设置自动扩展策略在创建或扩展 ElastiCache for Redis 集群时,了解工作负载特性、不同实例类型和 ElastiCache for Redis 的扩展语义,以实现良好的价格和性能平衡是非常重要的。我们建议使用本文中的指南来简化这些选择。 数据分层 是另一个强大的工具,有必要时应考虑,另外,可以启用 自动扩展 来应对变化的工作负载需求。
有关更多信息,请查看我们关于管理 节点 和 集群 的文档。要开始使用,请通过 ElastiCache 控制台 创建新集群或升级现有集群。
Elad Bernstein 是 AWS ElastiCache 团队的高级软件工程师。他在软件开发和软件架构方面拥有 20 年的经验,涵盖低级内核开发、逆向工程、操作系统内部和高性能网络到分布式云系统。他对高性能代码和高度可扩展系统充满热情。业余时间,Elad 喜欢和家人一起做饭和旅行。

Karthik Konaparthi 是 Amazon 内存数据库团队的高级产品经理,驻扎在华盛顿州西雅图。他对数据的各个方面充满热情,致力于与客户合作以了解他们的需求并构建出色的产品。业余时间,他喜欢旅行和与家人共度时光。
销售热线
营销一部(传统产品):王部长 15371160678
营销二部(光伏焊带):曹部长 13921871003
电子邮箱
hallowed@mac.com
公司地址
邵武市因若之巅325号