1.概述

对重复冗余过期的明命令进行精简,创建新的AOF文件,覆盖旧的AOF文件

原生AOF AOF重写

set hello world

set hello jack

set hello zhangsan

incr count

incr count

rpush mylist a

rpush mylist b

rpush mylist c

过期数据

set hello zhangsan

set count 2

rpush mylist a b c

 

 

 

 

 

 

 

 

 

 

 

 

 

2.AOF重写的作用

减少磁盘占用量

加速恢复速度

 

3.AOF重写配置

配置名 含义
auto-aof-rewrite-min-size  AOF文件重写需要尺寸
auto-aof-rewrite-percentage AOF文件增长率

 

 

 

 

 

4.AOF重写统计

统计名 含义
aof_current_size AOF当前尺寸(单位:字符)
aof_base_size AOF上次启动和重写的尺寸

 

 

 

 

 

5.AOF重写触发机制

机制 解释
aof_current_size > auto-aof-rewrite-min-size 当前AOF尺寸超过最小重写需要的尺寸时
aof_current_size-aof_base_size/aof_base_size > auto-aof-rewrite-percentage AOF文件增长率超过多少时

 

 

 

 

6.原理

  • 执行 aof 重写请求
  • 如果当前进程正在执行 aof 重写,请求不执行并返回如下响应
  • ERR Background append only file rewriting already in process
  • 如果当前正在执行 bgsave ,重写命令等待 bgsave 完成后执行 ,返回如下响应
  • Background append only file rewriting shceduled
  • 父进程执行 fork 创建子进程,开始等同于bgsave过程
  • 父进程 fork 操作完毕之后,依然响应其他命令,所有修改命令依然写入 aof 缓冲区,并根据 appendfsync策略同步到硬盘,保证原有 aof 机制的有效性。
  • 由于 fork 操作采用写时复制技术,子进程只能共享fork 操作时的内存数据,由于父进程依然响应命令,redis 使用 aof 重写缓冲区 保存这部分新数据,防止aof文件生成期间这部分数据的丢失。
  • 子进程根据内存快照,按照命令合并规则写入到新的 aof 文件
  • 新 aof 文件 写入完成之后,子进程通知 父进程,父进程更新统计信息
  • 父进程把 aof 重写缓冲区的数据写入 新的 aof 文件
  • 使用 新 aof 文件替换 旧的 aof 文件