目錄
一、RDB快照持久化 原理
二、RDB快照持久化配置(redis.conf):
三、觸發(fā)RDB備份:
1、自動備份,需配置備份規(guī)則:
2、手動執(zhí)行命令備份(save | bgsave):
3、flushall命令:
四、RDB的備份恢復:
五、RDB優(yōu)缺點:
以下配置以Redis-x64-3.2.100.zip為例,介紹下 RDB快照持久化?
一、RDB快照持久化 原理
1、單線程:?Redis 是單線程程序,這個線程要同時負責多個客戶端套接字的并發(fā)讀寫操作和內(nèi)存數(shù)據(jù)結(jié)構(gòu)的邏輯讀寫
。在服務線上請求的同時,Redis 還需要進行內(nèi)存快照,內(nèi)存快照要求 Redis 必須進行文件 IO 操作,這意味著單線程同時在服務線上的請求還要進行文件 IO 操作,文件 IO 操作會嚴重拖垮服務器請求的性能。還有個重要的問題是為了不阻塞線上的業(yè)務,就需要邊持久化邊響應客戶端請求。持久化的同時,內(nèi)存數(shù)據(jù)結(jié)構(gòu)還在改變,如果一個大型的 hash 字典正在持久化過程中,過來一個刪除請求如何處理?Redis 使用操作系統(tǒng)的多進程?COW(Copy On Write)
?機制來實現(xiàn)快照持久化。
2、fork(多進程):Redis 在持久化時會調(diào)用 glibc 的函數(shù) fork 產(chǎn)生一個子進程,快照持久化完全交給子進程來處理,父進程繼續(xù)處理客戶端請求。子進程剛剛產(chǎn)生時,它和父進程共享內(nèi)存里面的代碼段和數(shù)據(jù)段。
這是 Linux 操作系統(tǒng)的機制,為了節(jié)約內(nèi)存資源,所以盡可能讓它們共享起來。在進程分離的一瞬間,內(nèi)存的增長幾乎沒有明顯變化。
子進程做數(shù)據(jù)持久化,它不會修改現(xiàn)有的內(nèi)存數(shù)據(jù)結(jié)構(gòu),它只是對數(shù)據(jù)結(jié)構(gòu)進行遍歷讀取,然后序列化寫到磁盤中。但是父進程不一樣,它必須持續(xù)服務客戶端請求,然后對內(nèi)存數(shù)據(jù)結(jié)構(gòu)進行不間斷的修改。
這個時候就會使用操作系統(tǒng)的 COW 機制來進行數(shù)據(jù)段頁面的分離。數(shù)據(jù)段是由很多操作系統(tǒng)的頁面組合而成,當父進程對其中一個頁面的數(shù)據(jù)進行修改時,會將被共享的頁面復制一份分離出來,然后對這個復制的頁面進行修改。這時子進程相應的頁面是沒有變化的,還是進程產(chǎn)生時那一瞬間的數(shù)據(jù)。
隨著父進程修改操作的持續(xù)進行,越來越多的共享頁面被分離出來,內(nèi)存就會持續(xù)增長。但是也不會超過原有數(shù)據(jù)內(nèi)存的 2 倍大小
。另外一個 Redis 實例里冷數(shù)據(jù)占的比例往往是比較高的,所以很少會出現(xiàn)所有的頁面都會被分離
,被分離的往往只有其中一部分頁面。子進程因為數(shù)據(jù)沒有變化,它能看到的內(nèi)存里的數(shù)據(jù)在進程產(chǎn)生的一瞬間就凝固了,再也不會改變,這也是為什么 Redis 的持久化叫「快照」的原因。接下來子進程就可以非常安心的遍歷數(shù)據(jù)了進行序列化寫磁盤了。
這里之需要需要通知父線程,是因為父線程要做個記錄,保留最后一次持久化的時間。
二、RDB快照持久化配置(redis.conf):
1、指定備份文件的名稱:在redis.conf中,可以修改rdb備份文件的名稱,默認為dump.rdb。
2、指定備份文件存放的目錄:
在redis.conf中,rdb文件的保存的目錄是可以修改的,默認為Redis啟動命令所在的目錄
??
??
?3、stop-writes-on-bgsave-error:當磁盤滿時,是否關閉redis的寫操作,stop-writes-on-bgsave-error用來指定當redis無法寫入磁盤的話,是否直接關掉redis的寫操作,
推薦yes。默認配置如下:
4、rdb備份是否開啟壓縮:對于存儲到磁盤中的rdb快照文件,可以設置是否進行壓縮,如果是的話,redis會采用LZF算法進行壓縮。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能,推薦yes。
5、rdbchecksum:是否檢查rdb備份文件的完整性。存儲快照后,還可以讓redis使用CRC64算法來進行數(shù)據(jù)校驗,但是這樣做會增加大約10%的性能消耗,如果希望獲取最大的性能提升,可以關閉此功能。推薦yes。
三、觸發(fā)RDB備份:
有幾下幾種方法
1、自動備份,需配置備份規(guī)則:
可在redis.conf中配置自動備份的規(guī)則,save用來配置備份的規(guī)則,save格式如下:
save 秒鐘 寫操作次數(shù)
如設置20秒內(nèi)有最少有3次key發(fā)生變化則進行備份:save 20 3。?
默認規(guī)則為:默認是1分鐘內(nèi)修改了1萬次,或5分鐘內(nèi)需修改了10次,或30分鐘內(nèi)修改了1次。
2、手動執(zhí)行命令備份(save | bgsave):
有2個命令可以觸發(fā)備份,
(1)save
:save時只管保存,其他不管,全部阻塞,手動保存,不建議使用。
(2)bgsave
:redis會在后臺異步進行快照操作,快照同時還可以響應客戶端情況。
可以通過?lastsave
?命令獲取最后一次成功生成快照的時間(獲取到的是時間戳)。
動態(tài)停止RDB:?redis-cli config set save ""
?#save后給空值,表示禁用保存策略。
3、flushall命令:
執(zhí)行flushall命令,也會產(chǎn)生dump.rdb文件,但里面是空的,無意義。
四、RDB的備份恢復步驟:
1、先通過CONFIG GET dir
查詢rdb文件的目錄,這其實就是查的redis.conf
文件當中通過dir
設置的目錄
2、停止Redis
3、拷貝遷移的redis備份文件(dump.rdb)到CONFIG GET dir
查詢出來的指定目錄下。
cp dump.rdb dump.rdb
4、重新啟動redis服務
五、RDB優(yōu)缺點:
1、優(yōu)點:
(1)適合大規(guī)模數(shù)據(jù)恢復
(2)對數(shù)據(jù)完整性和一致性要求不高更適合使用
(3)節(jié)省磁盤空間
(4)RDB是一個緊湊壓縮的二進制文件,Redis加載RDB恢復數(shù)據(jù)遠遠快于AOF的方式
2、缺點:
(1)Fork的時候,內(nèi)存中的數(shù)據(jù)會被克隆一份,大致2倍的膨脹,需要考慮
(2)雖然Redis在fork的時候使用了寫時拷貝技術,但是如果數(shù)據(jù)龐大時還是比較消耗性能
(3)RDB方式數(shù)據(jù)沒辦法做到實時持久化/秒級持久化,在備份周期在一定間隔時間做一次備份,所以如果Redis意外down的話,就會丟失最后一次快照后所有修改
(4)RDB文件使用特定二進制格式保存,Redis版本演進過程中有多個格式的RDB版本,存在老版本Redis服務無法兼容新版RDB格式的問題
六、RBD簡單演示:
(1)打開一個redis連接,設置key
(2)刪除生成的rbd快照文件(我這里重命名了)
(3)重啟redis,再次打開一個客戶端,發(fā)現(xiàn)key不存在了
(4)還原之前的rbd文件,再次重啟redis,并打開連接,key恢復了文章來源:http://www.zghlxwxcb.cn/news/detail-809299.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-809299.html
到了這里,關于redis數(shù)據(jù)安全(二)數(shù)據(jù)持久化 RDB的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!