AOF(Append Only File)
用 AOF 方法進行故障恢復的時候,需要逐一把操作日誌都執行一遍。如果操作日誌非常多,Redis 就會恢復得很緩慢,影響到正常使用。
RDB(Redis DataBase)
記憶體資料的全量快照,即把記憶體資料都儲存到磁碟。
save:主程式執行,會導致redis阻塞
bgsave:建立子程式進行RDB檔案寫入。
bgsave
同AOF的bgrewriteaof 一樣: fork子程式需要複製程式必要的資料結構,其中有一項就是複製記憶體頁表(虛擬記憶體和實體記憶體的對映索引表),這個複製過程會消耗大量CPU資源,複製完成之前整個程式是會阻塞的.
如果主程式僅做read操作,那麼父子程式互不影響。若主程式做write操作,那麼這塊資料會複製一份生成資料副本,主程式修改此副本資料。bgsave子程式則繼續將原有資料寫入RDB檔案
執行快照的頻率
bgsave不會重複執行
當一個bgsave操作正在執行時,不會啟動第二個bgsave子程式。這是因為Redis在執行bgsave操作時,會建立一個子程式來執行備份任務。如果一個bgsave操作已經開始,那麼Redis不會再啟動另一個bgsave操作,直到當前的bgsave操作完成或被取消。
頻率不好控制
要想盡可能恢復資料,快照間隔就必須得短,但是頻繁執行RDB備份,會有:
- 磁碟壓力
- 程式複製頻繁阻塞主程式
save選項可以設定多個儲存條件,只要其中任意一個條件被滿足,伺服器就會執行bgsave命令。例如,可以設定伺服器在900秒之內對資料庫進行了至少1次修改,或者在300秒之內對資料庫進行了至少30次修改,或者在60秒之內對資料庫進行了至少10000次修改等。
混合持久化
Redis 6.0和5.0預設開啟了aof-use-rdb-preamble。
當開啟混合持久化時,Redis會先使用RDB方式將現有記憶體中的資料寫入RDB檔案,然後再將緩衝區中的增量命令以AOF方式寫入AOF檔案。在完成寫入後,主程式會接收到通知,並將新的含有RDB和AOF兩種格式的檔案替換舊的AOF檔案。
這樣做的目的是同時利用RDB和AOF兩種持久化方式的優點,即快速恢復資料和保證資料的完整性。
恢復時,Redis會優先使用AOF日誌進行恢復。