redis中持久化 AOF和RDB详解

在一些企业中的项目当中,redis作为缓存使用的

但如果出现宕机的情况会怎么样,

redis是如何应对这些故障的,

在redis中AOF和RDB两种持久化的区别。

redis在项目当中一般是当作缓存使用的,作用于高并发,大流量的场景当中。而在redis中的持久化主要是作为灾难备份,数据恢复,也可以归并到高可用的一类当中。

比如当你的redis挂掉之后,redis就变得不可用了,这时候你要做的把redis变得可用,变得尽快可用。

重启redis,尽快让它对外提供服务,但是就像上一讲说,如果你没做数据备份,这个时候redis启动了,也不可用啊,数据都没了(这一点我们会在后面进行讲解,redis的数据到底是存在哪里的?)

当redis出现宕机之后,整个项目的请求就会只想mysql去了,这个时候就出现我们常说的缓存雪崩问题,mysql不可能承受整个项目当中高并发,自然而然就会挂掉。

mysql挂掉,你都没法去找数据恢复到redis里面去,redis的数据从哪儿来?从mysql来。。。

具体的完整的缓存雪崩的场景,还有企业级的解决方案,到后面讲

如果你把redis的持久化做好,备份和恢复方案做到企业级的程度,那么即使你的redis故障了,也可以通过备份数据,快速恢复,一旦恢复立即对外提供服务

redis的持久化,跟高可用,是有关系的,企业级redis架构中去讲解

redis两种缓存机制,AOF和RDB

RDB持久话是间接性的有一定时间段的进行数据备份

AOF是把每条写入命令当作日志方式进行记录,以append-onlyd的模式写入到日志文件当中,当redis重启时候,默认使用的AOF恢复机制。

两种方式都可以把内存的数据持久化到磁盘上面来,然后可以放到别的地方去,比如阿里云之内的进行冷备份。
如果redis挂了后,内存数据和持久化文件都丢失后,可以使用备份再云服务的文件恢复数据。

**在两种持久化机制都存在的时候,redis重启时候,会使用AOF来恢复数据,因为在AOF中数据会持久化更完整。

AOF和RDB机制的优缺点

rdb的优点:

  1.RDB会生成多个数据文件,每个文件都代表的是某一时刻的redis的数据,这种数据文件非常适合作为冷备份的存在,

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

   3相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速

RDB的缺点:

   1.如果说redis出现了宕机的时候,使用的是RDB持久化进行备份的,那么会出现一小段的时间的  数据丢失的问题,一般来说都是五分钟或者更长,如果出现宕机那么这五分钟的数据就会出现丢失。

   2. RDB每次frok出一条子进程来执行RDB文件的生成,如果说数据文件过大的,这个时间可能会稍微的导致客户端进行毫秒或者说是数秒的暂停。

AOF的优点:

  1.AOF可以更好的保证数据不丢失问题,一般来说我们都是设置  一秒钟,通过一个后台线程执行一次fsync操作,所以说数据最多丢失一秒钟。 

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

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


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

AOF的缺点:

1.通常来说,AOF的日志文件都会比RDB文件大。

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

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

6、RDB和AOF到底该如何选择

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

(2)也不要仅仅使用AOF,因为那样有两个问题,第一,你通过AOF做冷备,没有RDB做冷备,来的恢复速度更快; 第二,RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug

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

猜你喜欢

转载自www.cnblogs.com/malike/p/10440770.html