1. 程式人生 > 實用技巧 >Redis持久化-AOF重寫

Redis持久化-AOF重寫

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 檔案