> 数据库 > Redis >

redis RDB和AOF两种持久化策略分析

持久化主要是做灾难恢复,数据恢复,当然也可以归类到高可用的一个环节中去。
如果把redis的持久化做好,备份和恢复方案做到企业级的程度,那么即使你的redis故障了,也可以通过备份数据,快速恢复,立即对外提供服务。
RDB持久化机制,对redis中的数据执行周期性的持久化
AOF机制是对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集
 
RDB默认是开启的,并且在配置文件中也已经配置好了合适的快照持久化策略。在redis.conf配置文件中

 
AOF默认是关闭的,把no 改成yes就算开启了AOF机制
 



 
 
现代操作系统中,写文件不是直接写入到磁盘,而是先写入到os cache,然后到一定时间执行fsync命令,再从os cache中写入到AOF文件中,这里就是配置fsync的执行周期,默认是每秒刷一次到AOF中


 
内存大小是一定的,到一定时候,redis会用缓存淘汰算法LRU自动将一部分数据从内存中清楚,AOF是存放每条写入命令的,所以会不断的膨胀,当大到一定的时候AOF做rewrite操作,rewrite操作会基于redis清除之后的内存中的数据
 
来重新构造一个AOF问及那,然后将就的文件跟删除。这里配置的就是redis的rewrite策略,一个是增加的量是原始量的百分比,一个是最小rewrite的规模。



 
rewrite操作是redis  的一个子进程来执行的,当redis的主进程和rewriter进程同时在写aof文件的时候,两者都会操作磁盘,而且rewrite往往会涉及大量的磁盘操作,这样就会造成主进程在写aof文件的时候有阻塞的情形,这个时候
no-appendfsync-on-rewrite 参数上来了,如果设置为no 是最安全的,不会丢数据,但是要容忍阻塞的问题。如果设置问yes,就相当于appendsync 设置为no,这说明没有进行磁盘操作,只是写入了缓冲区。因此也不会有阻塞,但是如果redis挂掉了,就会有数据丢失。
 
 
当然如果redis仅仅作为纯内存的缓存来用,可以禁止RDB和AOF所有的持久化机制。
通过RDB和AOF,都可以将redis内存中的数据给持久化到此品种,然后可以将这些数据备份到别的地方,云服务或者hdfs中
如果redis挂了,服务器上的内存和磁盘中的数据都丢了,可以从hdfs或这云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动redis,redis会自动根据持久化文件中的数据,去恢复内存中的数据,继续对外提供服务
(redis的RDB默认是开启的,AOF默认是关闭的,当两者都开启的时候,redis优先会通过AOF机制来恢复内存中的数据,因为AOF的数据更加完整)
 
RDB持久化机制的优点:
(1)RDB会生成多个数据文件,每个文件都代表了某一个时刻中redis的数据,非常时候做冷备(实际上是新的rdb文件会覆盖原来的文件,最终是一个文件)
RDB做冷备的优势是在最坏的情况下,提供数据恢复的时候,速度比AOF快(但是,当都开启的时候,会优先以AOF恢复,因为AOF的数据最全)
 
(2)RDB对redis的对外提供的读写影响非常小,可以让redis保持高性能
RDB每次写都是直接写redis内存,只在一定的时候,才会将数据写入磁盘中
AOF每次都是要写文件,虽然可以快速先写入os cache中,但是还是有一定的时间开销,速度肯定比RDB略慢一些。
(3)相对于AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速。
AOF存放的是指令日志,做数据恢复的时候,其实是要回放和执行所有的指令日志,来恢复内存中的所有数据
RDB就是一份数据日志,恢复的时候,直接加载到内存中即可
综上:RDB机制适合做冷备份。
 
RDB持久化机制的缺点:
 
(1)如果想要在redis故障时,尽可能小的丢失数据,RDB没有AOF好
 
(2)RDB每次在fork子进程来执行RDB快照数据文件的时候,如果数据文件特别大,可能会导致对客户端提供服务暂停数毫秒,或者甚至数秒。
所以一般不要让RDB的间隔太长,否则RDB的文件太大
 
AOF持久化机制的优点:
 
(1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒的数据。
每隔1秒就执行fsync,把os cache中的数据强制刷到磁盘中。redis进程挂了,最多丢掉1秒的数据。
 
(2)AOF日志文件以append-only模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,当然破损了也有修补命令来修复。
 
(3)AOF日志文件过大的时候,会出现后台重写操作,也不会影响客户端的读写,因为rewrite log的时候,老的日志文件还是照常写入,当新的merge后的日志文件ready的时候,再交换新老日志文件即可
 
(4)AOF日志文件的命令通过可读的方式进行记录。这个特性非常时候做灾难性的误删除的紧急恢复。例如某人不小心flushall清空了所有数据。只要这个时候后台rewrite还没有发生,就可以立即拷贝AOF文件,将最后一条flushall命令给删除了,然后再将AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。

 
AOF持久化机制的缺点:
 
(1)对于同一份数据来说,AOF日志文件通常比RDB快照文件要大
 
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,当然每秒一次的fsync,性能也还是很高的
 
(3)以前AOF恢复机制比较脆弱,出现过恢复后的数据跟之前不一致的情况,现在基于当前内存中数据进行指令的重新构建,这样健壮性会好很多。
 
(4)唯一比较大的缺点,就是做数据恢复的时候,会比较慢
 
最后要说:RDB和AOF都要开启,AOF保证数据不丢,作为数据恢复的第一选择,RDB做不同程度的冷备。

 
(责任编辑:IT)