

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

# 亚马逊 Well-A ElastiCache rchitected 镜头性能效率支柱
<a name="PerformanceEfficiencyPillar"></a>

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

**Topics**
+ [PE 1：如何监控您的亚马逊 ElastiCache 集群的性能？](#PerformanceEfficiencyPillarPE1)
+ [PE 2：您如何在 ElastiCache 群集节点之间分配工作？](#PerformanceEfficiencyPillarPE2)
+ [PE 3：对于缓存工作负载，如何跟踪和报告缓存的有效性和性能？](#PerformanceEfficiencyPillarPE3)
+ [PE 4：您的工作负载如何优化网络资源和连接的使用？](#PerformanceEfficiencyPillarPE4)
+ [PE 5：如何管理密钥删除 and/or 驱逐？](#PerformanceEfficiencyPillarPE5)
+ [PE 6：你如何对中的数据进行建模和交互 ElastiCache？](#PerformanceEfficiencyPillarPE6)
+ [PE 7：如何在您的 Amazon ElastiCache 集群中记录运行缓慢的命令？](#PerformanceEfficiencyPillarPE7)
+ [PE8: Auto Scaling 如何帮助提高ElastiCache 集群的性能？](#PerformanceEfficiencyPillarPE8)

## PE 1：如何监控您的亚马逊 ElastiCache 集群的性能？
<a name="PerformanceEfficiencyPillarPE1"></a>

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

**问题级优势：**了解与您的集群关联的指标有助于指导优化技术，从而减少延迟和增加吞吐量。
+ **[必需] **使用一部分工作负载进行基准性能测试。
  + 您应该使用负载测试等机制监控实际工作负载的性能。
  + 在运行这些测试时监控 CloudWatch 指标，以了解可用指标并建立性能基准。
+ **[最佳]** 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，请重命名计算成本高昂的命令，例如`KEYS`，以限制用户在生产集群上运行阻塞命令的能力。
  + ElastiCache 运行适用于 Redis OSS 的引擎 6.x 的工作负载可以利用基于角色的访问控制来限制某些命令。可以通过使用控制AWS台或 CLI 创建用户和用户组，并将用户组与集群关联来控制对命令的访问。在 Redis OSS 6 中，启用 RBAC 后，我们可以使用“-@dangerous”，它将禁止该用户使用诸如 KEYS、MONITOR、SORT 等昂贵的命令。
  + 对于引擎版本 5.x，使用集群参数组上的 `rename-commands` 参数重命名命令。
+ **[更佳]** 分析慢速查询并寻找优化技巧。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，请通过分析慢日志来详细了解您的查询。例如，您可以使用以下命令 `valkey-cli slowlog get 10` 来显示最近 10 条超过延迟阈值（原定设置为 10 毫秒）的命令。
  + 使用复杂ElastiCache 的 Valkey 和 Redis OSS 数据结构可以更有效地执行某些查询。例如，对于数字样式范围查找，应用程序可以使用排序集来实现简单的数字索引。管理这些索引可以减少对数据集执行的扫描，并以更高的性能效率返回数据。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，`redis-benchmark`提供了一个简单的接口，用于使用用户定义的输入（例如客户端数量和数据大小）来测试不同命令的性能。
  + 由于 Memcached 仅支持简单的键级命令，因此可以考虑构建其他键作为索引，以避免遍历键空间来服务于客户端查询。
+ **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
  + [使用亚马逊 CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)
  + [Valkey 和 Redis OSS 特定参数](ParameterGroups.Engine.md#ParameterGroups.Redis)
  + [SLOWLOG](https://valkey.io/commands/slowlog/)
  + [基准](https://valkey.io/topics/benchmark/)

## PE 2：您如何在 ElastiCache 群集节点之间分配工作？
<a name="PerformanceEfficiencyPillarPE2"></a>

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

**问题级优势：**正确使用集群中的可用节点将确保在可用的资源中分配工作。以下技巧也有助于避免闲置资源。
+ **[必需]** 让客户端连接到正确的 ElastiCache 端点。
  + ElastiCache 对于 Valkey 和 Redis，OSS 会根据所使用的集群模式实现不同的终端节点。对于已启用集群模式， ElastiCache 将提供配置终端节点。如果禁用了集群模式，则ElastiCache 提供一个主终端节点（通常用于写入）和一个用于平衡副本间读取的读取器终端节点。正确实现这些端点将会提高性能并让扩展操作更轻松。除非有特定要求，否则请避免连接到各个节点端点。
  + 对于多节点 Memcached 集群， ElastiCache 提供启用自动发现的配置终端节点。建议使用哈希算法在缓存节点之间均匀分配工作。许多 Memcached 客户端库可实现一致性哈希。请参阅您要使用的库的文档，了解其是否支持一致性哈希以及如何实现一致性哈希。您可以[在此处](BestPractices.LoadBalancing.md)找到有关实现这些功能的更多信息。
+ **[更好]** 利用支持 Valkey 和 Redis 的 OSS 集群模式的集群来提高可扩展性。 ElastiCache 
  + ElastiCache 对于 Valkey 和 Redis OSS（已启用集群模式），集群支持[在线扩展操作](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)（out/in and up/down），以帮助在分片之间动态分配数据。使用配置端点将确保您的集群感知客户端能够适应集群拓扑的变化。
  + 您也可以通过在 for Valkey 和 Redis OSS（已启用集群模式）集群中的 ElastiCache 可用分片之间移动哈希槽来重新平衡集群。此举有助于在可用分片之间更高效地分配工作。
+ **[更佳]** 实施用于识别和修复工作负载中热键的策略。
  + 考虑多维 Valkey 或 Redis OSS 数据结构（例如列表、流、集合等）的影响。这些数据结构存储在单个键中，而这些键位于单个节点上。与其他数据类型相比，非常大的多维键有可能占用更多的网络容量和内存，因此可能导致过度使用该节点。如果可能，请将您的工作负载设计为将数据访问分散到许多离散的键上。
  + 工作负载中的热键可能会影响正在使用的节点的性能。对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，你可以使用 LFU 最大内存策略`valkey-cli --hotkeys`是否到位来检测热键。
  + 考虑在多个节点上复制热键，以便更均匀地分配对它们的访问。这种方法要求客户端写入多个主节点（Valkey 或 Redis OSS 节点本身不提供此功能），除原始键名称外，还需要维护一个可供读取的键名称列表。
  + ElastiCache [适用于 Valkey 及更高 ElastiCache 版本的引擎 7.2 和 Redis OSS 及更高版本的版本 6 都支持服务器辅助的客户端缓存。](https://valkey.io/topics/client-side-caching/)这样，应用程序就可以等待密钥的更改，然后再进行网络呼叫ElastiCache。
+ **[资源]：**
  + [为 Valkey 和 Redis OSS 进行配置 ElastiCache 以获得更高的可用性](https://aws.amazon.com/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)
  + [查找 ElastiCache 中的缓存连接端点](Endpoints.md)
  + [负载均衡最佳实践](https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/BestPractices.LoadBalancing.html)
  + [Valkey 或 Redis OSS（已启用集群模式）的离线重新分片](scaling-redis-cluster-mode-enabled.md#redis-cluster-resharding-online)
  + [Valkey 和 Redis OSS 中的客户端缓存](https://valkey.io/topics/client-side-caching/)

## PE 3：对于缓存工作负载，如何跟踪和报告缓存的有效性和性能？
<a name="PerformanceEfficiencyPillarPE3"></a>

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

**问题级优势：**您的应用程序可能显示出性能不佳的迹象。您能够使用特定于缓存的指标来决定如何提高应用程序性能，这对您的缓存工作负载至关重要。
+ **[必需] **测量并跟踪一段时间内的缓存命中率。缓存的效率由其“缓存命中率”决定。缓存命中率由键命中总数除以命中和未命中总数来定义。比率越接近 1，您的缓存就越有效。缓存命中率低是由缓存未命中数量造成的。当在缓存中找不到请求的键时，就会出现缓存未命中。键不在缓存中，因为它要么已被驱逐或删除，要么已过期，要么从未存在。了解为什么键不在缓存中，并制定适当的策略将其放入缓存。

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

  **[资源]：**
  + [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)
  + [监控 ElastiCache 使用 Amazon 的最佳实践 CloudWatch](https://aws.amazon.com/blogs/database/monitoring-best-practices-with-amazon-elasticache-for-redis-using-amazon-cloudwatch/)
+ **[最佳] **根据您的需求选择合适的缓存策略。缓存命中率低是由缓存未命中数量造成的。如果您的工作负载设计为缓存未命中数量较低（例如实时通信），则最好对缓存策略进行审查，并为您的工作负载应用最合适的解决方案，例如用于测量内存和性能的查询检测。您用于为填充并维护缓存而实施的实际策略取决于客户端需要缓存的数据以及针对这些数据的访问模式。例如，您不太可能对流媒体应用程序的个性化推荐和热门新闻报道使用相同的策略。

  **[资源]：**
  + [Memcached 缓存策略](Strategies.md)
  + [缓存最佳实践](https://aws.amazon.com/caching/best-practices/)
  + [借助 Amazon 实现大规模绩效 ElastiCache 白皮书](https://d0.awsstatic.com/whitepapers/performance-at-scale-with-amazon-elasticache.pdf)

## PE 4：您的工作负载如何优化网络资源和连接的使用？
<a name="PerformanceEfficiencyPillarPE4"></a>

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

**问题级优势：**高效地使用网络资源可以提高集群的性能效率。以下建议可以减少网络需求，并改善集群延迟和吞吐量。
+ **[必需]** 主动管理与 ElastiCache 集群的连接。
  + 应用程序中的连接池减少了通过打开和关闭连接在集群上产生的开销量。 CloudWatch 使用`CurrConnections`和监控 Amazon 中的连接行为`NewConnections`。
  + 通过在适当的位置正确关闭客户端连接来避免连接泄露。连接管理策略包括正确关闭未使用的连接，以及设置连接超时。
  + 对于 Memcached 工作负载，为处理连接预留了可配置的内存量，称为 `memcached_connections_overhead`。
+ **[更佳] **压缩大型对象以减少内存并提高网络吞吐量。
  + 数据压缩可以减少所需的网络吞吐量（Gbps），但会增加应用程序压缩和解压缩数据的工作量。
  + 压缩还会减少键所消耗的内存量
  + 根据您的应用程序需求，考虑压缩比与压缩速度之间的权衡。
+ **[资源]：**
  + [ElastiCache -全球数据存储](https://aws.amazon.com/elasticache/redis/global-datastore/)
  + [Memcached 特定的参数](ParameterGroups.Engine.md#ParameterGroups.Memcached)
  + [ElastiCache 适用于 Redis OSS 的 5.0.3 版本增强了 I/O 处理能力以提高性能](https://aws.amazon.com/about-aws/whats-new/2019/03/amazon-elasticache-for-redis-503-enhances-io-handling-to-boost-performance/)
  + [Valkey 和 Redis OSS 的指标](CacheMetrics.Redis.md)
  + [配置 ElastiCache 以获得更高的可用性](https://aws.amazon.com/blogs/database/configuring-amazon-elasticache-for-redis-for-higher-availability/)

## PE 5：如何管理密钥删除 and/or 驱逐？
<a name="PerformanceEfficiencyPillarPE5"></a>

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

**问题级优势：**适当管理可用内存和了解驱逐策略，将有助于确保了解在超过实例内存限制时的集群行为。
+ **[必需] **检测数据访问权限以评估要应用的策略。确定适当的最大内存策略，以控制是否以及如何对集群执行驱逐。
  + 当集群上的最大内存消耗完毕并且制定了允许驱逐的策略时，就会发生驱逐。在这种情况下，集群的行为取决于指定的驱逐策略。此策略可以使用集群参数组上的 `maxmemory-policy` 进行管理。
  + 原定设置策略 `volatile-lru` 通过驱逐设置了过期时间（TTL 值）的键来释放内存。最少使用（LFU）和最近最少使用（LRU）策略会根据使用情况删除键。
  + 对于 Memcached 工作负载，有一个原定设置 LRU 策略来控制每个节点上的驱逐。您可以使用亚马逊上的驱逐指标来监控您的 Amazon ElastiCache 集群上的驱逐次数。 CloudWatch
+ **[更佳]** 对删除行为进行标准化来控制对集群的性能影响，从而避免意外的性能瓶颈。
  + 对 ElastiCache 于 Valkey 和 Redis OSS 工作负载，当从集群中显式删除密钥时，`UNLINK`就像`DEL`：它会删除指定的密钥。但是，该命令在不同的线程中执行实际内存回收，因此它不会阻止，而 `DEL` 会阻止。实际的删除将在稍后异步进行。
  + 对于适用于 Redis OSS 工作负载的 6.x ElastiCache 版本，可以使用参数在参数组中修改`DEL`命令的行为。`lazyfree-lazy-user-del`
+ **[资源]：**
  + [使用 ElastiCache 参数组配置引擎参数](ParameterGroups.md)
  + [UNLINK](https://valkey.io/commands/unlink/)
  + [云财务管理与AWS](https://aws.amazon.com/aws-cost-management/)

## PE 6：你如何对中的数据进行建模和交互 ElastiCache？
<a name="PerformanceEfficiencyPillarPE6"></a>

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

**问题层面的好处：**中的数据建模ElastiCache 有多个层次，包括应用程序用例、数据类型和数据元素之间的关系。此外，每个数据类型和命令都有自己有据可查的性能签名。
+ **[最佳] **最佳实践是减少无意中覆盖数据的情况。使用可最大限度地减少重叠键名称的命名约定。数据结构的传统命名使用分层方法，例如：`APPNAME:CONTEXT:ID`（如 `ORDER-APP:CUSTOMER:123`）。

  **[资源]：**
  + [键命名](https://docs.gitlab.com/ee/development/redis.html#key-naming)
+ **[最佳]** ElastiCache 对于 Valkey 和 Redis 来说，OSS 命令的时间复杂度由 Big O 表示法定义。这次，命令的复杂性 algorithmic/mathematical 代表了其影响。在应用程序中引入新的数据类型时，需要仔细检查相关命令的时间复杂度。时间复杂度为 O(1) 的命令在时间上是恒定的，不依赖于输入的大小，但时间复杂度为 O(N) 的命令在时间上是线性的，受输入大小影响。由于 Valkey 和 Redis OSS 的单线程设计，大量的高时间复杂度操作将导致性能降低和潜在的操作超时。ElastiCache 

  **[资源]：**
  + [命令](https://valkey.io/commands/)
+ **[最佳]** APIs 用于获取 GUI 对集群中数据模型的可见性。

  **[资源]：**
  + [Redis OSS Commander](https://www.npmjs.com/package/ElastiCache for Redis-commander)
  + [Redis OSS 浏览器](https://github.com/humante/redis-browser)
  + [Redsmin](https://www.redsmin.com/)

## PE 7：如何在您的 Amazon ElastiCache 集群中记录运行缓慢的命令？
<a name="PerformanceEfficiencyPillarPE7"></a>

**问题级简介：**通过捕获、聚合和通知长时间运行的命令，可以改善性能调优效果。通过了解命令执行需要多长时间，您可以确定哪些命令会导致性能不佳，以及哪些命令会阻碍引擎以最佳状态运行。 ElastiCache 还可以将这些信息转发给亚马逊 CloudWatch 或亚马逊 Kinesis Data Firehose。

**问题级优势：**记录到专用的永久位置并为慢速命令提供通知事件，有助于进行详细的性能分析，并可用于触发自动事件。
+ **[必需]** ElastiCache 运行 Valkey 引擎 7.2 或更高版本，或者运行 Redis OSS 引擎 6.0 或更高版本，正确配置参数组并在集群上启用 SLOWLOG 日志记录。
  + 仅当引擎版本兼容性设置为 Valkey 7.2 及更高版本或 Redis OSS 6.0 或更高版本时，必需的参数才可用。
  + 当命令的服务器执行时间超过指定的值时，就会发生 SLOWLOG 日志记录。集群的行为取决于关联的参数组参数，即 `slowlog-log-slower-than` 和 `slowlog-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` 配置为原定设置值以外的值。
  + 此参数确定命令在 Valkey 或 Redis OSS 引擎中执行多长时间后会被记录为慢速运行命令。原定设置值为 10000 微秒（10 毫秒）。对于某些工作负载，原定设置值可能过高。
  + 根据应用程序需求和测试结果确定更适合您工作负载的值；但是，值过低可能会生成过多的数据。
+ **[更佳] **将 `slowlog-max-len` 保留为原定设置值。
  + 此参数决定了任何给定时间在 Valkey 或 Redis OSS 内存中捕获的慢速运行命令数上限。值为 0 会有效地禁用捕获。该值越高，存储在内存中的条目就越多，从而减少了重要信息在查看之前被驱逐的可能性。原定设置值为 128。
  + 原定设置值适用于大多数工作负载。如果需要通过 SLOWLOG 命令在 valkey-cli 的扩展时段内分析数据，请考虑增加此值。这允许在 Valkey 或 Redis OSS 内存中保留更多命令。

    如果您将 SLOWLOG 数据发送到 Logs 或 Kinesis Data Firehose，则这些数据将被保存，并且可以在系统之外进行分析，从而减少 ElastiCache 在 Valkey 或 Redis OSS 内存中存储大量运行缓慢的命令的需求。 CloudWatch 
+ **[资源]：**
  + [如何在集群中开启慢速日志？](https://repost.aws/knowledge-center/elasticache-turn-on-slow-log)
  + [日志传输](Log_Delivery.md)
  + [Redis OSS 特定参数](ParameterGroups.Engine.md#ParameterGroups.Redis)
  + [https://aws.amazon.com/cloudwatch/](https://aws.amazon.com/cloudwatch/)Amazon CloudWatch
  + [Amazon Kinesis Data Firehose](https://aws.amazon.com/kinesis/data-firehose/)

## PE8: Auto Scaling 如何帮助提高ElastiCache 集群的性能？
<a name="PerformanceEfficiencyPillarPE8"></a>

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

**问题层面的好处：**了解和规划工作负载的峰值可以确保增强缓存性能和业务连续性。 ElastiCache Auto Scaling 会持续监控您的 CPU/内存利用率，以确保您的集群以所需的性能水平运行。
+ **[必需]** 在为 Valkey 或 Redis OSS 启动集群时：ElastiCache 

  1. 确保已启用集群模式

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

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

  **[资源]：**
  + [扩展 Valkey 和 Redis OSS 中的集群（启用集群模式）](scaling-redis-cluster-mode-enabled.md)
  + [将自动扩缩与分片结合使用](AutoScaling-Using-Shards.md)
  + [将自动扩缩与副本结合使用](AutoScaling-Using-Replicas.md)
+ **[最佳] **确定您的工作负载是读取密集型还是写入密集型，以定义扩展策略。要想获得最佳性能，请仅使用一个跟踪指标。建议避免针对每个维度使用多个策略，因为自动扩缩策略会在达到目标时横向扩展，但只有在所有目标跟踪策略都准备好横向缩减时才会进行横向缩减。

  **[资源]：**
  + [自动扩缩策略](AutoScaling-Policies.md)
  + [定义扩展策略](AutoScaling-Scaling-Defining-Policy-API.md)
+ **[最佳] **在一段时间内持续监控性能有助于您检测工作负载变化，如果在特定时间点进行监控，将不会注意到这些变化。您可以分析四周内集群利用率的相应CloudWatch 指标，以确定目标值阈值。如果您仍然不确定要选择哪个值，我们建议您从支持的最小预定义指标值开始。

  **[资源]：**
  + [使用 CloudWatch 指标监控使用情况](CacheMetrics.md)
+ **[更好]** 我们建议使用预期的最小和最大工作负载测试您的应用程序，以确定集群制定扩展策略和缓解可用性问题 shards/replicas 所需的确切数量。

  **[资源]：**
  + [注册可扩展目标](AutoScaling-Register-Policy.md)
  + [使用注册可扩展目标AWS CLI](AutoScaling-Scaling-Registering-Policy-CLI.md)