Redis databases And Append-only file
RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,对数据进行快照存储(Snapshot快照)。恢复时将快照文件直接读到内存中。
redis会单独创建(fork)一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化结束之后,用临时文件替换上一次持久化好的文件。整个过程中,主进程不进行IO操作,以确保性能,如需进行大规模数据恢复,且对数据完整性不敏感,那RDB更高效。
优点:恢复速度快。缺点:redis突然down掉,最后一次持久化的数据可能丢失。全量保存,当数据量大时,比较消耗性能。
部分配置:
save "" 禁用rdb备份策略
保存数据快照的频率(满足下面任何一个条件就触发产生一次快照)
save 900 1 900s内如果有1条是写入命令
save 300 10 300s内有10条写入
save 60 10000 60s 内有10000 个keys发生变化
dir var/lib/redis/6379/persistent/ rdb文件所在目录(备份时临时文件原持久化文件都放在这里,当备份结束用临时文件替换原文件)
stop-writes-on-bgsave-error yes 当备份进程(fork的子进程)出错时,主进程就停止接受新的写入操作,是为了保护持久化的数据一致性问题。
dbfilename dump.rdb 文件名称
rdbcompression yes 进行数据镜像备份时,是否压缩RDB文件
rdbchecksum yes 对RBD文件进行CRC64校验,利于保证文件正确性和完整性。读写RDB文件时会损失大约10%性能。
AOF:以日志的形式记录每一个写操作,只做增量追加不改写文件(rdb是全量替换),当服务器启动时会读取日志文件重新构建数据。
优点:备份机制更稳健,丢失数据概率低。缺点:恢复速度慢,每次写操作都同步,会造成性能压力。比rdb占用更多磁盘空间。
部分配置:
appendonly no 启用aof备份策略
appendfilename "appendonly.aof" AOF文件名
appendfsync everysec 对aof文件进行同步的频率。
always: 把每个写命令都立即同步到aof,很慢,但是很安全
everysec: 每秒同步一次,是折中方案
no: redis不处理交给OS来处理,非常快,但是也最不安全
aof-load-truncated yes 如果该配置启用,在加载时发现aof尾部不正确时,会向客户端写入一个log,但是会继续执行,如果设置为 no ,发现错误就会停止,必须修复后才能重新加载。
当Aof log增长超过指定比例时,重写log file
no-appendfsync-on-rewrite no 在重写aof命令期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示"不暂缓",新的aof记录仍然会被立即同步
auto-aof-rewrite-percentage 100 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,而确保保存最完整的数据。
auto-aof-rewrite-min-size 64mb 触发aof rewrite的最小文件尺寸
Linux内核参数:与aof重写相关的一个linux内核参数即是 overcommit_memory。(重写是后台重写,会分配子进程).默认值为0,建议设置为1,以保证子进程内存能够分配成功(即使用copyOnWrite内存分配策略,在没有set命令时会和主进程使用同一份内存),并且不会判断当前内存是否够用.
重写的意义:Redis会不断地将被执行的写命令记录到AOF文件中,AOF文件的体积会越来越大,极端情况下可能会撑满硬盘;
另外一个问题是,Redis在重启之后需要通过重新执行AOF文件记录的所有写命令来还原数据集,所以如果AOF文件的体积非常大,那么还原操作执行的时间就可能非常长。
--可以向Redis发送BGREWRITEAOF命令,BGREWRITEAOF命令会通过移除AOF文件中的冗余命令来重写AOF文件,使得AOF文件的体积变得尽可能的小。
Redis默认行为的意思是当AOF的体积大于64M,并且比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行BGREWRITEAOF命令。
注:如果同时用RDB和AOF两种持久化机制,在redis重启时,会用AOF来重新构建数据,因AOF中的数据更加完整