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 文件
