2014-10-19 55 views
2

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

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

您认为如何?

我忘记了什么重要吗?

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 

来源:

回答

4

我觉得你的持久选项过于激进 - 但它主要取决于性质和您的数据量。

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

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

+0

为什么持久性选项过于激进?我不想丢失关于这个Redis实例的任何数据。那么这些设置是否合适?我不会存储很多内容,它不会成为我的主要数据存储区。 至于缓存,我会将保存更改为“1800 1”。这应该够了。作为缓存,我不介意丢失一些数据。谢谢 – Michael 2014-10-20 20:09:47

+0

这些设置适合避免丢失任何数据,但实际上价格太高。每次写操作都会导致同步fsync,导致Redis总冻结几毫秒。在这几毫秒内,实例将完全无响应,而不仅仅是单个连接 - 对于所有连接。一般来说,这不是一个好主意。 – 2014-10-20 22:03:45

2

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

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

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

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

相关问题