Amazon ElastiCache Well-Architected Lens 性能效率支柱 - ElastiCache 适用于 Redis 的 Amazon
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon ElastiCache Well-Architected Lens 性能效率支柱

性能效率支柱侧重于高效率地使用 IT 和计算资源。关键主题包括:根据工作负载要求选择合适的资源类型和大小、监控性能以及做出明智的决策以跟随业务需求的变化保持效率。

PE 1:如何监控 Amazon ElastiCache 集群的性能?

问题级简介:通过了解现有的监控指标,您可以确定当前的利用率。适当的监控有助于识别影响集群性能的潜在瓶颈。

问题级优势:了解与您的集群关联的指标有助于指导优化技术,从而减少延迟和增加吞吐量。

  • [必需] 使用一部分工作负载进行基准性能测试。

    • 您应该使用负载测试等机制监控实际工作负载的性能。

    • 在运行这些测试时监控 CloudWatch 指标,以了解可用指标并建立性能基准。

  • [最佳] 对于 ElastiCache for Redis 工作负载,重命名计算成本高的命令(例如 KEYS),以限制用户在生产集群上运行阻止性命令的能力。

    • 运行引擎 6.x 的 ElastiCache for Redis 工作负载可以利用基于角色的访问控制来限制某些命令。通过使用 Amazon 控制台或 CLI 创建用户和用户组,并将用户组与 ElastiCache for Redis 集群关联,可以控制对命令的访问权限。在 Redis 6 中,启用 RBAC 后,我们可以使用“-@dangerous”,它将禁止该用户使用诸如 KEYS、MONITOR、SORT 等昂贵的命令。

    • 对于引擎版本 5.x,使用 Amazon ElastiCache for Redis 集群参数组上的 rename-commands 参数重命名命令。

  • [更佳] 分析慢速查询并寻找优化技巧。

    • 对于 ElastiCache for Redis 工作负载,请通过分析慢速日志详细了解查询。例如,您可以使用以下命令 redis-cli slowlog get 10 来显示最近 10 条超过延迟阈值(原定设置为 10 秒)的命令。

    • 使用复杂的 ElastiCache for Redis 数据结构,可以更高效地执行某些查询。例如,对于数字样式范围查找,应用程序可以使用排序集来实现简单的数字索引。管理这些索引可以减少对数据集执行的扫描,并以更高的性能效率返回数据。

    • 对于 ElastiCache for Redis 工作负载,redis-benchmark 提供了一个简单的界面,用于使用用户定义的输入(如客户端数量和数据大小)测试不同命令的性能。

    • 由于 Memcached 仅支持简单的键级命令,因此可以考虑构建其他键作为索引,以避免遍历键空间来服务于客户端查询。

  • [资源]:

PE 2:如何在 ElastiCache 集群节点间分配工作?

问题级简介:您的应用程序连接到 Amazon ElastiCache 节点的方式可能会影响集群的性能和可扩展性。

