Redis支持RDB和AOF兩種持久化機制涧团,持久化功能有效地避免因進程退出造成的數(shù)據(jù)丟失問題,當下次重啟時利用之前持久化的文件即可實現(xiàn)數(shù) 據(jù)恢復经磅。理解掌握持久化機制對于Redis運維非常重要
1.RDB持久化
RDB持久化是把當前進程數(shù)據(jù)生成快照保存到硬盤的過程泌绣,觸發(fā)RDB持久化過程分為手動觸發(fā)和自動觸發(fā)
1)觸發(fā)機制
手動觸發(fā)分別對應save和bgsave命令
·save命令:阻塞當前Redis服務器,直到RDB過程完成為止预厌,對于內(nèi)存 比較大的實例會造成長時間阻塞阿迈,線上環(huán)境不建議使用
·bgsave命令:Redis進程執(zhí)行fork操作創(chuàng)建子進程,RDB持久化過程由子 進程負責轧叽,完成后自動結束苗沧。阻塞只發(fā)生在fork階段刊棕,一般時間很短
2)自動觸發(fā)RDB的持久
1)使用save相關配置,如“save m n”待逞。表示m秒內(nèi)數(shù)據(jù)集存在n次修改 時甥角,自動觸發(fā)bgsave。
2)如果從節(jié)點執(zhí)行全量復制操作识樱,主節(jié)點自動執(zhí)行bgsave生成RDB文件并發(fā)送給從節(jié)點嗤无,更多細節(jié)見6.3節(jié)介紹的復制原理。
3)執(zhí)行debug reload命令重新加載Redis時牺荠,也會自動觸發(fā)save操作翁巍。
4)默認情況下執(zhí)行shutdown命令時,如果沒有開啟AOF持久化功能則 自動執(zhí)行bgsave休雌。
bgsave是主流的觸發(fā)RDB持久化方式
1)執(zhí)行bgsave命令灶壶,Redis父進程判斷當前是否存在正在執(zhí)行的子進 程,如RDB/AOF子進程杈曲,如果存在bgsave命令直接返回驰凛。
2)父進程執(zhí)行fork操作創(chuàng)建子進程,fork操作過程中父進程會阻塞担扑,通 過info stats命令查看latest_fork_usec選項恰响,可以獲取最近一個fork操作的耗時,單位為微秒
3)父進程fork完成后涌献,bgsave命令返回“Background saving started”信息并不再阻塞父進程胚宦,可以繼續(xù)響應其他命令。
4)子進程創(chuàng)建RDB文件燕垃,根據(jù)父進程內(nèi)存生成臨時快照文件枢劝,完成后 對原有文件進行原子替換。執(zhí)行l(wèi)astsave命令可以獲取最后一次生成RDB的 時間卜壕,對應info統(tǒng)計的rdb_last_save_time選項您旁。
5)進程發(fā)送信號給父進程表示完成,父進程更新統(tǒng)計信息轴捎,具體見 info Persistence下的rdb_*相關選項鹤盒。
RDB文件的處理
保存:RDB文件保存在dir配置指定的目錄下,文件名通過dbfilename配 置指定侦副≌炀猓可以通過執(zhí)行config set dir{newDir}和config set dbfilename{newFileName}運行期動態(tài)執(zhí)行,當下次運行時RDB文件會保存到新目錄秦驯。
RDB的優(yōu)缺點
RDB的優(yōu)點:
·RDB是一個緊湊壓縮的二進制文件率触,代表Redis在某個時間點上的數(shù)據(jù) 快照。非常適用于備份,全量復制等場景葱蝗。比如每6小時執(zhí)行bgsave備份, 并把RDB文件拷貝到遠程機器或者文件系統(tǒng)中(如hdfs)细燎,用于災難恢復两曼。
·Redis加載RDB恢復數(shù)據(jù)遠遠快于AOF的方式。
RDB的缺點:
·RDB方式數(shù)據(jù)沒辦法做到實時持久化/秒級持久化玻驻。因為bgsave每次運 行都要執(zhí)行fork操作創(chuàng)建子進程悼凑,屬于重量級操作,頻繁執(zhí)行成本過高璧瞬。
·RDB文件使用特定二進制格式保存户辫,Redis版本演進過程中有多個格式 的RDB版本,存在老版本Redis服務無法兼容新版RDB格式的問題嗤锉。
針對RDB不適合實時持久化的問題渔欢,Redis提供了AOF持久化方式來解決。
2.AOF持久化
AOF(append only file)持久化:以獨立日志的方式記錄每次寫命令瘟忱, 重啟時再重新執(zhí)行AOF文件中的命令達到恢復數(shù)據(jù)的目的奥额。AOF的主要作用 是解決了數(shù)據(jù)持久化的實時性,目前已經(jīng)是Redis持久化的主流方式
1)使用AOF
開啟AOF功能需要設置配置:appendonly yes访诱,默認不開啟垫挨。AOF文件名 通過appendfilename配置設置,默認文件名是appendonly.aof触菜。保存路徑同 RDB持久化方式一致九榔,通過dir配置指定。AOF的工作流程操作:命令寫入 (append)涡相、文件同步(sync)哲泊、文件重寫(rewrite)、重啟加載 (load)
1)所有的寫入命令會追加到aof_buf(緩沖區(qū))中漾峡。
2)AOF緩沖區(qū)根據(jù)對應的策略向硬盤做同步操作攻旦。
AOF為什么把命令追加到aof_buf中?Redis使用單線程響應命令生逸,如 果每次寫AOF文件命令都直接追加到硬盤牢屋,那么性能完全取決于當前硬盤負 載。先寫入緩沖區(qū)aof_buf中槽袄,還有另一個好處烙无,Redis可以提供多種緩沖區(qū)同步硬盤的策略,在性能和安全性方面做出平衡
3)隨著AOF文件越來越大遍尺,需要定期對AOF文件進行重寫截酷,達到壓縮的目的。
重寫后的AOF文件為什么可以變星贰迂苛?有如下原因:
1)進程內(nèi)已經(jīng)超時的數(shù)據(jù)不再寫入文件三热。
2)舊的AOF文件含有無效命令,如del key1三幻、hdel key2就漾、srem keys、set a111念搬、set a222等抑堡。重寫使用進程內(nèi)數(shù)據(jù)直接生成,這樣新的AOF文件只保
留最終數(shù)據(jù)的寫入命令朗徊。
3)多條寫命令可以合并為一個首妖,如:lpush list a、lpush list b爷恳、lpush list c可以轉(zhuǎn)化為:lpush list a b c有缆。為了防止單條命令過大造成客戶端緩沖區(qū)溢 出,對于list舌仍、set妒貌、hash、zset等類型操作铸豁,以64個元素為界拆分為多條灌曙。
AOF重寫降低了文件占用空間,除此之外节芥,另一個目的是:更小的AOF 文件可以更快地被Redis加載
AOF重寫過程可以手動觸發(fā)和自動觸發(fā):
·手動觸發(fā):直接調(diào)用bgrewriteaof命令在刺。
·自動觸發(fā):根據(jù)auto-aof-rewrite-min-size和auto-aof-rewrite-percentage參數(shù)確定自動觸發(fā)時機
·auto-aof-rewrite-min-size:表示運行AOF重寫時文件最小體積,默認 為64MB头镊。
·auto-aof-rewrite-percentage:代表當前AOF文件空間 (aof_current_size)和上一次重寫后AOF文件空間(aof_base_size)的比值蚣驼。
自動觸發(fā)時機=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage
其中aof_current_size和aof_base_size可以在info Persistence統(tǒng)計信息中查看。
4)當Redis服務器重啟時相艇,可以加載AOF文件進行數(shù)據(jù)恢復颖杏。
流程說明:
1)AOF持久化開啟且存在AOF文件時,優(yōu)先加載AOF文件坛芽,打印如下日志:
* DB loaded from append only file: 5.841 seconds
2)AOF關閉或者AOF文件不存在時留储,加載RDB文件,打印如下日志:
* DB loaded from disk: 5.586 seconds
3)加載AOF/RDB文件成功后咙轩,Redis啟動成功获讳。
4)AOF/RDB文件存在錯誤時,Redis啟動失敗并打印錯誤信息活喊。
本章重點回顧
1)Redis提供了兩種持久化方式:RDB和AOF丐膝。
2)RDB使用一次性生成內(nèi)存快照的方式,產(chǎn)生的文件緊湊壓縮比更 高,因此讀取RDB恢復速度更快帅矗。由于每次生成RDB開銷較大偎肃,無法做到實
時持久化,一般用于數(shù)據(jù)冷備和復制傳輸损晤。
3)save命令會阻塞主線程不建議使用软棺,bgsave命令通過fork操作創(chuàng)建子 進程生成RDB避免阻塞。
4)AOF通過追加寫命令到文件實現(xiàn)持久化尤勋,通過appendfsync參數(shù)可以 控制實時/秒級持久化。因為需要不斷追加寫命令茵宪,所以AOF文件體積逐漸變大最冰,需要定期執(zhí)行重寫操作來降低文件體積。
5)AOF重寫可以通過auto-aof-rewrite-min-size和auto-aof-rewritepercentage參數(shù)控制自動觸發(fā)稀火,也可以使用bgrewriteaof命令手動觸發(fā)暖哨。
6)子進程執(zhí)行期間使用copy-on-write機制與父進程共享內(nèi)存,避免內(nèi) 存消耗翻倍凰狞。AOF重寫期間還需要維護重寫緩沖區(qū)篇裁,保存新的寫入命令避免數(shù)據(jù)丟失。
7)持久化阻塞主線程場景有:fork阻塞和AOF追加阻塞赡若。fork阻塞時間 跟內(nèi)存量和系統(tǒng)有關达布,AOF追加阻塞說明硬盤資源緊張。
8)單機下部署多個實例時逾冬,為了防止出現(xiàn)多個子進程執(zhí)行重寫操作黍聂, 建議做隔離控制,避免CPU和IO資源競爭身腻。