一篇文章完全理解Redis持久化:RDB和AOF

一篇文章完全理解Redis持久化:RDB和AOF面试

为何须要持久化?
Redis对数据的操做都是基于内存的,当遇到了进程退出、服务器宕机等意外状况,若是没有持久化机制,那么Redis中的数据将会丢失没法恢复。有了持久化机制,Redis在下次重启时能够利用以前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的平常开发和运维都有很大帮助,也是在大厂面试常常被问到的知识点。Redis支持的两种持久化机制:
缓存

RDB:把当前数据生成快照保存在硬盘上。
AOF:记录每次对数据的操做到硬盘上。
接下来,咱们详细了解一下这两种持久化机制。

安全

RDB持久化
RDB(Redis DataBase)持久化是把当前Redis中所有数据生成快照保存在硬盘上。RDB持久化能够手动触发,也能够自动触发。
服务器

手动触发
save和bgsave命令均可以手动触发RDB持久化。
并发

save命令
执行save命令会手动触发RDB持久化,可是save命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务储存大量数据时,会形成较长时间的阻塞,不建议使用。
app

save
OK
运维

执行后,Redis的日志中记录:高并发

  • DB saved on disk
    bgsave命令

执行bgsave命令也会手动触发RDB持久化,和save命令不一样是:Redis服务通常不会阻塞。Redis进程会执行fork操做建立子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。Redis服务的阻塞只发生在fork阶段,通常状况时间很短。性能

bgsaveurl

Background saving started
执行后,Redis的日志中记录:

  • Background saving started by pid 2645
  • DB saved on disk
  • RDB: 0 MB of memory used by copy-on-write
  • Background saving terminated with success
    bgsave命令的具体流程以下图:

执行bgsave命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,若是存在就是直接结束。
Redis进程执行fork操做建立子线程,在fork操做的过程当中Redis进程会被阻塞。
Redis进程fork完成后,bgsave命令就结束了,自此Redis进程不会被阻塞,能够响应其余命令。
子进程根据Redis进程的内存生成快照文件,并替换原有的RDB文件。
子进程经过信号量通知Redis进程已完成。
自动触发
除了执行以上命令手动触发之外,Redis内部能够自动触发RDB持久化。自动触发的RDB持久化都是采用bgsave的方式,减小Redis进程的阻塞。那么,在什么场景下会自动触发呢?





在配置文件中设置了save的相关配置,如sava m n,它表示在m秒内数据被修改过n次时,自动触发bgsave操做。
当从节点作全量复制时,主节点会自动执行bgsave操做,而且把生成的RDB文件发送给从节点。
执行debug reload命令时,也会自动触发bgsave操做。
执行shutdown命令时,若是没有开启AOF持久化也会自动触发bgsave操做。
RDB优势
RDB文件是一个紧凑的二进制压缩文件,是Redis在某个时间点的所有数据快照。因此使用RDB恢复数据的速度远远比AOF的快,很是适合备份、全量复制、灾难恢复等场景。




RDB缺点
每次进行bgsave操做都要执行fork操做建立子常常,属于重量级操做,频繁执行成本太高,因此没法作到实时持久化,或者秒级持久化。

另外,因为Redis版本的不断迭代,存在不一样格式的RDB版本,有可能出现低版本的RDB格式没法兼容高版本RDB文件的问题。

AOF持久化
AOF(Append Only File)持久化是把每次写命令追加写入日志中,当须要恢复数据时从新执行AOF文件中的命令就能够了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。

AOF持久化流程
AOF流程以下图:

命令追加(append):全部写命令都会被追加到AOF缓存区(aof_buf)中。
文件同步(sync):根据不一样策略将AOF缓存区同步到AOF文件中。
文件重写(rewrite):按期对AOF文件进行重写,以达到压缩的目的。
数据加载(load):当须要恢复数据时,从新执行AOF文件中的命令。
文件同步策略
AOF持久化流程中的文件同步有如下几个策略:




always:每次写入缓存区都要同步到AOF文件中,硬盘的操做比较慢,限制了Redis高并发,不建议配置。
no:每次写入缓存区后不进行同步,同步到AOF文件的操做由操做系统负责,每次同步AOF文件的周期不可控,并且增大了每次同步的硬盘的数据量。
eversec:每次写入缓存区后,由专门的线程每秒钟同步一次,作到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。
触发文件重写
AOF持久化流程中的文件重写能够手动触发,也能够自动触发。



手动触发:使用bgrewriteaof命令。
自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage配置肯定自动触发的时机。auto-aof-rewrite-min-size表示运行AOF重写时文件大小的最小值,默认为64MB;auto-aof-rewrite-percentage表示当前AOF文件大小和上一次重写后AOF文件大小的比值的最小值,默认为100。只用前二者同时超过期才会自动触发文件重写。
AOF持久化配置
对AOF持久化的具体流程有了了解后,咱们来看一下如何配置AOF。AOF持久化默认是不开启的,须要修改配置文件,如:


appendonly改成yes,开启AOF

appendonly yes

AOF文件的名字

appendfilename "appendonly.aof"

AOF文件的写入方式

everysec 每一个一秒将缓存区内容写入文件 默认开启的写入方式

appendfsync everysec

运行AOF重写时AOF文件大小的增加率的最小值

auto-aof-rewrite-percentage 100

运行AOF重写时文件大小的最小值

auto-aof-rewrite-min-size 64mb
做者:万猫学社
出处:http://www.cnblogs.com/heihaozi/

相关文章
相关标签/搜索