redis中RDB和AOF两种持久化方式的比较

1RDB持久化机制

就是我们俗称的备份,他可以在定期内对数据进行备份,将Redis服务器中的数据持久化到硬盘中;

文件格式是:dump.rdb

快照持久化通用的配置:

RDB持久化的工作流程:

  1. Redis根据配置自己尝试生成RDB快照文件;
  2. fork一个子进程出来;
  3. 子进程尝试将数据写到临时的RDB快照文件中;
  4. 完成RDB快照文件的生成之后,就替换之前旧的快照文件;

2AOF持久化机制

他会在执行写命令的时候,将执行的每条写命令以append-only的模式写入一个日志文件中存放在硬盘里面,后期恢复的时候,只需要重新执行一下这个写命令就可以了。类似于我们的MySQL数据库在进行主从复制的时候,使用的是binlog二进制文件,同样的是执行一遍写命令。在Redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集;

文件格式是:appendonly.aof

AOP持久化配置:

3、注意事项

  1. 这两种持久化的方式既可以单独的使用,也可以同时使用,具体选择哪种方式需要根据具体的情况进行选择。
  2. 如果我们想要Redis仅仅作为纯内存的缓存来用,那么我们可以禁止RDB和AOF所有的持久化机制;
  3. 通过RDB或AOF,都可以将Redis内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去。我们一般会选择非当前机器的磁盘文件,这样可以避免由于机器损坏等因素导致磁盘数据和内存数据全部丢失,一般具有一定的隔离性。比如说云盘,云服务等;
  4. 如果Redis挂了,服务器上的内存和磁盘上的数据都丢了,我们就可以从事先备份好的存放在云盘、云服务等地方的数据拷贝回来,放到指定的目录中,然后重新启动Redis,Redis就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务;
  5. 如果同时使用RDB和AOF两种持久化机制,那么在Redis重启的时候,会使用AOF来重新构建数据,因为AOF中的数据更加完整;
  6. 也可以通过save或者bgsave命令同步或异步指定RDB快照生成。
  7. AOF持久化,默认是关闭的,默认是打开RDB持久化;
  8. appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓;

二、RDB持久化机制的优点

1、RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中Redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去。比如说Amazon的S3云服务上去,在国内可以是阿里云的ODPS分布式存储上,以预定好的备份策略来定期备份Redis中的数据;

  1. RDB做冷备时会生成多个文件,每个文件都代表了某一个时刻的完整的数据快照;
  2. AOF也可以做冷备,只有一个文件,但是你可以,每隔一定时间,去copy一份这个文件出来;
  3. RDB做冷备,优势在哪儿呢?由Redis去控制固定时长生成快照文件的事情,比较方便; AOF,还需要自己写一些脚本去做这个事情,各种定时;
  4. RDB数据做冷备,在最坏的情况下,提供数据恢复的时候,速度比AOF快;

2、RDB对Redis对外提供的读写服务,影响非常小,可以让Redis保持高性能,因为Redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可;

  1. RDB每次写,都是直接写Redis内存,只是在一定的时候,才会将数据写入磁盘中;
  2. AOF,每次都是要写文件的,虽然可以快速写入os cache中,但是还是有一定的时间开销的,速度肯定比RDB略慢一些;

3、相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复Redis进程,更加快速;(为什么恢复的时候RDB比AOF快?)

  1. AOF,存放的指令日志,做数据恢复的时候,其实是要回放和执行所有的指令日志,来恢复出来内存中的所有数据的;
  2. RDB,就是一份数据文件,恢复的时候,直接加载到内存中即可;

结合上述优点,RDB特别适合做冷备份,冷备。

  • RDB持久化机制的缺点

1、如果想要在Redis故障时,尽可能少的丢失数据,那么RDB没有AOF好。一般来说,RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,这个时候就得接受一旦Redis进程宕机,那么会丢失最近5分钟的数据;

这个问题,也是RDB最大的缺点,就是不适合做第一优先的恢复方案,如果你依赖RDB做第一优先恢复方案,会导致数据丢失的比较多

2、RDB每次在fork子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒;

一般不要让RDB的间隔太长,否则每次生成的RDB文件太大了,对Redis本身的性能可能会有影响的;

  • AOF持久化机制的优点

1、AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据;

  1. 每隔1秒,就执行一次fsync操作,保证os cache中的数据写入磁盘中;
  2. Redis进程挂了,最多丢掉1秒钟的数据;

2、AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修;

3、AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。

  1. 当新的merge后的日志文件ready的时候,再交换新老日志文件即可。

4、AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据;

、AOF持久化机制的缺点

1、对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大;

2、AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的;

如果你要保证一条数据都不丢,也是可以的,AOF的fsync设置成没写入一条数据,fsync一次,那就完蛋了,Redis的QPS大降;

3、以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似AOF这种较为复杂的基于命令日志/merge/回放的方式,比基于RDB每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有bug。不过AOF就是为了避免rewrite过程导致的bug,因此每次rewrite并不是基于旧的指令日志进行merge的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

、RDB和AOF到底该如何选择

1、不要仅仅使用RDB,因为那样会导致你丢失很多数据;

2、也不要仅仅使用AOF,因为那样有两个问题:

  1. 你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快;
  2. 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug;;

3、综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复;


版权声明:本文为luoyang_java原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。