Redis-持久化RDB和AOF

分类: Redis

RDB(Redis DataBase)

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。(redis会单独创建fork一个子进程来进程持久化,会先将数据写入到一个临时文件中,带持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的搞笑。RDB的缺点是最后一次持久化后的数据可能丢失)

如何触发,快照默认

15分钟有1个改变
5分钟有10个改变
1分钟有10000个改变
都会保存到硬盘

如何禁用?

在配置文件只要不设置任何save指令,或者给save传入一个空字符串参数也可以;
动态所有停止RDB保存规则的方法:redis-cli config set save ""

执行过flush all命令也会产生dump.rdb文件,但里面是空的,无意义。

如何恢复?

将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。CONFIG GET dir 获取目录

优势?

适合大规模的数据恢复;
对数据完整性和一致性要求不高;

劣势?

在一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改;
fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑;

总结

RDB是一个非常紧凑的文件;
RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要在做其他IO操作,所以RDB赤化方式可以最大化redis的性能;
与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些;
数据丢失风险大;
RDB需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致redis在一些毫秒级不能响应客户端请求

AOF(Append Only File)

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次完成数据的恢复工作。

Aof保存的是appendonly.aof文件,默认是关闭aof

Appendfsync

Always:同步持久化,每次发生数据变更会被立即记录到磁盘,性能差但数据完整性比较好
Everysec:出厂默认推荐,异步操作,每秒记录,如果一秒内宕机,有数据丢失
No

如何恢复?

将有数据的aof文件复制一份保存到对应目录,CONFIG GET dir 获取目录

异常恢复?

redis-check-aof --fix 异常aof文件.aof 进行修复
重启后重新加载

rewrite

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof
重写原理:AOFA文件持续增加而过大时,会fork出一条新进程来讲文件重写,(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
触发机制:redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大于64m时触发

优势?

每秒同步:appendfsync always 同步持久化,每次发生数据变更会被立即记录到磁盘,性能差但数据完整性比较好
每修改同步:appendfsync eveerysec 异步操作,每秒记录,如果一秒内宕机,有数据丢失
不同步:appendfsync no 从不同步

劣势?

相同数据集的数据而言,aof文件要远大于rdb文件,恢复速度慢于rdb
aof运行效率要慢于rdb,美妙同步策略效率好,不同步效率和rdb相同

总结

AOF文件是一个只进行追加的日志文件;
Redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写;
AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以redis协议的格式保存,因此AOF文件的内容非常非常容易被人读懂,对文件进行分析也很轻松;
对于相同的数据集来说,AOF文件的体积通常要大于RDB文件的体积;
根据所使用的fsync策略,AOF的速度可能会慢于RDB;

Which one?

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储;
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存没戏写的操作到文件末尾;
Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大;
只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不适用任何持久化方式。
同时开启两种持久化方式:redis重启的时候会优先载入AOF文件来恢复原始的数据,因为通常情况下AOF保存的数据集要比RDB文件保存的要完整。RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只用AOF?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有aof可能存在的bug,留着作为一个万一的手段。
性能建议:

图片1.jpg

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注


Warning: error_log(/www/wwwroot/codegulu.cn/wp-content/plugins/spider-analyser/#log/log-1811.txt): Failed to open stream: Permission denied in /www/wwwroot/codegulu.cn/wp-content/plugins/spider-analyser/spider.class.php on line 2969