【Redis】2种持久化方式的特性和工作原理

77 阅读5分钟

Redis持久化是什么?

Redis是内存数据库,宕机以后内存数据会全部丢失,当Redis数据用作DB时,为了保证数据完整性,需要一个完整的数据文件,在系统重新启动时,从这个数据文件中将数据加载进Redis中,从而保证数据完整性。

Redis如何进行持久化?

官方文档上Redis对持久化存储的支持明确的就只有两种方案:RDB和AOF。

RDBRBD(Redis DataBase)

指定的时间间隔,记录数据集的时间点快照。

实现方式

在指定的时间间隔内将内存中的数据集快照(Snapshot)写入磁盘(dump.rdb文件),恢复时,再将硬盘的快照文件直接读回内存中。

触发条件:

可以手动触发和自动触发

自动触发:

redis.conf文件中配置,save seconds changes

多少秒内数据变了多少则执行Save,可以配置多个条件,满足其中一个条件就会触发生成快照dump.rdb文件。

手动触发:

Redis提供2个命令生成RDB文件,分别是save和bgsave。

save:会阻塞当前Redis服务器,直到持久化完成,redis不能处理其他命令。

bgsave:后台异步进行快照操作,不阻塞客户端请求,会fork一个子进程,由子进程进行持久化。

bgsave执行流程: redis-x-rdb-1.png

  1. 客户端接收或自动触发bgsave命令
  2. 主进程判断是否存在正在执行的子进程,存在直接返回
  3. 不存在子进程, 则fork一个新的子进程持久化数据,fork命令执行时是阻塞的,fork完成后,主线程可以执行其他操作
  4. 子进程将数据写入临时rdb文件
  5. 快照数据写入完成,替换旧的rdb文件
  6. 子进程发送信号给主线程,通知rdb持久化完成,主进程更新相关的统计信息

bgsave数据一致性问题:

主线程fork出一个子线程后(fork时间点),在子线程执行数据写入rdb文件的时候,父线程接收到了数据修改命令(修改时间点),修改了数据后,子线程持久化到了这个key,那么子线程持久化的数据是fork时间点还是持久化时间点?

-- 答案是fork时间点。RDB中的核心思路是Copy-on-Write,来保证在进行快照操作的这段时间,需要压缩写入磁盘上的数据在内存中不会发生变化。在进行bgsave时,主线程在收到修改命令时,将原数据复制一份副本,fork线程持久化的是副本数据,这样保证了持久化数据都是同一个时间点。

RDB优缺点

优点:

  • RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积小
  • fork子进程进行持久化,父进程不需要IO操作,性能高
  • 直接加载数据,数据恢复快

缺点:

  • 最近一次持久化后的数据可能会丢失

总结:不适合实时持久化,适合备份、全量复制等场景。

AOF(APPEND ONLY FILE)

以日志的形式来记录每个写操作(先写内存,后写日志)

Redis将执行过的所有命令都记录下来(写操作)追加到文件中(appendonly.aof文件),当Redis重启时,根据日志文件的内容将写操作重新执行一次,从而完成数据恢复。

配置方式:redis.conf文件中 appendonly yes

执行流程: download.png

  1. 客户端接收到命令,将数据写入内存
  2. 将命令写入aof文件缓区
  3. 根据缓存区三种刷盘策略将命令写入磁盘AOF文件
  4. AOF重写,避免文件膨胀
  5. 重启时,从AOF加载数据

三种刷盘策略

配置项刷盘时机优点缺点
Always同步写回:每个写命令执行完,立马同步地将日志写回磁盘可靠性高,数据基本不丢失性能差
Everysec每秒写回:每隔一秒把缓冲区中的内容写入磁盘性能适中可能丢失1秒数据
No操作系统控制的写回:操作系统决定何时将缓冲区内容写回磁盘性能高宕机丢失较多数据

AOF优缺点:

优点:

  • 数据安全性高

缺点:

  • 影响性能
  • 重启后数据恢复慢

RDB和AOF混合持久化方式(4.0版本)

混合持久化并不是一种全新的持久化方式,而是对已有方式的优化。混合持久化只发生于 AOF 重写过程。

AOF重写问题:

AOF文件会记录每个写命令,随着时间越来越长,AOF文件会变得越来越大。

使用了混合持久化,重写后的新 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。

这样不用很频繁地执行bgsave,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。

混合持久化中数据恢复流程

redis-x-aof-5.png

  • redis重启时,如果开启了aof,那么就优先加载aof文件
  • 若aof文件不存在,加载rdb文件
  • 如果都不存在,redis直接启动成功

那么为什么会优先加载AOF呢?因为AOF保存的数据更完整。

总结

  1. RBD文件是一个快照,优点是文件体积小,数据恢复快,缺点易丢失数据。
  2. AOF文件是一个追加的文件,优点是数据不易丢失,缺点是文件体积大,影响性能
  3. 生产环境推荐使用混合持久化

最后

本文是Redis系列的第三篇,这个系列会系统全面的梳理Redis的知识体系,如果有遗漏或者错误,欢迎留言沟通交流。

如果你都看到这了,在文章左侧有个点赞按钮,点赞支持弥金吧。