一,RDB
每隔一段時間,把內(nèi)存中的數(shù)據(jù)寫入磁盤的臨時文件,作為快照,恢復的時候把快照文件讀進內(nèi)存。
- 優(yōu)勢
- 每隔一段時間備份,全量備份
- 災備簡單,可以遠程傳輸
- 子進程備份的時候,主進程不會有任何io操作(不會有寫入修改或刪除),保證備份數(shù)據(jù)的的完整性
- 相對AOF來說,當有更大文件的時候可以快速重啟恢復
- 劣勢
- 發(fā)生故障是,有可能會丟失最后一次的備份數(shù)據(jù)
- 子進程所占用的內(nèi)存比會和父進程一模一樣,如會造成CPU負擔
- 由于定時全量備份是重量級操作,所以對于實時備份,就無法處理了。
RDB持久化流程

5.jpg
在做RDB持久化時會fork一個子進程,會與主進程共享一塊只讀內(nèi)存空間。
子進程在做數(shù)據(jù)鏡像持久化時不會應該主進程繼續(xù)接收請求。
當有新的寫入命令發(fā)到主進程,會觸發(fā)操作系統(tǒng)給一個copyonwrite操作,也就是只有父進程空間的各段的內(nèi)容要發(fā)生變化時,才會將父進程的內(nèi)容復制一份給子進程
二,AOF
- AOF特點
- 以日志的形式來記錄用戶請求的寫操作。讀操作不會記錄,因為寫操作才會存存儲。
- 文件以追加的形式而不是修改的形式。
- redis的aof恢復其實就是把追加的文件從開始到結(jié)尾讀取執(zhí)行寫操作。
- 優(yōu)勢
- AOF更加耐用,可以以秒級別為單位備份,如果發(fā)生問題,也只會丟失最后一秒的數(shù)據(jù),大大增加了可靠性和數(shù)據(jù)完整性。
- 以log日志形式追加,如果磁盤滿了,會執(zhí)行 redis-check-aof 工具
- 當數(shù)據(jù)太大的時候,redis可以在后臺自動重寫aof。當redis繼續(xù)把日志追加到老的文件中去時,重寫也是非常安全的,不會影響客戶端。
- AOF 日志包含的所有寫操作,會更加便于redis的解析恢復。
- 劣勢
- 相同的數(shù)據(jù),同一份數(shù)據(jù),AOF比RDB大
- 針對不同的同步機制,AOF會比RDB慢,因為AOF每秒都會備份做寫操作,這樣相對與RDB來說就略低。 每秒備份fsync沒毛病,但是的每次寫入就做一次備份fsync的話,那么redis的性能就會下降。
- AOF發(fā)生過bug,就是數(shù)據(jù)恢復的時候數(shù)據(jù)不完整,這樣顯得AOF會比較脆弱,容易出現(xiàn)bug,因為AOF沒有RDB那么簡單,但是AOF就不會根據(jù)舊的指令去重構(gòu),而是根據(jù)當時緩存中存在的數(shù)據(jù)指令去做重構(gòu),這樣就更加健壯和可靠了
- 配置不同的寫日志策略:
no:不同步
everysec:每秒備份,推薦使用
always:每次操作都會備份,安全并且數(shù)據(jù)完整,但是慢性能差
AOF寫入流程:
- 命令會先寫入一個AOF緩沖區(qū)
- 根據(jù)上面不同策略,將緩沖區(qū)同步到磁盤(默認每秒一次)
- 當AOF文件達到文件大小閾值會觸發(fā)AOF文件重寫,對AOF進行壓縮(閾值可配置)。
AOF文件重寫就是把Redis進程內(nèi)的數(shù)據(jù)轉(zhuǎn)化為寫命令同步到新的AOF文件。