【问题标题】:2 instances of Redis: as a cache and as a persistent datastoreRedis 的 2 个实例:作为缓存和持久数据存储
【发布时间】:2014-12-14 16:15:08
【问题描述】:

我想设置 2 个 Redis 实例,因为我对要存储在 Redis 中的数据有不同的要求。虽然有时我不介意丢失一些主要用作缓存数据的数据,但我想避免在某些情况下丢失一些数据,例如当我使用将要执行的作业存储到 Redis 中的 python RQ 时。

我在下面提到了实现这一目标的主要设置。

你怎么看?

我是不是忘记了什么重要的事情?

1) Redis 作为缓存

# Snapshotting to not rebuild the whole cache if it has to restart
# Be reasonable to not decrease the performances
save 900 1
save 300 10
save 60 10000

# Define a max memory and remove less recently used keys
maxmemory X  # To define according needs
maxmemory-policy allkeys-lru
maxmemory-samples 5

# The rdb file name
dbfilename dump.rdb

# The working directory.
dir ./

# Make sure appendonly is disabled
appendonly no

2) Redis 作为持久数据存储

# Disable snapshotting since we will save each request, see appendonly
save ""

# No limit in memory
# How to disable it? By not defining it in the config file?
maxmemory

# Enable appendonly
appendonly yes
appendfilename redis-aof.aof
appendfsync always # Save on each request to not lose any data
no-appendfsync-on-rewrite no

# Rewrite the AOL file, choose a good min size based on the approximate size of the DB?
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 32mb

aof-rewrite-incremental-fsync yes

aof-load-truncated yes

来源:

【问题讨论】:

    标签: caching redis


    【解决方案1】:

    我认为您的持久性选项过于激进 - 但这主要取决于数据的性质和数量。

    对于缓存,使用 RDB 是个好主意,但请记住,根据数据量,将内存的内容转储到磁盘上是有代价的。在我的系统上,Redis 可以以 400 MB/s 的速度写入内存数据,但请注意,数据可能(或可能不会)被压缩,可能(或可能不会)使用密集数据结构,因此您的里程会有所不同。使用您的设置,支持大量写入的缓存将每分钟生成一个转储。您必须检查您拥有的音量,转储持续时间远低于该分钟(大约 6-10 秒就可以了)。实际上,我建议只保留 save 900 1 并删除其他保存行。甚至每 15 分钟转储一次也可能被认为过于频繁,尤其是如果您的 SSD 硬件会逐渐磨损。

    对于持久存储,您还需要定义 dir 参数(因为它还控制 AOF 文件的位置)。对于大多数用途来说, appendfsync always 选项太过分而且太慢,除非您的吞吐量非常低。您应该将其设置为每秒钟。如果即使在系统崩溃的情况下你也不能丢失一点数据,那么使用 Redis 作为存储后端并不是一个好主意。最后,您可能需要将 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 调整为 Redis 实例必须维持的写入吞吐量水平。

    【讨论】:

    • 为什么持久性选项过于激进?我不想丢失此 Redis 实例上的任何数据。那设置不合适吗?我不会在其中存储很多东西,它不会是我的主要数据存储。至于缓存,我将保存更改为“1800 1”。这应该足够了。作为缓存,我不介意丢失一些数据。谢谢
    • 设置适当以避免丢失任何数据,但在实践中,价格太高了。每个写入操作都会导致同步 fsync,从而导致 Redis 完全冻结几毫秒。在这些毫秒内,实例将完全没有响应,而不仅仅是单个连接 - 所有连接。一般来说,这不是一个好主意。
    【解决方案2】:

    我完全同意@Didier - 这更多的是补充而不是完整的答案。

    首先请注意,Redis 提供可调持久性 - 您可以使用 RDB 和/或 AOF。虽然您选择使用 RDB 作为持久性缓存非常有意义,但我建议您考虑将两者都用于持久性存储。这将允许您基于快照(即备份)进行时间点恢复,以及使用 AOF 将崩溃后恢复到上次记录的操作。

    对于持久存储,您希望将maxmemory 设置为 0(如果在 conf 文件中注释掉,这是默认值)。当设置为 0 时,Redis 将使用操作系统提供的尽可能多的内存,因此最终,随着数据集的增长,您将遇到操作系统将杀死它以释放内存的情况(这通常发生在您最不期望的时候; ))。相反,您应该使用基于服务器具有的 RAM 量以及足够的操作系统填充量的实际值。例如,如果您的服务器有 16GB 的 RAM,根据经验,我会限制 Redis 使用超过 14GB。

    但有一个问题。由于您已经阅读了有关 Redis 持久性的所有内容,您可能还记得 Redis 分叉以将数据写入磁盘。在子进程执行期间,分叉可以使内存消耗(分叉副本 + 更改)增加一倍以上,因此如果您使用数据持久性,您需要确保您的服务器有足够的可用内存来适应这种情况。另请注意,您应该在计算 maxmemory 时考虑其他潜在的内存消耗问题,例如复制和客户端缓冲区,具体取决于您和应用使用 Redis 的内容/方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2012-06-28
      • 2020-10-28
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多