Redis從入門到深入-Redis持久化-RDB(13)
1. 持久化簡介
1.1 什麼是持久化
利用永久性儲存介質將資料進行儲存,在特定的時間將儲存的資料進行恢復的工作機制稱為持久化。
1.2 為什麼要進行持久化
防止資料的意外丟失,確保資料安全性
1.3 持久化過程儲存什麼
- 將當前資料狀態進行儲存,快照形式,儲存資料結果,儲存格式簡單,關注點在資料
- 將資料的操作過程進行儲存,日誌形式,儲存操作過程,儲存格式複雜,關注點在資料的操作過程
2. RDB-啟動save
2.1 誰,什麼時間,幹什麼事情
- 誰:redis操作者(使用者)
- 什麼時間:即時(隨時進行)
- 幹什麼事情:儲存資料
2.2 Save指令
- 命令 (save)
- 作用(手動執行一次儲存操作)
2.3 save指令相關配置
-
db filename dump.rdb
悅明:設定本地資料庫檔名, 預設值為dump.rdb
經驗:通常設定為dump-埠號.rdb -
dir
說明:設定儲存.rdb檔案的路徑
經驗:通常設定成儲存空間較大的目錄中, 目錄名稱data -
rdb compression yes
說明:設定儲存至本地資料庫時是否壓縮資料, 預設為yes, 採用LZF壓縮
經驗:通常預設為開啟狀態, 如果設定為no, 可以節省CPU執行時間, 但會使儲存的檔案變大(巨大) -
rdb checksum yes
說明:設定是否進行RDB檔案格式校驗, 該校驗過程在寫檔案和讀檔案過程均進行
經驗:通常預設為開啟狀態,如果設定為no,可以節約讀寫性過程約10%時間消耗,但是儲存一定的資料損壞風險
2.4 save指令工作原理
客戶端1:127.0.0.1:6379>setkey 1 value 1
客戶端2:127.0.0.1:6379>setkey 2 value 2
客戶端3:127.0.0.1:6379>save
客戶端4:127.0.0.1:6379>get key 1
注意:save指令的執行會阻塞當前Redis伺服器, 直到當前RDB過程完成為止, 有可能會造成長時間阻塞, 線上環境不建議使用。
3. RDB-啟動bgsave
3.1 誰,什麼時間,幹什麼事情
- 誰:redis操作者(使用者) 發起指令; redis伺服器控制指令執行
- 什麼時間:即時(發起);合理的時間(執行)
- 幹什麼事情:儲存資料
3.2 bgsave指令
- 命令
bgsave
- 作用
手動啟動後臺儲存操作,但不是立即執行
3.3 bgsave指令工作原理
注意:bgsave命令是針對save阻塞問題做的優化,Redis內部所有涉及到RDB操作都採用bgsave的方式,save命令可放棄使用
3.4 bgsave指令相關配置
- dbfilename dump.rdb
- dir
- rdb compression yes
- rdb checksum yes
- stop-writes-on-bgsave-error yes
說明:後臺儲存過程中如果出現錯誤現象,是否停止儲存操作
經驗:通常預設為開啟狀態
4 RDB啟動-bgsave配置檔案
反覆執行儲存指令,忘記了怎麼辦?不知道資料產生了多少變化,何時儲存?
- 自動執行
- 誰:redis伺服器發起指令(基於條件)
- 什麼時間:滿足條件
- 幹什麼事情:儲存資料
4.1 save配置
- 配置
save <second> <changes>
-
作用
滿足限定時間範圍內key的變化數量達到指定數量即進行持久化
-
引數
second:監控時間範圍
changes:監控key的變化量 -
位置
在conf檔案中進行配置
-
範例
save 900 1
save 300 10
save 60 10000
4.2 save配置原理
注意:
- save配置要根據實際業務情況進行設定,頻率過高過低都會出現效能問題,結果可能是災難級的
- save配置中對於second與changes設定通常具有互補對應關係,儘量不要設定成包含性關係
- save配置啟動後執行的是bgsave操作
5. RDB三種啟動方式對比
6. RDB特殊啟動形式
- 全量複製
在主從複製中詳細講解 - 伺服器執行過程中重啟
debug <reload>
- 關閉伺服器時指定儲存資料
shutdown <save>
7. RDB優缺點
RDB優點
- RDB是一個緊湊壓縮的二進位制檔案, 儲存效率較高
- RDB內部儲存的是redis在某個時間點的資料快照, 非常適合用於資料備份, 全量複製等場景
- RDB恢復資料的速度要比A OF快很多
- 應用:伺服器中每X小時執行bg save備份, 並將RDB檔案拷貝到遠端機器中, 用於災難恢復。
RDB缺點
- RDB方式無論是執行指令還是利用配置, 無法做到實時持久化, 具有較大的可能性丟失資料
- bgsave指令每次執行要執行fork操作建立子程序, 要犧牲掉一些效能
- redis的眾多版本中未進行RDB檔案格式的版本統一,有可能出現各版本服務之間資料格式無法相容現象