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

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

亚马逊 Well-A ElastiCache rchitected 镜头性能效率支柱

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

PE 1:如何监控您的亚马逊 ElastiCache 集群的性能?

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

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

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

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

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

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

    • ElastiCache 运行引擎 6.x 的 Redis OSS 工作负载可以利用基于角色的访问控制来限制某些命令。可以通过使用控制 Amazon 台或 CLI 创建用户和用户组,并将用户组关联到 for Redis OSS 集群来控制ElastiCache 对命令的访问。在 Redis OSS 6 中,启用 RBAC 后,我们可以使用 “-@dangerous”,它将不允许该用户使用密钥、监视器、排序等昂贵的命令。

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

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

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

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

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

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

  • [资源]:

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

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

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

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

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

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

  • [更好] 利用启用的 ElastiCache (Redis OSS)集群模式来提高可扩展性。

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

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

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

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

    • 工作负载中的热键可能会影响正在使用的节点的性能。对于 ElastiCache (Redis OSS)工作负载,您可以使用redis-cli --hotkeys是否有 LFU 最大内存策略来检测热键。

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

    • E ElastiCache (Redis OSS) 版本 6 支持服务器辅助的客户端缓存。这样,应用程序就可以等待密钥的更改,然后再进行网络呼叫ElastiCache。

  • [资源]:

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

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

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

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

    [资源]:

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

    [资源]:

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

    [资源]:

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

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

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

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

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

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

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

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

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

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

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

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

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

  • [资源]:

PE 6:你如何对中的数据进行建模和交互 ElastiCache?

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

问题层面的好处:中的数据建模ElastiCache 有多个层次,包括应用程序用例、数据类型和数据元素之间的关系。此外,每种 ElastiCache (Redis OSS)数据类型和命令都有自己有据可查的性能签名。

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

    [资源]:

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

    [资源]:

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

    [资源]:

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

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

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

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

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

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

    • 更改将立即生效。

  • [最佳] 利用我们的 Kinesis Data Firehose 功能。 CloudWatch

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

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

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

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

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

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

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

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

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

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

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

  • [资源]:

PE8:Auto Scaling 如何帮助提高ElastiCache 集群的性能?

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

问题层面的好处:了解和规划工作负载的峰值可以确保增强缓存性能和业务连续性。 ElastiCache (Redis OSS) Auto Scaling 会持续监控您的 CPU/内存利用率,以确保您的集群以所需的性能水平运行。

  • [必需] 为 ElastiCache (Redis OSS) 启动集群时:

    1. 确保已启用集群模式

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

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

    [资源]:

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

    [资源]:

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

    [资源]:

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

    [资源]: