redis 提供了 和`aof`兩種持久化機制, + 預設開啟, 預設關閉。 當兩種持久化機制都開啟時, redis 重啟恢複數據時載入 持久化的 appendonly.aof rdb dump.rdb` 文件不會被載入到記憶體中。 開啟rdb,關閉aof 通過==redis cli== 這種方式停掉 ...
redis提供了rdb
和aof
兩種持久化機制,
rdb
預設開啟,aof
預設關閉。
當兩種持久化機制都開啟時,redis重啟恢複數據時載入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節點數據清空。
原文鏈接: