【问题标题】:How to save memory from unpopular/cold Redis?如何从不受欢迎/冷的 Redis 中节省内存?
【发布时间】:2020-08-21 01:59:24
【问题描述】:

我们有很多 Redis 实例,消耗 TB 的内存和数百台机器。

随着我们的业务活动起起落落,一些 Redis 实例不再那么频繁地使用——它们“不受欢迎”或“冷淡”。但是 Redis 把所有东西都存储在内存中,所以很多本应存储在廉价磁盘中的不常用数据却占用了昂贵的内存。

我们正在探索一种方法来从这些不受欢迎/冷的 Redis 中节省内存,以减少我们的机器使用量。

我们不能删除数据,也不能迁移到其他数据库。有什么方法可以实现我们的目标吗?

PS:我们正在考虑一些可以“混合”内存和磁盘的 Redis 兼容产品,即它将热数据存储在内存中,而将冷数据存储在磁盘中,并且使用有限的资源。我们知道 RedisLabs 的“Redis on Flash(ROF)”解决方案,但它使用的是 RocksDB,对内存非常不友好。我们想要的是一个非常受内存限制的产品。此外,ROF 不是开源的 :(

提前致谢!

【问题讨论】:

  • 您是否考虑过使用带有 TTL 的不受欢迎/冷密钥或根据业务需求创建驱逐策略?
  • "但是它使用的是 RocksDB,对内存非常不友好。" RedisLabs 对其进行了调整,使其不会“对内存不友好”
  • @Ersoy 我们将 Redis 视为数据库,而不是缓存,因此无法驱逐数据。
  • 您的应用程序是否实现了repository pattern?如果没有,那么您可能通过使 Redis 成为依赖项而将自己逼入绝境。来自 Redis 常见问题解答:“过去,Redis 开发人员尝试使用虚拟内存和其他系统来允许比 RAM 更大的数据集,但毕竟如果我们能做好一件事,我们会非常高兴:数据从内存提供,磁盘用于存储。因此,目前还没有为 Redis 创建磁盘后端的计划。毕竟,Redis 的大部分内容都是其当前设计的直接结果。”
  • @bayinamy,你能提供一些关于数据类型和你用来存储数据的 Redis 数据结构的信息吗?另外,不受欢迎/冷数据的访问模式是什么?将冷数据序列化为二进制格式(Kryo/Avro/ProtoBuf)并压缩的辅助集群怎么样?然后你可以在主集群中查找,如果它不可用,在辅助/不受欢迎/冷集群中查找?如果您的不受欢迎的数据很少被访问,这可能会起作用,因此可以在两次查找而不是一次查找时对性能造成影响。

标签: redis


【解决方案1】:

ElastiCache Redis 现在支持数据分层。除了将数据存储在内存中之外,数据分层通过在每个集群节点中利用成本较低的本地 NVMe SSD 为在 Redis 中存储数据提供了一种新的成本优化选项。它非常适合定期访问多达 20% 的整体数据集的工作负载,以及在访问 SSD 上的数据时可以容忍额外延迟的应用程序。有关数据分层的更多详细信息,请参阅here

【讨论】:

    【解决方案2】:

    您的问题可能会通过使用协调器方法来解决:不使用时缩小,需要时放大。

    实施很大程度上取决于您的基础架构,但基本要求是正确监控 Redis 实例的使用情况。 基于此,如果您在 Kubernetes 上运行,则可以利用 pod autoscaling

    否则,您可以实现 Consul 并使用 HAProxy 来处理关闭/启动逻辑。该策略的起点是article

    当然,如果 Reiner 使用交换的想法按预期的方式工作,那么它是一个快速的胜利!

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2015-07-29
      • 2017-05-30
      相关资源
      最近更新 更多