Redis持久化知識點—RDB+AOF
寫在前面
Redis 是一個高效能分散式的key-value資料庫。它支援多種資料結構,並可應用於快取、佇列等多種場景下
前面已經寫過了關於Redis的叢集方式和穿透與雪崩:
本文主要深入瞭解RDB和AOF這兩種持久化的邏輯和原理,喜歡的朋友可以點點關注和轉發,寫得不對的也請大佬多多批評和指正,以期共同進步,謝謝啦。

Redis持久化知識點—RDB+AOF
RDB的原理
RDB持久化儲存即是將redis存在記憶體中的資料以快照的形式儲存在本地磁碟中
RDB持久化的優勢與劣勢
優勢
- 檔案實現的資料快照,全量備份,便於資料的傳輸.比如我們需要把A伺服器上的備份檔案傳輸到B伺服器上面,直接將rdb檔案拷貝即可.
- 檔案採用壓縮的二進位制檔案,當重啟服務時載入資料檔案,比aof方式更快.
劣勢
- rbd採用加密的二進位制格式儲存檔案,由於Redis各個版本之間的相容性問題也導致rdb由版本相容問題導致無法再其他的Redis版本中使用.
- 時效性差,容易造成資料的不完整性.因為rdb並不是實時備份,當某個時間段Redis服務出現異常,記憶體資料丟失,這段時間的資料是無法恢復的,因此易導致資料的丟失.
手動備份
手動備份通過 save 命令和 bgsave 命令。save是同步阻塞,而 bgsave 是非阻塞(阻塞實際發生在 fork 的子程序中)。因此,在我們實際過程中大多是使用bgsave命令實現備份
自動備份
- 修改配置項 save m n即表示在 m 秒內執行了 n 次命令則進行備份.
- 當Redis 從伺服器項主伺服器傳送複製請求時,主伺服器則會使用 bgsave命令生成 rbd 檔案,然後傳輸給從伺服器.
- 當執行 debug reload 命令時也會使用 save 命令生成rdb檔案.
- 當使用 shutdown 命令關掉服務時,如果沒有啟用 aof方式實現持久化則會採用bgsave的方式做持久化.同時shutdown後面可以加備份引數[nosave|save]
bgsave持久化儲存實現原理

Redis持久化知識點—RDB+AOF
- 執行bgsave命令,Redis父程序判斷當前是否存在正在執行的子程序,如果存在則直接返回.
- 父程序fork一個子程序(fork的過程中會造成阻塞的情況),這個過程可以使用info stats命令檢視latest_fork_usec選項,檢視最近一次fork操作小號的時間,單位是微妙.
- 父程序fork完之後,則會返回Background saving started資訊提示,此時fork阻塞解除.
- fork出的子程序開始根據父程序記憶體資料生成臨時的快照檔案,然後替換原檔案.使用lastsave命令可以檢視最後一次生成rdb的時間,對應info的rdb_last_save_time選項.
- 當備份完畢之後向父程序傳送完成資訊
RDB檔案儲存過程
- redis呼叫fork,現在有了子程序和父程序。
- 父程序繼續處理client請求,子程序負責將記憶體內容寫入到臨時檔案。由於os的寫時複製機制(copy on write)父子程序會共享相同的物理頁面,當父程序處理寫請求時os會為父程序要修改的頁面建立副本,而不是寫共享的頁面。所以子程序的地址空間內的資料是fork時刻整個資料庫的一個快照。、
- 當子程序將快照寫入臨時檔案完畢後,用臨時檔案替換原來的快照檔案,然後子程序退出
fork 操作會阻塞,導致Redis讀寫效能下降。我們可以控制單個Redis例項的最大記憶體,來儘可能降低Redis在fork時的時間消耗;或者控制自動觸發的頻率減少fork次數
AOF的原理
AOF的整個流程大體來看可以分為兩步,一步是命令的實時寫入(如果是 appendfsync everysec 配置,會有1s損耗),第二步是對aof檔案的重寫
- 命令寫入
- 追加到aof_buf
- 同步到aof磁碟
AOF的優缺點
優點
- 多種檔案寫入(fsync)策略.
- 資料實時儲存,資料完整性強.即使丟失某些資料,制定好策略最多也是一秒內的資料丟失.
- 可讀性強,由於使用的是文字協議格式來儲存的資料,可有直接檢視操作的命令,同時也可以手動改寫命令.
缺點
檔案體積過大,載入速度比rbd慢.由於aof記錄的是redis操作的日誌,一些無效的,可簡化的操作也會被記錄下來,造成aof檔案過大.但該方式可以通過檔案重寫策略進行優化.
AOF持久化儲存實現原理

Redis持久化知識點—RDB+AOF
- redis命令寫入,此時會將redis命令寫入aof_buf換從區.
- 緩衝區中資料根據備份策略實現寫入日誌檔案.
- 當aof的檔案越來越龐大,會根據我們的配置策略來實現aof的重寫,實現檔案的壓縮,減少體積.
- 當redis重新啟動時,在去重寫載入aof檔案,達到資料恢復的目的.
選擇AOF還是RDB進行資料的持久化
- 針對不同的情況來選擇,建議使用兩種方式相結合.
- 針對資料安全性、完整性要求高的採用aof方式.
- 針對不太重要的資料可以使用rdb方式.
- 對於資料進行全量備份,便於資料備份的可以採用rdb方式.