Redis 持久化:RDB快照和AOF机制

什么是Redis持久化

持久化就是把内存中的数据写到磁盘中去,防止服务宕机了内存数据丢失

Redis的持久化机制

Redis提供两种持久化机制:RDB快照(默认)和AOF(机制)

RDB

RDB(Redis DataBase)是Redis中默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到磁盘中,会产生dump.rdb数据文件,可以通过配置文件中的save参数来定义快照的周期

原理: forkcowfork 是指 redis间隔一段时间会 fork 一个子进程,子线程将数据写到磁盘上一个临时RDB文件中,当子进程写完临时文件后,将原来的RDB替换掉,这样的好处是可以 cow(copy-on-wirte)

优点:

  • 方便持久化,只有一个文件 dump.rdb
  • 容灾性好,一个文件可以保存到安全的磁盘
  • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独的进程来进行持久化,主进程不会进行任何IO操作,保证 redis 的高性能

缺点:

  • 数据安全性低,RDB是间隔一段时间来进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失,所以这种方式更适合数据要求不严谨的时候用
  • 保存时间长,如果数据量很大,保存快照的时间会很长

AOF

AOF(Append-Only-File),是将 Redis 执行的每次写命令记录到单独的日志文件中,当重启 Redis 会重新将持久化的日志中文件恢复数据

原理: 将写命令添加到 AOF 文件(Append Only File)的末尾。使用AOF持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘

同步选项:

  • no: 并不能给服务器性能带来多大的提升,而且也会增加系统奔溃时数据丢失的数量
  • always: 严重减低服务器性能
  • everysec: 这个选项比较合适,可以保证系统奔溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响

随着服务器写请求的增多,AOF文件会越来越大。Redis提供了一种将AOF重写的特性auto-aof-rewrite,能够去除AOF文件中的冗余写命令

优点:

  • 数据安全,AOF 持久化可以配置 appendfsync 属性中的always,每进行一次写命令操作就记录到 AOF 文件中一次、
  • 一致性,通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题

缺点:

  • AOF 文件比 RDB 文件大,而且恢复速度慢
  • 数据集大的时候比 RDB 启动效率低

两者比较

  • AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据
  • AOF 比 RDB 更安全也更强大
  • RDB 性能比 AOF 好
  • 如果两个都配了优先加载 AOF

如何选择合适的持久化方式

一般来说两者都会配置。如果单独用 RDB 的话你会丢失很多数据,单独用 AOF,你数据恢复没有 RDB 来的快,如果系统出现问题的时候我们可以先用 RDB 恢复,然后用 AOF 补全数据。冷热备份一起用,才能保证高健壮性的系统