问题级优势:正确使用集群中的可用节点将确保在可用的资源中分配工作。以下技巧也有助于避免闲置资源。

  • [必需] 让客户端连接到正确的 ElastiCache 端点。

    • Amazon ElastiCache for Redis 根据所使用的集群模式实现不同的端点。如果启用了集群模式,ElastiCache 将提供配置端点。如果禁用了集群模式,ElastiCache 将提供主端点(通常用于写入)和用于平衡副本间读取的读取器端点。正确实现这些端点将会提高性能并让扩展操作更轻松。除非有特定要求,否则请避免连接到各个节点端点。

    • 对于多节点 Memcached 集群,ElastiCache 提供了支持自动发现的配置端点。建议使用哈希算法在缓存节点之间均匀分配工作。许多 Memcached 客户端库可实现一致性哈希。请参阅您要使用的库的文档,了解其是否支持一致性哈希以及如何实现一致性哈希。您可以在此处找到有关实现这些功能的更多信息。

  • [更佳] 利用启用的 ElastiCache for Redis 集群模式来提高可扩展性。

    • ElastiCache for Redis(已启用集群模式)集群支持在线扩展操作(横向扩展/横向缩减和纵向扩展/缩减),以帮助在分片之间动态分配数据。使用配置端点将确保您的集群感知客户端能够适应集群拓扑的变化。

    • 您也可以通过在 ElastiCache for Redis(已启用集群模式)集群中的可用分片之间移动哈希槽来重新平衡集群。此举有助于在可用分片之间更高效地分配工作。

  • [更佳] 实施用于识别和修复工作负载中热键的策略。

    • 考虑多维 Redis 数据结构(例如列表、流、集合等)的影响。这些数据结构存储在单个 Redis 键中,而这些键位于单个节点上。与其他数据类型相比,非常大的多维键有可能占用更多的网络容量和内存,因此可能导致过度使用该节点。如果可能,请将您的工作负载设计为将数据访问分散到许多离散的键上。

    • 工作负载中的热键可能会影响正在使用的节点的性能。对于 ElastiCache for Redis 工作负载,如果存在 LFU 最大内存策略,则可以使用 redis-cli --hotkeys 检测热键。

    • 考虑在多个节点上复制热键,以便更均匀地分配对它们的访问。这种方法要求客户端写入多个主节点(Redis 节点本身不提供此功能),除原始键名称外,还需要维护一个可供读取的键名称列表。

    • ElastiCache for Redis 版本 6 支持服务器辅助客户端缓存。这让应用程序能够等待更改键后再向 ElastiCache 进行网络调用。

  • [资源]:

PE 3:对于缓存工作负载,如何跟踪和报告缓存的有效性和性能?

问题级简介:缓存是 ElastiCache 上经常遇到的工作负载,了解如何管理缓存的有效性和性能非常重要。

问题级优势:您的应用程序可能显示出性能不佳的迹象。您能够使用特定于缓存的指标来决定如何提高应用程序性能,这对您的缓存工作负载至关重要。

  • [必需] 测量并跟踪一段时间内的缓存命中率。缓存的效率由其“缓存命中率”决定。缓存命中率由键命中总数除以命中和未命中总数来定义。比率越接近 1,您的缓存就越有效。缓存命中率低是由缓存未命中数量造成的。当在缓存中找不到请求的键时,就会出现缓存未命中。键不在缓存中,因为它要么已被驱逐或删除,要么已过期,要么从未存在。了解为什么键不在缓存中,并制定适当的策略将其放入缓存。

    [资源]:

  • [必需] 测量和收集应用程序缓存性能以及延迟和 CPU 利用率值,以便了解是否需要调整生存时间或其他应用程序组件。ElastiCache 为每种数据结构的聚合延迟提供了一组 CloudWatch 指标。这些延迟指标是使用 ElastiCache for Redis INFO 命令中的命令统计数据计算得出的,不包括网络和 I/O 时间。这只是 ElastiCache for Redis 处理操作所耗费的时间。

    [资源]:

  • [最佳] 根据您的需求选择合适的缓存策略。缓存命中率低是由缓存未命中数量造成的。如果您的工作负载设计为缓存未命中数量较低(例如实时通信),则最好对缓存策略进行审查,并为您的工作负载应用最合适的解决方案,例如用于测量内存和性能的查询检测。您用于为填充并维护缓存而实施的实际策略取决于客户端需要缓存的数据以及针对这些数据的访问模式。例如,您不太可能对流媒体应用程序的个性化推荐和热门新闻报道使用相同的策略。

    [资源]:

PE 4:您的工作负载如何优化网络资源和连接的使用?

问题级简介:许多应用程序客户端都支持 ElastiCache for Redis 和 Memcached,实现方式可能会有所不同。您需要了解现有的网络和连接管理,以分析潜在的性能影响。

问题级优势:高效地使用网络资源可以提高集群的性能效率。以下建议可以减少网络需求,并改善集群延迟和吞吐量。

  • [必需] 主动管理与您的 ElastiCache 集群的连接。

    • 应用程序中的连接池减少了通过打开和关闭连接在集群上产生的开销量。使用 CurrConnectionsNewConnections 监控 Amazon CloudWatch 中的连接行为。

    • 通过在适当的位置正确关闭客户端连接来避免连接泄露。连接管理策略包括正确关闭未使用的连接,以及设置连接超时。

    • 对于 Memcached 工作负载,为处理连接预留了可配置的内存量,称为 memcached_connections_overhead

  • [更佳] 压缩大型对象以减少内存并提高网络吞吐量。

    • 数据压缩可以减少所需的网络吞吐量(Gbps),但会增加应用程序压缩和解压缩数据的工作量。

    • 压缩还会减少键所消耗的内存量

    • 根据您的应用程序需求,考虑压缩比与压缩速度之间的权衡。

  • [资源]:

