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 文件
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Redis持久化-AOF重写 - Python技术站