在使用redis时,都会配置相应的存储策略,以保证redis并不会由于意外挂掉,在短时间内重启时数据不会消失。
在当前的版本中,redis提供了bgsave和aof两种策略,本文主要描述了aof中的相关参数以及为什么这样是可以足够安全的。
appendonly:
开启aof特性,这个控制是否启用aof.
appendfilename:
写入文件的文件名。开启aof之后,每条命令(除读之外的命令),均会写入到文件中,这里即实际写入的文件.
appendfsync:
写入策略,默认值everysec,每秒写一次(调用flush)。
另外两个值,always | no,分别表示每次redis写命令之外就写文件,和由操作系统保证。
always对硬盘压力大,everysec是一个平衡值,no对硬盘压力最小,但调度由系统控制,丢失数据风险最大.
no-appendfsync-on-rewrite:
是否在后台写时同步单写,默认值no(表示需要同步).这里的后台写,表示后台正在重写文件(包括bgsave和bgrewriteaof.bgrewriteaof网上很多资料都没有涉及到。其实关掉bgsave之后,主要的即是aof重写文件了).
no表示新的主进程的set操作会被阻塞掉,而yes表示新的主进程的set不会被阻塞,待整个后台写完成之后再将这部分set操作同步到aof文件中。但这可能会存在数据丢失的风险(机率很小),
如果对性能有要求,可以设置为yes,仅在后台写时会异步处理命令.
auto-aof-rewrite-percentage:
aof文件增长比例,指当前aof文件比上次重写的增长比例大小。
aof重写即在aof文件在一定大小之后,重新将整个内存写到aof文件当中,以反映最新的状态(相当于bgsave)。
这样就避免了,aof文件过大而实际内存数据小的问题(频繁修改数据问题).
auto-aof-rewrite-min-size:
aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).
此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.
aof-load-truncated:
指redis在恢复时,会忽略最后一条可能存在问题的指令。
默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败.
Linux内核参数:
另外,与aof重写相关的一个linux内核参数即是 overcommit_memory。
即在进行重写时,如何分配子进程内存的问题。
(重写是后台重写,会分配子进程).默认值为0,建立设置为1,以保证 子进程内存能够分配成功(即使用copyOnWrite内存分配策略,在没有set命令时会和主进程使用同一份内存),并且不会判断当前内存是否够用.