PE 5:如何管理键删除和/或驱逐?

问题级简介:当集群节点接近内存消耗限制时,工作负载具有不同的要求和预期行为。Amazon ElastiCache for Redis 具有不同的策略来处理这些情况。

问题级优势:适当管理可用内存和了解驱逐策略,将有助于确保了解在超过实例内存限制时的集群行为。

  • [必需] 检测数据访问权限以评估要应用的策略。确定适当的最大内存策略,以控制是否以及如何对集群执行驱逐。

    • 当集群上的最大内存消耗完毕并且制定了允许驱逐的策略时,就会发生驱逐。在这种情况下,集群的行为取决于指定的驱逐策略。此策略可以使用 ElastiCache for Redis 集群参数组上的 maxmemory-policy 进行管理。

    • 原定设置策略 volatile-lru 通过驱逐设置了过期时间(TTL 值)的键来释放内存。最少使用(LFU)和最近最少使用(LRU)策略会根据使用情况删除键。

    • 对于 Memcached 工作负载,有一个原定设置 LRU 策略来控制每个节点上的驱逐。您可以使用 Amazon CloudWatch 上的驱逐指标来监控您的 Amazon ElastiCache 集群上的驱逐次数。

  • [更佳] 对删除行为进行标准化来控制对集群的性能影响,从而避免意外的性能瓶颈。

    • 对于 ElastiCache for Redis 工作负载,当从集群中明确删除键时,UNLINK 就像 DEL:它会删除指定的键。但是,该命令在不同的线程中执行实际内存回收,因此它不会阻止,而 DEL 会阻止。实际的删除将在稍后异步进行。

    • 对于 ElastiCache for Redis 6.x 工作负载,可以使用 lazyfree-lazy-user-del 参数在参数组中修改 DEL 命令的行为。

  • [资源]:

PE 6:如何在 ElastiCache 中对数据建模以及与数据交互?

问题级简介:ElastiCache 应用程序在很大程度上依赖于所使用的数据结构和数据模型,但它还需要考虑底层数据存储(如果存在)。了解可用的 ElastiCache for Redis 数据结构,并确保使用最适合您需求的数据结构。

问题级优势:ElastiCache 中的数据建模有多个层,包括应用程序使用案例、数据类型以及数据元素之间的关系。此外,每个 ElastiCache for Redis 数据类型和命令都有自己有据可查的性能签名。

  • [最佳] 最佳实践是减少无意中覆盖数据的情况。使用可最大限度地减少重叠键名称的命名约定。数据结构的传统命名使用分层方法,例如:APPNAME:CONTEXT:ID(如 ORDER-APP:CUSTOMER:123)。

    [资源]:

  • [最佳] ElastiCache for Redis 命令的时间复杂度由 Big O 表示法定义。命令的这种时间复杂度是其影响的算法/数学表示形式。在应用程序中引入新的数据类型时,需要仔细检查相关命令的时间复杂度。时间复杂度为 O(1) 的命令在时间上是恒定的,不依赖于输入的大小,但时间复杂度为 O(N) 的命令在时间上是线性的,受输入大小影响。由于 ElastiCache for Redis 采用单线程设计,因此,大量时间复杂度高的操作将导致性能下降,并可能会引起操作超时。

    [资源]:

  • [最佳] 使用 API 获取 GUI 对集群中数据模型的可见性。

    [资源]:

PE 7:如何在 Amazon ElastiCache 集群中记录运行缓慢的命令?

问题级简介:通过捕获、聚合和通知长时间运行的命令,可以改善性能调优效果。通过了解执行命令所需的时长,您可以确定哪些命令会导致性能不佳,以及哪些命令阻止引擎以最佳方式执行。Amazon ElastiCache for Redis 还可以将这些信息转发到 Amazon ElastiCache 或 Amazon Kinesis Data Firehose。

