Redis數據持久化策略
持久化策略之RDB
RDB:在指定的時間間隔,執行數據集的時間點快照。
實現類似照片記錄效果的方式,就是把某一時刻的數據和狀態以文件的形式寫到磁盤上,也就是讀快照。這樣一來即使故障宕機,快照文件也不會丟失,數據的可靠性也就能得到保證。這個快照文件就稱為RDB文件(dump.rdb)。其中,RDB就是Redis DataBase的縮寫。通俗點說就是在指定的時間間隔內將內存中的數據集快照寫入磁盤,也就是行話講的Snapshot內存快照,它恢復時再將硬盤快照文件直接讀回到內存里
RDB的持久化:6與7的配置是存在一定區別的
Redis 6.X中redis.conf中的配置快照部分,SNAPSHOTTING
Redis6.0.16 之前的配置情況,在Redis.conf配置文件中的SNAPSHOTTING下配置save參數,來觸發Redis的RDB持久化條件。比如save m n :表示m秒內數據集存在n次修改時,自動觸發bgsave
Redis 6.2以及7之后變化頻率發生了變化
如何利用dump文件進行數據恢復?
自動備份:
將備份文件(dump.rdb)移動到redis安裝目錄并啟動服務即可恢復數據。
備份成功后故意用flushdb清空redis,看看是否可以恢復數據?執行flushall/flushdb命令也會產生dump.rdb文件,但里面是空的,無意義。
物理恢復,一定服務和備份分機隔離
備注:不可以把備份文件dump.rdb和生產redis服務器放在同一臺機器,必須分開各自存儲,以防生產機物理損壞后備份文件也掛了。
手動備份:save與bgsave
redis提供了兩個命令來生成RDB文件,分別是save和bgsave(默認)
save
save命令在主程序中執行會阻塞當前redis服務器,直到持久化工作完成執行save命令期間,Redis不能處理其他命令,線上禁止使用
bgsave(默認)
redis會在后臺異步進行快照操作,不阻塞快照同時還可以響應客戶端請求,該觸發方式會fork一個子進程,由子進程復制持久化過程
fork是什么? 從linux角度看,fork()會產生一個和父進程完全相同的子進程,但子進程在此后多會exec系統調用,出于效率的考慮,盡量避免膨脹。
lastsave 可以通過lastsave命令獲取最后一次成功執行快照的時間
時間戳轉化
RDB的優點
優點總結
適合大規模的數據恢復、按照業務定時備份、對數據完整性和一致性要求不高、RDB文件在內存中的加載速度要比AOF快得多
RDB的缺點
缺點總結
在一定間隔時間做一次備份,所以如果redis意外down掉的化,就會丟失從當前至最近一次快照期間的數據,快照之間的數據會丟失
內存數據的全量同步,如果數據量太大會導致I/O嚴重影響服務器性能
RDB依賴于主進程的fork,在更大的數據集中,這可能會導致服務請求的瞬間延遲。fork的時候內存中的數據被克隆了一份,大致2倍的膨脹性,需要考慮。
數據丟失的案例
kill -9 模擬宕機
redis重啟恢復數據,查看數據是否丟失
如何檢測修復dump.rdb文件
哪些情況會觸發RDB快照??
1.配置文件中默認的快照配置
2.手動save/bgsave命令
3.執行flushall/flushdb命令也會產生dump.rdb文件,但里面是空白的
4.執行shutdown且沒有設置開啟AOF持久化
5.主從復制時,主節點自動觸發
如何禁用快照??
動態所有停止RDB保存規則的方法:
redis-cli config set save ""
配置文件快照禁用的方式
RDB優化配置項
相關命令
stop-writes-on-bgsave-error
默認yes。 如果配置成no,表示你不在乎數據不一致或者有其他的手段發現和控制這種不一致,那么在快照寫入失敗時,也能確保redis繼續接受新的寫請求
rdbcompression
默認yes 。 對于存儲到磁盤中的快照,可以設置是否進行壓縮存儲。如果是的話,redis會采用LZF算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能
rdbchecksum
rdb-del-sync-files