Redis持久化

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資源競爭身腻。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产还,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘀趟,更是在濱河造成了極大的恐慌脐区,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件她按,死亡現(xiàn)場離奇詭異牛隅,居然都是意外死亡,警方通過查閱死者的電腦和手機尤溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門倔叼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宫莱,你說我怎么就攤上這事丈攒。” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵巡验,是天一觀的道長际插。 經(jīng)常有香客問我,道長显设,這世上最難降的妖魔是什么框弛? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮捕捂,結果婚禮上瑟枫,老公的妹妹穿的比我還像新娘。我一直安慰自己指攒,他們只是感情好慷妙,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允悦,像睡著了一般膝擂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隙弛,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天架馋,我揣著相機與錄音,去河邊找鬼全闷。 笑死叉寂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的室埋。 我是一名探鬼主播办绝,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姚淆!你這毒婦竟也來了孕蝉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤腌逢,失蹤者是張志新(化名)和其女友劉穎降淮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搏讶,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡佳鳖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了媒惕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系吩。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妒蔚,靈堂內(nèi)的尸體忽然破棺而出穿挨,到底是詐尸還是另有隱情月弛,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布科盛,位于F島的核電站帽衙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贞绵。R本人自食惡果不足惜厉萝,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榨崩。 院中可真熱鬧谴垫,春花似錦、人聲如沸母蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溯祸。三九已至,卻和暖如春舞肆,著一層夾襖步出監(jiān)牢的瞬間焦辅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工椿胯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筷登,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓哩盲,卻偏偏與公主長得像前方,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廉油,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一惠险、Redis高可用概述 在介紹Redis高可用之前,先說明一下在Redis的語境中高可用的含義抒线。 我們知道班巩,在w...
    空語閱讀 1,593評論 0 2
  • 企業(yè)級redis集群架構的特點 海量數(shù)據(jù) 高并發(fā) 高可用 要達到高可用孩革,持久化是不可減少的毙芜,持久化主要是做災難恢復...
    lucode閱讀 2,194評論 0 7
  • 本文是《Redis開發(fā)與運維》的學習筆記丧没。內(nèi)容大部分摘自此書孙咪。 眾所周知备绽,redis是內(nèi)存數(shù)據(jù)庫贡这,它把數(shù)據(jù)存儲在內(nèi)...
    小北覓閱讀 568評論 0 3
  • 本文檔翻譯自http://redis.io/topics/persistence戈泼。 這篇文章提供了 Redis 持...
    daos閱讀 690評論 0 10
  • 本文翻譯自官方文檔http://redis.io/topics/persistence 南片。 Redis 持久化 R...
    六尺帳篷閱讀 1,630評論 1 15