redis提供了rdb和aof兩種持久化機制,
rdb默認開啟,aof默認關閉。
當兩種持久化機制都開啟時,redis重啟恢復數據時加載aof持久化的appendonly.aof``文件,而rdb持久化的**dump.rdb**文件不會被加載到內存中。
開啟rdb,關閉aof
通過redis-cli SHUTDOWN這種方式停掉redis,這是一種安全的退出方式,redis會在退出的時候將內存中的數據立即生成一份完整的rdb快照。
通過kill -9殺死redis進程,這種方式會導致 redis異常退出,從而導致內存中的數據沒有到達save指定的檢查點,進而丟失內存中的數據。
開啟rdb,關閉aof,待 dump.rdb有數據后,再開啟aof
redis持久化 dump.rdb后,啟用aof持久化,再重啟 redis, redis只會加載aof持久化的 appendonly.aof文件,如果它不存在,那會創建一個新的空的文件,從而導致內存中丟失 dump.rdb的數據。
解決方式:停止 redis,關閉aof,重啟 redis,確保 dump.rdb數據恢復在內存中,使用命令行熱修改 redis配置的方式打開aof,此時 redis就會以aof持久化的形式將內存中的數據寫入 appendonly.aof文件,然后停止 redis,修改配置文件將aof手動打開。


情景:主從架構的 master關閉rdb和 aof持久化,slave作為 master的數據熱備
在采用 master-slave的水平擴展架構的時候,格外的需要注意: master必須要開啟持久化,不建議用slave節點作為 master節點的數據熱備。
我們知道主從復制的架構中,所有的寫操作交由 master負責,slave分擔讀的操作,slave中的數據是從 master同步過來的。假如 master的rdb和aof都關閉了,數據全部在內存中,那么 master宕機重啟時,發現本地沒有可以恢復的數據,導致 master內存數據為空,然后 master將空的數據集同步到slave節點,導致slave的數據全部清空。因此 master必須要開啟持久化!
即使我們采用高可用機制的哨兵模式,即 master宕機時,slave節點通過選舉轉變為 master節點,在這種情況下,可能哨兵模式還沒檢測到 master節點宕機, master節點就自動重啟了,因此還是可能導致所有slave節點數據清空。
原文鏈接:
