Redis的两种实例:缓存和持久化数据存储。

3

我希望设置两个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

资料来源:

2个回答

4

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

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

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


为什么持久化选项太过激进?我不想在这个 Redis 实例上丢失任何数据。那设置不合适吗?我不会在其中存储大量数据,它也不会是我的主要数据存储。至于缓存,我将更改保存为“1800 1”。那应该足够了。作为缓存,我不介意丢失一些数据。谢谢。 - Michael
设置是适当的,以避免丢失任何数据,但实际上代价太高。每个写操作都将导致同步fsync,从而导致Redis完全冻结数毫秒。在这些毫秒内,实例将变得完全无响应,不仅仅是对单个连接 - 对于所有连接都是如此。一般来说,这不是一个好主意。 - Didier Spezia

3
我完全同意@Didier的看法,这更像是一种补充而不是完整的答案。
首先请注意,Redis提供可调节的持久性 - 您可以使用RDB和/或AOF。虽然选择使用RDB作为持久性缓存非常合理,但我建议您考虑同时使用两者作为持久性存储。这将允许您基于快照(即备份)进行时点恢复,并通过AOF进行最后记录操作后的崩溃恢复。
对于持久性存储,您不希望将maxmemory设置为0(如果在conf文件中未注释掉,则默认值为0)。当设置为0时,Redis将使用操作系统提供给它的所有内存,因此随着数据集的增长,您将遇到操作系统杀死进程以释放内存的情况(这通常发生在您最不希望它发生的时候😉)。相反地,您应该使用一个真实的值,该值基于服务器拥有的RAM数量,并为操作系统留足够的空间。例如,如果您的服务器有16GB的RAM,根据经验法则,我会限制Redis使用不超过14GB。
但是有个问题。由于您已经阅读了有关Redis持久性的所有内容,您可能还记得Redis在写入数据到磁盘时会创建子进程。创建子进程会使内存消耗增加两倍以上(复制的副本+更改),因此如果使用数据持久性,您需要确保服务器有足够的空闲内存来容纳这一点。还要注意,在maxmemory计算中,您应该考虑其他可能消耗内存的事情,如复制和客户端缓冲区,具体取决于您和应用程序如何使用Redis。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接