如何排查 Redis 集群提示“当所用内存大于 'maxmemory' 时不允许 OOM 命令”报错问题

数据库NoSQL数据库技术服务知识库
问题描述

在查询缓存数据库 Redis 集群时,客户端收到错误:“当所用内存大于 'maxmemory' 时不允许 OOM 命令”。此错误消息意味着什么,我该如何排查并修复此错误。

问题分析

缓存数据库 Redis 集群无法释放任何额外内存时,会发生 OOM 错误。 内存不足时,缓存数据库 Redis 会实施数据节点的参数配置的策略 maxmemory-policy。默认值 (volatile-lru) 会移出设置了过期时间的键(TTL 值),从而释放内存。缓存节点没有包含 TTL 值的任何键时,则会返回错误。

解决方案

要解决此错误并防止客户端收到“不允许 OOM 命令”错误消息,可执行以下一些组合操作: 这些解决方法的实际组合取决于您的具体使用案例。

1. 为节点上的键设置 TTL 值。

您可以为节点上的键设置 TTL 值。有关详细信息,请参阅 Redis set 命令。然后,默认 volatile-lru 内存管理策略会移出过期键以释放内存。 如果您设置了 TTL 值,还可以使用 volatile-ttl 设置。即从设置了过期时间的键中选出存活时间(TTL)最短的键进行删除,从而腾出空间。

2. 更新参数配置以使用其他 maxmemory-policy 设置。

将 Redis 实例参数配置maxmemory-policy 设置为以下其中一个值:

  • allkeys-lru:最近最少使用的键进行删除。
  • allkeys-random:随机选择键进行删除。
  • volatile-random:从设置了过期时间的键中随机选择进行删除。

此外,Redis 4.0 提供“LFU - 最不常用” 移出模式:

  • allkeys-lfu:访问次数最少的键进行删除。
  • volatile-lfu:从设置了过期时间的键中选择访问次数最少的键进行删除。

3. 手动删除一些现有键以释放内存。

您可以使用 DEL 命令删除现有键来释放内存。有关更多信息,请参阅 redis.io 网站上的 DEL key。 删除现有键只是临时解决 OOM 错误的方案。请务必也重新考虑您的内存管理策略。

4. 选择较大的实例规格。

缓存数据库 Redis 版提供了不同的实例规格和性能。您不能修改节点上的可用内存量。但您可以使用具有更多存储空间的较大实例规格。 请评估您的数据体量大小,并选择合适的规格类型。 调整实例规格以解决问题后,请务必也重新考虑您的内存管理策略。

如果您有其他问题,欢迎您联系火山引擎技术支持服务

30
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论