Redis持久化

106 阅读5分钟

1.RDB

RDB持久化是把当前进程数据生成快照保存到硬盘的过程。RDB就是Redis DataBase的缩写

RDB文件生成过程

  1. 执行命令手动触发

    Redis提供了两个手动命令来生成RDB文件,分别是savebgsave

    save:在主线程中执行,会导致阻塞,对内存较大的实例会造成长时间阻塞,线上环境不建议使用

    bgsave:创建一个子进程,专门用于写入RDB文件,避免了主线程的阻塞,这也是Redis RDB文件生成的默认配置。

  2. Redis内部自动触发

    • 使用save相关配置,如:save m n,表示m秒内数据集存在n次修改时,自动触发bgsave

      image.png

    • 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点

    • 执行debug reload命令重新加载Redis时,也会自动触发save操作

    • 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave

bgsave的执行流程

为了快照而暂停写操作,肯定是不能接受的。Redis会借助操作系统提供的写时复制技术(Copy-On-Write,COW),在执行快照的同时,正常处理操作。

image.png

RDB的优缺点

优点

  • 紧凑的二进制文件,存储的是某个时间点上的数据快照,适用于备份,全量复制等场景
  • 恢复数据速度快

缺点

  • 没办法实时持久化/秒级持久化
  • 频繁执行成本过高
  • Redis版本演进过程中有多个格式的RDB版本,存在老版本无法兼容新版本RDB格式问题

2.AOF

以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。主要解决数据持久化的实时性,目前已经是Redis持久化的主流方式。

开启AOF功能需要设置配置:appendonly yes,默认不开启。

AOF的工作流程

主要是4个部分:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)

image.png

AOF为什么把命令追加到aof_buf中

Redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负载。先写入缓冲区aof_buf中,还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,可以在性能和安全性方面做出平衡。

Redis提供的多种AOF缓冲区同步文件策略,由参数appendsync控制。

image.png

always

同步写回:每个写命令执行完,立马同步地将日志写回磁盘;

everysec

每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;

no

操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘,通常同步周期最长30秒。

AOF重写机制

问题:

随着命令不断写入AOF文件,文件会越来越大

为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程。

重写后的AOF 文件为什么可以变小?有如下原因:

  • 进程内已经超时的数据不再写入文件
  • 旧的AOF文件含有无效命令,如set a 111、set a 222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
  • 多条命令可以合并为一个

AOF重写触发机制

  1. 手动触发

    直接调用bgrewriteaof命令

    image.png

  2. 自动触发

    根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参数确定自动触发的时机

    image.png

auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。

auto-aof-rewrite-percentage :代表当前AOF 文件空间(aof_currentsize)和上一次重写后AOF 文件空间(aof_base_size)的比值。

另外,如果在Redis进行AOF重写时,有写入操作,这个操作也会被写到重写日志的缓冲区。这样,重写日志也不会丢失最新的操作。

重启加载

AOF和RDB文件都可以用于服务器重启时的数据恢复,加载顺序为:

image.png

1,当AOF和RDB文件同时存在时,优先加载AOF

2,若关闭了AOF,加载RDB文件

3,加载AOF/RDB成功,redis重启成功

4,AOF/RDB存在错误,启动失败打印错误信息

3.RDB-AOF混合持久化

通过aof-use-rdb-preamble配置项可以打开混合开关,yes则表示开启,no表示禁用,默认是禁用的,可通过config set修改

image.png

该状态开启后,如果执行bgrewriteaof命令,则会把当前内存中已有的数据弄成二进制存放在aof文件中,这个过程模拟了rdb生成的过程,然后Redis后面有其他命令,在触发下次重写之前,依然采用AOF追加的方式。

image.png