簡介
RDB是Redis用來進行持久化的一種方式掩完,是把當前內存中的數(shù)據集快照寫入磁盤盛末,也就是 Snapshot 快照
(數(shù)據庫中所有鍵值對數(shù)據)绵患。恢復時是將快照文件直接讀到內存里夷陋。
備份是如何執(zhí)行的
Redis會單獨創(chuàng)建(fork)一個子進程
來進行持久化
,會先將數(shù)據寫入到 一個臨時文件
中胰锌,待持久化過程都結束了骗绕,再用這個臨時文件替換上次持久化好的文件
。 整個過程中资昧,主進程是不進行任何IO操作
的酬土,這就確保了極高的性能 如果需要進行大規(guī)模數(shù)據的恢復,且對于數(shù)據恢復的完整性不是非常敏感格带,那RDB方式要比AOF方式更加的高效撤缴。RDB的缺點是最后一次持久化后的數(shù)據可能丟失
。
Fork
-
Fork
的作用是復制一個與當前進程一樣的進程叽唱。新進程的所有數(shù)據(變量屈呕、環(huán)境變量、程序計數(shù)器等) 數(shù)值都和原進程一致棺亭,但是是一個全新的進程虎眨,并作為原進程的子進程。 - 在Linux程序中侦铜,
fork()
會產生一個和父進程完全相同的子進程专甩,但子進程在此后多會exec系統(tǒng)調用,出于效率考慮钉稍,Linux中引入了寫時復制技術
涤躲。 - 一般情況父進程和子進程會共用同一段物理內存,只有進程空間的各段的內容要發(fā)生變化時贡未,才會將父進程的內容復制一份給子進程种樱。
RDB持久化流程
dump.rdb文件
在redis.conf
中配置文件名稱,默認為dump.rdb
俊卤,rdb文件的保存路徑嫩挤,也可以修改。默認為Redis啟動時命令行所在的目錄下消恍。
觸發(fā)方式
RDB 有兩種觸發(fā)方式岂昭,分別是自動觸發(fā)和手動觸發(fā)。
①狠怨、自動觸發(fā)
在 redis.conf 配置文件中的 SNAPSHOTTING 下约啊。
-
save
:這里是用來配置觸發(fā) Redis的 RDB 持久化條件邑遏,也就是什么時候將內存中的數(shù)據保存到硬盤。比如“save m n”恰矩。表示m秒內數(shù)據集存在n次修改時记盒,自動觸發(fā)bgsave(這個命令下面會介紹,手動觸發(fā)RDB持久化的命令)外傅。當然如果你只是用Redis的緩存功能纪吮,不需要持久化,那么你可以注釋掉所有的 save 行來停用保存功能萎胰∧朊耍可以直接一個空字符串來實現(xiàn)停用:save ""
默認如下配置:
save 900 1:表示900 秒內如果至少有 1 個 key 的值變化,則保存
save 300 10:表示300 秒內如果至少有 10 個 key 的值變化奥洼,則保存
save 60 10000:表示60 秒內如果至少有 10000 個 key 的值變化巷疼,則保存
-
stop-writes-on-bgsave-error
:默認值為yes。當啟用了RDB且最后一次后臺保存數(shù)據失敗灵奖,Redis是否停止接收數(shù)據嚼沿。這會讓用戶意識到數(shù)據沒有正確持久化到磁盤上,否則沒有人會注意到災難(disaster)發(fā)生了瓷患。如果Redis重啟了骡尽,那么又可以重新開始接收數(shù)據了。 -
rdbcompression
:默認值是yes擅编。對于存儲到磁盤中的快照攀细,可以設置是否進行壓縮存儲。如果是的話爱态,redis會采用LZF算法
進行壓縮谭贪。如果你不想消耗CPU來進行壓縮的話,可以設置為關閉此功能锦担,但是存儲在磁盤上的快照會比較大俭识。 -
rdbchecksum
:默認值是yes。在存儲快照后洞渔,我們還可以讓redis使用CRC64算法
來進行數(shù)據校驗套媚,但是這樣做會增加大約10%的性能消耗,如果希望獲取到最大的性能提升磁椒,可以關閉此功能堤瘤。 -
dbfilename
:設置快照的文件名,默認是dump.rdb
浆熔。 -
dir
:設置快照文件的存放路徑本辐,這個配置項一定是個目錄
,而不能是文件名。默認是和當前配置文件保存在同一目錄慎皱。 - 也就是說通過在配置文件中配置的
save
方式环葵,當實際操作滿足該配置形式時就會進行RDB 持久化
,將當前的內存快照保存在dir
配置的目錄中宝冕,文件名由配置的dbfilename
決定。
②邓萨、手動觸發(fā)
-
save
:該命令會阻塞當前Redis服務器地梨,執(zhí)行save命令期間,Redis不能處理其他命令缔恳,直到RDB過程完成為止宝剖。顯然該命令對于內存比較大的實例會造成長時間阻塞,這是致命的缺陷歉甚,為了解決此問題万细,Redis提供了第二種方式。 -
bgsave
:執(zhí)行該命令時纸泄,Redis會在后臺異步進行快照操作赖钞,快照同時還可以響應客戶端請求
。具體操作是Redis進程執(zhí)行fork操作創(chuàng)建子進程聘裁,RDB持久化過程由子進程負責雪营,完成后自動結束。阻塞只發(fā)生在fork階段衡便,一般時間很短献起。基本上 Redis 內部所有的RDB操作都是采用 bgsave 命令
,可以通過lastsave 命令獲取最后一次成功執(zhí)行快照的時間镣陕。
ps:執(zhí)行執(zhí)行 flushall
命令谴餐,也會產生dump.rdb文件,但里面是空的呆抑。
備份與恢復
- 可以先通過
config get dir
命令獲取redis 的安裝目錄岂嗓。 - 將備份文件 (dump.rdb) 移動到 redis 安裝目錄并啟動服務即可,redis就會自動加載文件數(shù)據至內存了理肺。Redis 服務器在載入 RDB 文件期間摄闸,會一直處于
阻塞
狀態(tài),直到載入工作完成為止妹萨。
看到如下標識年枕,說明加載成功:
RDB 的優(yōu)勢和劣勢
優(yōu)勢
- RDB是一個非常緊湊(compact)的文件,它保存了redis 在某個時間點上的數(shù)據集乎完。這種文件非常適合用于進行
備份和災難恢復
熏兄。 - 生成RDB文件的時候,redis主進程會
fork()
一個子進程來處理所有保存工作,主進程不需要進行任何磁盤IO操作摩桶。 - RDB 在恢復大數(shù)據集時的速度比
AOF
的恢復速度要快桥状。
劣勢
- RDB方式數(shù)據沒辦法做到實時持久化/秒級持久化。因為
bgsave
每次運行都要執(zhí)行fork
操作創(chuàng)建子進程硝清,屬于重量級操作辅斟,如果不采用壓縮算法(內存中的數(shù)據被克隆了一份,大致2倍的膨脹性需要考慮)芦拿,頻繁執(zhí)行成本過高(影響性能)士飒。 - RDB文件使用特定二進制格式保存,Redis版本演進過程中有多個格式的RDB版本蔗崎,存在老版本Redis服務無法兼容新版RDB格式的問題(版本不兼容)酵幕。
- 在一定間隔時間做一次備份,所以如果redis意外
down
掉的話缓苛,就會丟失最后一次快照后的所有修改(數(shù)據有丟失)芳撒。