AOF持久化
AOF全稱append only file持久化:以獨立日誌的方式記錄每次
寫命令,重啓時再從新執行AOF文件中的命令達到恢復數據的目的:
AOF主要做用是解決了數據實時持久化的問題;
使用AOF
開始AOF須要設置appendonly yes,默認不開啓。
AOF文件名經過appendonlyname配置,默認文件名爲appendonly.aof:
AOF工做流程操做:命令寫入(append)、文件同步(sync)、文件重寫(rewrite)、重啓加載(reload):
- 全部寫入命令會追加到aof_buf緩衝區中
- AOF緩衝區根據對應的策略向硬盤作同步操做
- 隨着AOF文件愈來愈大,須要按期對AOF文件作重寫,達到壓縮目的
- 當Redis服務器重啓時,能夠加載AOF文件進行數據恢復。
命令寫入
- 採用文本協議格式具備更好的兼容性
- 開始AOF後,全部寫入命令都包含追加操做,直接採用協議格式,避免二次處理開銷
- 文本協議具備可讀性,方便直接修改和處理
- AOF經過追加到aof_buf緩衝區的方式,避免了直接追加到硬盤慢的問題,由於緩衝區時內存中的,相對於硬盤有更好的寫入速度。另外,Redis能夠提供多中緩衝區同步硬盤的策略;
文件同步
指緩存區數據同步到AOF文件的過程,有參數appendfsync控制;
- always:命令寫入aof_buf後調用系統fsync操做同步到aof文件
- everysec:命令寫入aof_buf後調用write操做,write完成後線程返回,fsync同步文件操做由專門線程每秒調用一次
- no:命令寫入aof_buf後,調用系統write操做,不對aof文件作fsync同步,同步硬盤操做由操做系統負責,一般同步週期爲最長30秒;
write操做:觸發延遲寫機制,Linux在內核提供頁緩存區用於提升硬盤IO性能,write操做在寫入系統緩衝區後直接返回,同步 硬盤草最依賴於系統調度機制;
fsync操做:針對單個文件操做,好比aof文件,作強制硬盤同步,fsync將阻塞直到寫入硬盤完成後返回,保證了數據持久化。
重寫機制
AOF文件愈來愈大,Redis提供了重寫機制壓縮文件體積。
AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到AOF文件的過程;
- 進程內已經超時的數據不在寫入文件
- 舊的AOF文件含有無效命令,重寫使用進程內數據直接生成,這樣新的AOF文件只保留最終數據的寫入命令;
- 多條寫命令能夠合併爲一個。爲了防止單條命令過大致使客戶端緩衝區溢出,對於list、set、hash、zset等類型操做,以64位元素爲界拆分爲多條。
AOF重寫後佔用更少的空間;
AOF重寫後文件更小,被Redis加載速度更快;
AOF重寫觸發過程:
- 手動觸發:調用bgrwriteaof命令
- 自動觸發:使用auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數肯定自動觸發時機;
auto-aof-rewrite-min-size:表示運行aof重寫時文件最小體積,默認64M
auto-aof-rewrite-percentage:表明當前aof文件空間和上一次重寫後aof文件空間的比例;
AOF重寫流程:
- 執行AOF重寫命令
- 父進程執行fork建立子進程,開銷等同於bgsave
- 主進程fork進程後,繼續響應其餘請求,全部寫命令依然寫入AOF緩衝區並根據appendfsync策略同步到硬盤,保證原有AOF機制正確性;
- 由fork操做運用寫時複製技術,子進程只能共享fork操做時的內存數據;因爲父進程依然響應命令,Redis使用「AOF重寫緩衝區」技術保存這部分數據,防止新的AOF文件生成期間丟失這部分數據;
- 子進程根據內存快照,按照命令合併規則寫入到新的AOF文件,須要控制每次寫入量,防止硬盤阻塞;
- 新的AOF文件寫入完成後,子進程發送信號給父進程,父進程更新統計信息
- 父進程把aof重寫緩衝區的數據寫入到新的aof文件
- 使用新的aof文件替換老文件,完成aof重寫;
重啓加載
- AOF持久化開啓且存在AOF文件時,優先加載aof文件
- aof關閉或者aof不存在時,加載rdb文件
- 加載aof/rdb文件成功後,redis啓動成功
- aof/rdb文件存在錯誤時,redis啓動失敗並打印錯誤信息
文件校驗
aof損壞時,使用redis-check-aof --fix命令進行修復,修復後使用diff -u對比數據的差別,找出丟失的數據,有些能夠人工修改補全。