redis的两种持久化技术

ε祈祈猫儿з 提交于 2019-12-29 21:24:44

1、介绍:

 RDB持久化机制,是对redis中的数据执行周期性的持久化;
 AOF机制是对每条写入的命令作为日志,以append-only的模式写入到一个日志文件中,在redis重启的时候,将AOF日志中的数据重新加载到redis内存中去;

2、两种持久化方式的优缺点:

RDB模式优点:
  • RDB会生成多个数据文件,每个文件代表了某一时刻中redis中的数据,适合做冷备,可以将数据文件放到远程的安全存储上,如阿里云,以保证数据的安全;
  • RDB对redis对外提供的读写服务影响小,可以让redis保持高性能,主要是因为redis主进程只需要fork一个子进程,让子进程执行磁盘的IO操作来进行持久化即可;
  • 相比较AOF的持久化机制来说,基于RDB数据文件来重启或者回复redis进程,更加的快速,因为AOF做数据恢复的时候,要执行保存的所有的指令日志,而RDB恢复的时候,直接加载到内存中即可;
RDB模式的缺点:
  • 如果想在redis故障的时候,尽可能少的丢失数据,那么RDB没有AOF好,一般RDB快照文件都是隔5分钟或者更长的时间生成一次,在这段时间出现故障,会丢失5分钟或者更长时间的数据(最大的缺点);
  • RDB每次在fork子进程来执行RDB快照数据文件的时候,如果数据文件特别大,可能会导致redis客户端提供的服务暂停数毫秒或者几秒,对redis的性能可能会有影响;
AOF模式的优点:
  • AOF可以更好的保证数据的不丢失,一般每隔1秒通过后台线程执行一次fsync操作,最多丢失1秒钟的数据;
  • AOF日志文件以append-only模式写入,写入的性能很高,文件不易破损,及时破损也很容易修复;
  • AOF日志文件即使过大,出现后台重写操作,也不会影响客户端的读写。因为在rewrite log的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的merge后的日志文件ready的时候,再交换新老日志文件即可。
  • AOF日志文件的命令是以可读的方式进行记录的,适合误删除的紧急恢复;
AOF模式的缺点:
  • 对同一份数据来说,AOF日志文件通常比RDB文件更大;
  • AOF开启后,支持写的QPS会比RDB支持的写QPS低,但是性能还是很高的,如果设置成写一条数据就fsync一次,那么QPS就会很低,一般1秒钟同步一次;
  • 做数据恢复的时候,会比较慢;

3、工作流程

RDB持久化的流程:

 1)redis根据配置自己尝试去生成RDB文件
 2)主进程fork一个子进程出来
 3)子进程尝试将数据dump到临时的RDB快照文件中
 4)完成RDB快照文件的生成之后,就替换之前就得快照文件

配置RDB持久化:
vim redis.conf
save 60 1000

上面的意思是:每个60s,如果有1000个key发生了变更,那么就生成一个新的dump.rdb文件,文件为荣为当前redis内存中完整的数据快照,save可以设置多个检查点,没到一个检查点就会去检查下是否key的数量发生了变化,然后决定是否生成一个新的dump文件。

AOF持久化的流程:

1)redis主进程fork一个子进程
2)子进程基于当前内存总的数据,往一个新的临时AOF文件中写日志
3)redis主进程,接收到客户端新的写操作以后,在内存中写入日志,同时新的日志也继续写到旧的AOF文件中
4)子进程写完新的日志文件之后,redis主进程将内存中的新日志再次追加的新的AOF文件中
5)用新的日志文件替换掉旧的日志文件

配置AOF持久化:

AOF的持久化默认是关闭的,默认是打开RDB持久化。

vim redis.conf

打开redis.conf文件,找到appendonly,修改成

appendonly yes

AOF的rewrite机制:
redis内存中的数据有部分是会自动过期的,可是对应写到数据已经写到了AOF文件中,日志文件就一个会不断的变大,所以AOF会自动的在后台每隔一定的时间做rewrite操作,比如日志里已经存放了针对100w数据的写日志了; redis内存只剩下10万; 基于内存中当前的10万数据构建一套最新的日志,到AOF中; 覆盖之前的老日志; 确保AOF日志文件不会过大,保持跟redis内存数据量一致。
 在redis.conf中,根据实际修改rewrite配置:

vim redis.conf
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

配置文件的意思是:比如说上一次AOF rewrite之后,是128mb,然后就会接着128mb继续写AOF的日志,如果发现增长的比例,超过了之前的100%,256mb,就可能会去触发一次rewrite,但是此时还要去跟min-size,64mb去比较,256mb > 64mb,才会去触发rewrite

4、总结

  • RDB适合做冷备,但是会丢失过多的数据
  • 一般情况下,同时开启RDB和AOF这两种策略,保证数据的完整
  • 如果同时存在rdb文件和AOF文件,redis重启的时候,会优先使用AOF文件进行数据恢复,保证数据更加完整
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!