概述

这篇讲的时AOF优化:

  • 4.0 redis 引入了混合AOF (也就是前面一段二进制快照数据,后面一段AOF 日志),优化的是AOF文件大,数据恢复速度慢的问题.

  • 5.0 以后默认开启混合AOF

  • 7.0 redis 加入MPAOF,这里优化的是AOF/混合AOF 备份过程中有新指令要追加写,新指令会被追加到主进程aof_rewrite_buf 和 通过管道将新指令发送给备份子进程的双双拷贝问题。

混合AOF

混合AOF 是什么?

  • 混合AOF 不是同时开启RDB + AOF

  • 混合AOF 是结合了RDB和AOF 二者优点的折中选择,就是AOF文件前半部分是RDB二进制数据快照,后半部分是混合AOF备份过程中新来的追加指令.

如何开启混合AOF?

  • 在redis.conf AOF 配置段中设置字段 aof-use-rdb-preamble 为yes 即可

# Redis can create append-only base files in either RDB or AOF formats. Using
# the RDB format is always faster and more efficient, and disabling it is only
# supported for backward compatibility purposes.
aof-use-rdb-preamble yes

混合AOF改进了什么?

这里先分析 RDB 和 AOF 优缺点再说改进,因为混合AOF 更像是 RDB 和 AOF 二者的折中方案:

RDB优缺点

优点:

  • 文件体积小

  • 文件载入恢复快

缺点:

  • 文件不支持追加,再备份的时候,如果有新数据增删改,不会加入备份

  • 海量数据场景下备份,如果中间有数据增删改,主进程就会需要去操作对应数据,这时候linux 就会进行cow 行为(拷贝当前进程的数据到新开的物理映射空间并修改页表指向),这个动作是耗费系统资源的(CPU、内存 ...)

  • 备份过程中或者未到备份触发时刻,如果宕机,数据会丢

AOF优缺点

优点:

  • 日志形式的备份文件,每执行一条指令就追加写一条指令到AOF文件中,数据一致性高(丢的数据不多)

  • 允许备份期间追加新指令到AOF文件中

缺点:

  • 文件大

  • 命令重放,恢复慢

改进了什么?

  • 二者折中,改进了AOF 文件体积大的问题

  • 改进了RDB备份期间不能追加写

  • 改进了AOF 数据恢复慢

混合AOF基本工作原理?

步骤见下:

  1. 主进程检查有无AOF进程正在备份,有返回,无创建AOF进程

  2. 获取全部数据,将加上混合AOF 文件头信息的二进制数据写入到新创建好的混合AOF 文件中;示例见下

  1. 将后续追加进来的指令冲aof_rewrite_buf 中写入内核,根据配置文件配置刷盘

  2. 将新文件替换旧文件

混合AOF 恢复数据流程

看图

MPAOF

MPAOF 是什么?

一个将混合AOF RDB 和 操作日志分离,解决AOF 日志重写时如果有新命令追加,需要同时写入新旧两个AOF 文件,不合理占用I/O 资源的问题的解决方案,这个方案再7.0 上引入.

如何开启MPAOF?

  • 配置方式和原 混合AOF 配置方式选项一样 (直接再原混合AOF上优化的)

MPAOF改进了什么?

又偷了下大佬的图

MPAOF基本工作原理?

看图

文件说明:

  • .base 文件:MPAOF 流程开始后,dump出的数据镜像文件,只存储二进制数格式镜像数据.

  • .incr 文件:重写AOF 文件过程中新追加过来的命令会追加写到改文件中

  • .manifest 文件: 清单文件,记录当前最新版本的.base、.incr 文件时那个,方便恢复时根据清单文件直接载入

MPAOF数据备份大致流程流程:

1.fork 出来的进程只重写.base 数据二进制镜像文件

2.如果有新命令需要追加,由主进程写入到aof_buf,再刷盘

3.更新清单文件,标志整个MPAOF 重写完成.

4.MPAOF 备份完成后,不会马上删除旧文件,而是将文件后缀加入.history 表示时旧 MPAOF 文件,稍后就才会被后台异步删除