一簡介:
rdb是redis持久化策略的選擇之一,讓我們來一探究竟
二 核心設計思路
核心思路:fork一個子進程,只有在父進程發生寫操作修改內存數據時,才會真正去分配內存空間,並復制內存數據,而且也只是復制被修改的內存頁中的數據,並不是全部內存數據,所以內存數據快照說法並不標准,應該來說是單位時間內改變的內存數據快照
三 CopyOnWrite(簡稱cow) 好處:
1、減少分配和復制資源時帶來的瞬時延遲;
2、減少不必要的資源分配,假如整體資源是10G,redis現有使用率是5G,那么fork一個子進程拷貝rdb到磁盤並不是5G,而是改變數據的大小
四 CopyOnWrite的缺點:
如果父子進程都需要進行大量的寫操作,會產生大量的分頁錯誤(頁異常中斷page-fault)
五 RDB參數
0 save 900 1 15分鍾->1 key
save 300 10 5分鍾->10 key
save 60 10000 1分鍾->1W key
1 rdbcompression 默認打開
2 rdbchecksum 默認打開
3 dbfilename dir 路徑 名稱 元數據 默認當前目錄下
六 需要注意點
1 rdb本身是二進制文件,不可手工進行讀取
2 rdb本身可以手動觸發 save(阻塞型) bgsave(非阻塞型)
3 rdb本身可以進行冷拷貝,在進行快照的過程中不會修改RDB文件,只有快照結束后才會將舊的文件替換成新的
4 rdb的恢復效率是遠遠高於aof的
5 rdb只有在單位時間內至少N個key改變才會生成快照
七 缺點
1 rdb沒辦法做到實時備份,會丟失掉最后一次快照之后的數據
2 rdb 的動作(生成快照,備份文件壓縮 checksum)都會消耗cpu資源,快照本身也會消耗內存資源
八 相關錯誤
ERROR error==redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
相關參數
stop-writes-on-bgsave-error 默認值YES 作用 當RDB持久化失敗時會阻止寫入,這是一種REDIS的RDB自我保護機制,當因為內存 OR 磁盤導致RDB持久化失敗時,redis會認為備份既然無法正常運行,就必須阻止操作,優先解決RDB生成問題 常出現在內存不夠(rdb也需要一部分內存) 磁盤問題(磁盤只讀 OR 磁盤已滿) 兩種情況,不建議放大RDB的快照時間