跳至内容

为什么我的适用于 Valkey 的 ElastiCache 或 ElastiCache for Redis OSS 自主管理型集群的分片之间会出现内存不平衡?

2 分钟阅读
0

我的启用了集群模式的适用于 Valkey 的 Amazon ElastiCache 或 Amazon ElastiCache for Redis 自主管理型集群在各个分片的内存使用不均。

简短描述

默认情况下,启用集群模式的 Valkey 和 Redis OSS 集群会尝试在集群中的分片之间均匀分配缓存密钥空间。有关详细信息,请参阅如何在 Amazon ElastiCache for Redis 上使用集群模式

以下原因可能会导致内存使用不平衡,从而导致某些分片比其他分片存储更多的数据:

  • 密钥分配不均
  • 密钥过大
  • “热”密钥或分片
  • 哈希标签使用不均
  • 客户端输出缓冲区增加

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

密钥分配不均

如果您没有将哈希槽均匀地分布在各个分片上,则某些分片处理的密钥可能比其他分片多。要解决此问题,请重新平衡集群中的槽

**注意:**Slot rebalance(槽重新平衡)选项尝试在可用分片之间均匀分布 16384 个哈希槽。此选项不会根据内存使用量或每个分片中的数据量进行重新平衡。

某些密钥过大

如果某些密钥比其他密钥大得多,则托管这些密钥的分片的内存使用量可能会更高。要解决此问题,您可以将大密钥分成较小的密钥值对。或者,删除不必要的大密钥以释放空间。

要扫描数据集中的大密钥,请使用 valkey-cli --bigkeysvalkey-cli --memkeys 命令。有关详细信息,请参阅 Valkey 网站上的 Scanning for big keys

最佳做法是使用高效的密钥命名策略、数据结构和压缩技术来优化密钥的内存使用量

热密钥或分片

当您访问某些密钥比其他密钥更频繁时,负载分配不均,会给服务主机的内存利用率带来压力。经常访问的密钥被称为热密钥或热分片。

要查找热密钥,请运行 valkey-cli --hotkeys 命令来查看密钥访问模式以识别密钥。在某些情况下,单个热缓存密钥可以创建使缓存节点不堪重负的热点。热点会影响节点的 CPU、内存和网络资源。

**注意:**仅当 maxmemory-policy 设置为 *lfu 时,hotkeys 命令才起作用。

要解决此问题,请执行以下操作:

  • 垂直扩展您的集群并提供更多资源。
  • 将读取流量分散到只读副本。有关详细信息,请参阅 Valkey 网站上的 READONLY
  • 修改客户端应用程序以减少对密钥的写入量。

哈希标签使用不均

在启用集群模式的环境中,必须使用哈希标签在 Valkey 集群中实现多密钥操作。当您增加哈希标签的使用量时,一些哈希槽存储的密钥比其他的要多,分片之间的内存就会失衡。

要解决此问题,请查看密钥空间和哈希标签的使用情况,并将数据分散到更多哈希槽中。有关详细信息,请参阅 Valkey 网站上 Cluster specification 中的 Hash tags 部分。

客户端输出缓冲区增加

当客户端的命令产生输出的速度快于 Valkey 发送给客户端的输出速度时,客户端输出缓冲区就会增长并使用更多的内存。有关详细信息,请参阅 Valkey 网站上的 Output buffer limits

要确定缓冲区问题的原因,请连接到受影响的节点并运行 CLIENT LIST 命令来识别使用缓冲区空间的客户端。有关详细信息,请参阅 Valkey 网站上的 CLIENT LIST

要确定客户端输出缓冲区过高的原因,请查看输出中的以下关键参数:

  • obl: 输出缓冲区长度
  • omem: 输出缓冲区内存使用情况
  • tot-mem: 客户端使用的总内存

您还可以查看 Amazon CloudWatch 中的 DatabaseMemoryUsageCountedForEvictPercentageDatabaseMemoryUsagePercentage 指标。如果这两个指标之间的内存使用量存在显著差异,则内存使用的原因是客户端输出缓冲区。

**注意:**DatabaseMemoryUsagePercentage 指标还包括连接开销和客户端输出缓冲区使用量。

最佳实践

要减少内存不平衡问题,请遵循以下最佳实践。

配置 TTL 设置

为密钥设置适当的生存时间 (TTL) 值。当您配置适当的 TTL 值时,Valkey 节点会自动删除 TTL 耗尽的密钥并优化内存使用量。有关详细信息,请参阅 Valkey 网站上的 TTL

查看您的内存指标

最佳做法是定期查看分片中的以下关键内存指标,以尽早发现不平衡并采取主动措施:

  • **DatabaseMemoryUsagePercentage:**跟踪节点上的总体内存使用率。
  • **DatabaseMemoryUsageCountedForEvictPercentage:**要检测高缓冲区和开销使用率,请与 DatabaseMemoryUsagePercentage 进行比较。
  • **BytesUsedForCache:**监控缓存数据使用的实际内存。
  • **CurrItems:**跟踪存储在每个分片中的项目数量。
  • **SwapUsage:**跟踪主机上使用的交换量。
    **注意:**ElastiCache 通常会有一些 SwapUsage。正常使用不会导致延迟问题。如果 SwapUsage 超过 300 MB,请检查内存压力。有关详细信息,请参阅您需要预留多少内存?

升级您的节点

要处理大密钥和频繁访问模式,请暂时纵向扩展您的 ElastiCache 集群以提供额外的 CPU 和内存资源。

相关信息

如何检查自行设计的 ElastiCache for Redis 集群中的内存使用情况,并实施最佳实践来控制高内存使用量?

Valkey 网站上的 Key distribution model

Amazon ElastiCache update- Online resizing for Redis clusters

如何解决我的 ElastiCache 实例中交换活动增加的问题?

AWS 官方已更新 1 年前