Redis持久化-AOF重寫
阿新 • • 發佈:2020-08-24
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
- 由於 fork 操作採用寫時複製技術,子程序只能共享fork 操作時的記憶體資料,由於父程序依然響應命令,redis 使用
aof 重寫緩衝區
儲存這部分新資料,防止aof檔案生成期間這部分資料的丟失。
- 子程序根據記憶體快照,按照命令合併規則寫入到新的 aof 檔案
- 新 aof 檔案 寫入完成之後,子程序通知 父程序,父程序更新統計資訊
- 父程序把 aof 重寫緩衝區的資料寫入 新的 aof 檔案
- 使用 新 aof 檔案替換 舊的 aof 檔案