问题级优势:记录到专用的永久位置并为慢速命令提供通知事件,有助于进行详细的性能分析,并可用于触发自动事件。

  • [必需] 运行引擎版本 6.0 或更高版本的 Amazon ElastiCache for Redis,在集群上正确配置参数组并启用了 SLOWLOG 日志记录。

    • 仅当引擎版本兼容性设置为 Redis 版本 6.0 或更高版本时,必需的参数才可用。

    • 当命令的服务器执行时间超过指定的值时,就会发生 SLOWLOG 日志记录。集群的行为取决于关联的参数组参数,即 slowlog-log-slower-thanslowlog-max-len

    • 更改将立即生效。

  • [最佳] 利用 CloudWatch 或 Kinesis Data Firehose 功能。

    • 使用 CloudWatch、CloudWatch Logs Insights 和 Amazon Simple Notification Services 的筛选和警报功能来实现性能监控和事件通知。

    • 使用 Kinesis Data Firehose 的流式传输功能,将 SLOWLOG 日志归档到永久存储空间或触发自动集群参数调优。

    • 确定 JSON 还是纯文本格式最适合您的需求。

    • 提供 IAM 权限以发布到 CloudWatch 或 Kinesis Data Firehose。

  • [更佳] slowlog-log-slower-than 配置为原定设置值以外的值。

    • 此参数确定命令在 Redis 引擎中执行多长时间后会被记录为慢速运行命令。原定设置值为 10000 微秒(10 毫秒)。对于某些工作负载,原定设置值可能过高。

    • 根据应用程序需求和测试结果确定更适合您工作负载的值;但是,值过低可能会生成过多的数据。

  • [更佳] slowlog-max-len 保留为原定设置值。

    • 此参数决定了任何给定时间在 Redis 内存中捕获的慢速运行命令数上限。值为 0 会有效地禁用捕获。该值越高,存储在内存中的条目就越多,从而减少了重要信息在查看之前被驱逐的可能性。原定设置值为 128。

    • 原定设置值适用于大多数工作负载。如果需要通过 SLOWLOG 命令在 redis-cli 的扩展时段内分析数据,请考虑增加此值。这允许在 Redis 内存中保留更多命令。

      如果您将 SLOWLOG 数据发送到 CloudWatch Logs 或 Kinesis Data Firehose,则数据将保留并可以在 ElastiCache 系统之外进行分析,从而减少在 Redis 内存中存储大量慢速运行命令的需求。

  • [资源]:

PE8:自动扩缩如何帮助提高 ElastiCache 集群的性能?

问题级简介:通过实施 Redis 自动扩缩的功能,您的 ElastiCache 组件可以逐渐进行调整,以自动增加或减少所需的分片或副本。这可以通过实施目标跟踪或计划的扩展策略来实现。

问题级优势:了解和规划工作负载的峰值,可以确保提高缓存性能和业务连续性。ElastiCache for Redis 自动扩缩会持续监控您的 CPU/内存利用率,以确保您的集群以所需的性能水平运行。

  • [必需] 启动 ElastiCache for Redis 的集群时:

    1. 确保已启用集群模式

    2. 确保该实例属于支持自动扩缩的特定类型和大小的系列

    3. 确保集群未在全局数据存储、Outposts 或本地区域中运行

    [资源]:

  • [最佳] 确定您的工作负载是读取密集型还是写入密集型,以定义扩展策略。要想获得最佳性能,请仅使用一个跟踪指标。建议避免针对每个维度使用多个策略,因为自动扩缩策略会在达到目标时横向扩展,但只有在所有目标跟踪策略都准备好横向缩减时才会进行横向缩减。

    [资源]:

  • [最佳] 在一段时间内持续监控性能有助于您检测工作负载变化,如果在特定时间点进行监控,将不会注意到这些变化。您可以分析四周内集群利用率的相应 CloudWatch 指标,以确定目标值阈值。如果您仍然不确定要选择哪个值,我们建议您从支持的最小预定义指标值开始。

    [资源]:

  • [更佳] 我们建议使用预期的最小和最大工作负载测试您的应用程序,以确定集群制定扩展策略和减轻可用性问题所需的分片/副本的确切数量。

    [资源]: