简单了解Redis中的持久化机制

Author Avatar
GeniusFunny 11月 09, 2018
  • 在其它设备中阅读本文章

什么是持久化?为什么需要持久化?

持久化就是将内存中的数据模型转换为存储模型,更通俗的说,就是将数据保存到系统硬盘中。

Redis所有的数据都是存在内存中,一旦程序崩溃或重启,内存中的数据就会丢失,所以我们需要持久化。

RDB(默认开启)

介绍

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,适用于备份、全量复制等场景。

过程

  1. 执行bgsave命令,父进程判断当前是否有正在执行的子进程如AOF子进程,若有直接返回。
  2. 父进程执行fork操作创建子进程,fork操作会阻塞父进程。
  3. fork完成后,父进程处理其他命令。
  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对旧文件进行原子替换。
  5. 子进程发送信号通知父进程表示完成,父进程更新统计消息。

优点

  1. RDB是一个非常紧凑的二进制文件,保存着Redis在某个时间节点上的数据集,非常适合备份、全量复制等场景。
  2. RDB非常适用于灾难恢复,因为它只有一个文件并且非常紧凑,可以加密后传送到其他数据中心。
  3. 父进程保存RDB文件时仅仅需要花费fork一个子进程的时间,无需执行任何磁盘I/O操作。
  4. Redis加载RDB恢复数据远远快于AOF的方式。

缺点

  1. 因为RDB文件需要保存整个数据集的状态,花费数分钟的时间,所以一旦发生故障停机,可能会丢失数分钟的数据。
  2. 每次保存RDB时,Redis需要fork一个子进程,并由子进程进行数据持久化;如果数据集很庞大,fork()可能会非常耗时,造成服务器在短时间(毫秒级)内停止处理客户端;如果CPU比较紧张,fork过程可能长达整整一秒。

AOF

介绍

AOF持久化是以独立的日志记录每次写命令,Redis重启的时候执行AOF文件中的命令来恢复数据。

过程

  1. 所有写命令都会追加到AOF缓冲区。
  2. AOF缓冲区根据对应的策略向硬盘做同步操作。
  3. 随着AOF文件越来越大,需要定期对AOF文件进行重写以达到压缩的目的。

AOF缓冲区同步文件策略

可以配置Redis多久将数据同步到磁盘一次。

  • always: 每次有写命令追加到AOF缓冲区时就调用系统fsync操作同步到AOF文件。
  • everysec:命令写入AOF缓冲区后调用系统write操作,fsync同步文件操作由专门线程每秒调用一次。
  • no:命令写入AOF缓冲区后调用系统write操作,不对AOF文件做fsync操作,同步硬盘由系统负责,通常同步周期为30s。
AOF重写机制

AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。(因为重写AOF文件时,Redis会合并多条写命令、丢弃超时的数据、删除无效命令,所以重写后的AOF文件要小于旧文件)

优点

  1. 使用AOF持久化使得Redis更加耐久,AOF缓冲区同步文件策略可以使得Redis就算发生故障停机,也最多丢失1s的数据(实际上最多为2s)。
  2. AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以Redis协议的格式保存,文件内容易懂且容易分析、导出。

缺点

  1. AOF文件的体积通常大于RDB文件的体积。
  2. AOF的速度可能慢于RDB。