Redis持久化的原理及優(yōu)化

Redis提供了將數(shù)據(jù)定期自動(dòng)持久化至硬盤(pán)的能力狰挡,包括RDB和AOF兩種方案鹅龄,兩種方案分別有其長(zhǎng)處和短板吴趴,可以配合起來(lái)同時(shí)運(yùn)行漆诽,確保數(shù)據(jù)的穩(wěn)定性。

RDB

保存數(shù)據(jù)快照至一個(gè)RDB文件中锣枝,用于持久化厢拭。RDB操作和Mysql Dump相似。

執(zhí)行方式

  • save撇叁。同步操作蚪腐,會(huì)阻塞Redis。
  • bgsave税朴。調(diào)用linux的fork()回季,然后使用新的線(xiàn)程執(zhí)行復(fù)制。但是fork期間也會(huì)阻塞Redis正林,但是阻塞時(shí)間通常很短泡一。
  • 自動(dòng)保存。Redis配置文件中設(shè)置了自動(dòng)保存的觸發(fā)機(jī)制觅廓,可以自定義修改鼻忠,運(yùn)行原理同bgsave。

save和bgsave的對(duì)比

Redis-RDB

注意:

  • 如果機(jī)器上運(yùn)行多個(gè)Redis杈绸,需要配置RDB文件名稱(chēng)帖蔓,否則多個(gè)Redis的RDB文件會(huì)相互覆蓋。

除了上述三種執(zhí)行方式瞳脓,以下情況也會(huì)生成RDB文件:

  • 主從的全量復(fù)制時(shí)塑娇,主機(jī)會(huì)生成RDB文件。
  • Redis中的debug reload提供debug級(jí)別的重啟劫侧,不清空內(nèi)存的一種重啟埋酬,這種方式也會(huì)觸發(fā)RDB文件的生成。
  • 執(zhí)行shutdown時(shí)烧栋,會(huì)觸發(fā)RDB文件的生成写妥。
Redis RDB過(guò)程

RDB的缺點(diǎn)

  • 全量數(shù)據(jù)存儲(chǔ),耗時(shí)审姓。
  • 雖然fork()采用copy-on-write策略珍特,但仍消耗內(nèi)存
  • 寫(xiě)RDB文件消耗大量IO性能。

AOF

采用AOF持久方式時(shí)魔吐,Redis會(huì)把每一個(gè)寫(xiě)請(qǐng)求都記錄在一個(gè)日志文件里扎筒,AOF操作和Mysql Binlog相似呼猪。通過(guò)AOF重寫(xiě)機(jī)制減少AOF文件的體積,從而減少恢復(fù)時(shí)間砸琅。

執(zhí)行方式

  • always宋距。Redis的每條寫(xiě)命令都寫(xiě)入到系統(tǒng)緩沖區(qū),然后每條寫(xiě)命令都使用fsync“寫(xiě)入”硬盤(pán)症脂。
  • everysec谚赎。過(guò)程與always相同,只是fsync的頻率為1秒鐘一次诱篷。這個(gè)是Redis默認(rèn)配置壶唤,如果系統(tǒng)宕機(jī),會(huì)丟失一秒左右的數(shù)據(jù)
  • no棕所。由操作系統(tǒng)決定什么時(shí)候從系統(tǒng)緩沖區(qū)刷新到硬盤(pán)闸盔。
Redis AOF的執(zhí)行方式對(duì)比

AOF重寫(xiě)

為了解決AOF文件體積膨脹的問(wèn)題,Redis提供了AOF重寫(xiě)功能:Redis服務(wù)器可以創(chuàng)建一個(gè)新的AOF文件來(lái)替代現(xiàn)有的AOF文件琳省,新舊兩個(gè)文件所保存的數(shù)據(jù)庫(kù)狀態(tài)是相同的迎吵,但是新的AOF文件不會(huì)包含任何浪費(fèi)空間的冗余命令,通常體積會(huì)較舊AOF文件小很多针贬。

AOF重寫(xiě)方式

  • bgrewriteaof(流程與bgsave相似)
  • AOF重寫(xiě)配置(與RDB自動(dòng)保存相似)

AOF重寫(xiě)并不需要對(duì)原有AOF文件進(jìn)行任何的讀取击费,寫(xiě)入,分析等操作桦他,這個(gè)功能是通過(guò)讀取服務(wù)器當(dāng)前的數(shù)據(jù)庫(kù)狀態(tài)來(lái)實(shí)現(xiàn)的蔫巩。

RDB vs AOF

Redis RDB和AOF的對(duì)比

Redis啟動(dòng)時(shí)的數(shù)據(jù)加載

Redis RDB和AOF的對(duì)比

Redis啟動(dòng)數(shù)據(jù)加載流程:

  1. AOF持久化開(kāi)啟且存在AOF文件時(shí),優(yōu)先加載AOF文件快压。
  2. AOF關(guān)閉或者AOF文件不存在時(shí)圆仔,加載RDB文件。
  3. 加載AOF/RDB文件成功后蔫劣,Redis啟動(dòng)成功坪郭。
  4. AOF/RDB文件存在錯(cuò)誤時(shí),Redis啟動(dòng)失敗并打印錯(cuò)誤信息拦宣。

開(kāi)發(fā)運(yùn)維中常見(jiàn)的問(wèn)題

fork操作

fork()的實(shí)際開(kāi)銷(xiāo)就是復(fù)制父進(jìn)程的頁(yè)表以及給子進(jìn)程創(chuàng)建一個(gè)進(jìn)程描述符截粗,所以速度一般比較快

內(nèi)存量越大,耗時(shí)越長(zhǎng)鸵隧;物理機(jī)相對(duì)較快,虛擬機(jī)相對(duì)較慢意推。

優(yōu)化方法

  1. 優(yōu)先使用物理機(jī)或者高效支持fork操作的虛擬化技術(shù)
  2. 控制Redis實(shí)例最大可用內(nèi)存maxmemory
  3. 合理配置Linux內(nèi)存分配策略:vm.overcommit_memory=1豆瘫。默認(rèn)值為0,會(huì)使Linux在內(nèi)存分配時(shí)菊值,發(fā)現(xiàn)不夠內(nèi)存不足時(shí)外驱,不會(huì)進(jìn)行分配育灸,進(jìn)而造成fork阻塞
  4. 降低fork頻率。例如放寬AOF重寫(xiě)自動(dòng)觸發(fā)時(shí)機(jī)或者減少不必要的主從全量復(fù)制

進(jìn)程外開(kāi)銷(xiāo)

  • CPU昵宇。RDB和AOF文件生成磅崭,屬于CPU密集型。不要將Redis進(jìn)程綁定在某個(gè)CPU上,防止單核過(guò)載瓦哎;同時(shí)Redis不和CPU密集型應(yīng)用一起部署砸喻。
  • 內(nèi)存。fork內(nèi)存開(kāi)銷(xiāo)蒋譬,copy-on-write割岛。
  • 硬盤(pán)。AOF和RDB文件的寫(xiě)入犯助⊙⑵幔可以結(jié)合iostat和iotop進(jìn)行分析。

優(yōu)化方法

  1. 不要和高硬盤(pán)負(fù)載服務(wù)部署在一起:存儲(chǔ)服務(wù)剂买、消息隊(duì)列等
  2. 配置no-appendfsync-on-rewrite=yes惠爽。這樣在AOF重寫(xiě)的期間,不要進(jìn)行AOF追加操作(主線(xiàn)程只將數(shù)據(jù)寫(xiě)入緩沖區(qū))瞬哼,可以減少內(nèi)存的開(kāi)銷(xiāo)疆股。

但如果AOF重寫(xiě)期間,Redis宕機(jī)的話(huà)倒槐,在Linux的系統(tǒng)默認(rèn)配置下旬痹,最多會(huì)丟失30s的數(shù)據(jù)。如果無(wú)法忍受數(shù)據(jù)丟失讨越,no-appendfsync-on-rewrite配置no两残;如果應(yīng)用系統(tǒng)無(wú)法忍受延遲,而可以容忍少量的數(shù)據(jù)丟失把跨,則設(shè)置為yes人弓。

  1. 根據(jù)寫(xiě)入量決定磁盤(pán)類(lèi)型:例如ssd
  2. 單機(jī)多實(shí)例持久化文件目錄可以考慮分盤(pán),或者使用類(lèi)似cgroups機(jī)制進(jìn)行硬盤(pán)資源的合理分配

AOF追加阻塞

Redis RDB和AOF的對(duì)比

例如在AOF的everysec策略中着逐,主線(xiàn)程會(huì)對(duì)比上次fsync的時(shí)間崔赌,如果距離上次fsync時(shí)間超過(guò)兩秒,就會(huì)造成主線(xiàn)程阻塞(等待同步線(xiàn)程同步完成)耸别。

日常開(kāi)發(fā)可以使用info persistence命令健芭,查看歷史發(fā)生AOF阻塞的次數(shù);然而需要了解AOF追加阻塞的發(fā)生時(shí)間則需要查看Redis日志秀姐。

發(fā)送AOF追加阻塞的時(shí)候慈迈,日志如下:

Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

優(yōu)化方法(參考其他方面的優(yōu)化點(diǎn))

哎呀,如果我的名片丟了省有。微信搜索“全菜工程師小輝”痒留,依然可以找到我
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谴麦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伸头,更是在濱河造成了極大的恐慌匾效,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恤磷,死亡現(xiàn)場(chǎng)離奇詭異面哼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碗殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)精绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锌妻,你說(shuō)我怎么就攤上這事代乃。” “怎么了仿粹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵搁吓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吭历,道長(zhǎng)堕仔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任晌区,我火速辦了婚禮摩骨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朗若。我一直安慰自己恼五,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布哭懈。 她就那樣靜靜地躺著灾馒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遣总。 梳的紋絲不亂的頭發(fā)上睬罗,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音旭斥,去河邊找鬼容达。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琉预,可吹牛的內(nèi)容都是我干的董饰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼圆米,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卒暂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起娄帖,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤也祠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后近速,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诈嘿,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年削葱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奖亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡析砸,死狀恐怖昔字,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情首繁,我是刑警寧澤作郭,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弦疮,受9級(jí)特大地震影響夹攒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胁塞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一咏尝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧啸罢,春花似錦编检、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至训桶,卻和暖如春累驮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舵揭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工谤专, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人午绳。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓置侍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜡坊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 一杠输、Redis高可用概述 在介紹Redis高可用之前,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義秕衙。 我們知道蠢甲,在w...
    空語(yǔ)閱讀 1,597評(píng)論 0 2
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用,持久化是不可減少的据忘,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,206評(píng)論 0 7
  • Redis 提供了多種不同級(jí)別的持久化方式: 了解 RDB 持久化和 AOF 持久化之間的異同是非常重要的鹦牛, 以下...
    笑Skr人啊閱讀 464評(píng)論 0 1
  • 2018年2月9日 星期五 晴 親子日記第21篇 雖一直堅(jiān)持寫(xiě)親子日記,但這一周我覺(jué)得自己有些被動(dòng)勇吊,總是第...
    武際金閱讀 945評(píng)論 0 12
  • 休假前三天汉规,基本都在看書(shū)礼殊。然后每天輸出了一篇文摘式的讀書(shū)筆記。為了方便后面幾天的的痛快的玩耍鲫忍,特意囤貨了膏燕。打算每天...
    奔跑的湯盆兒閱讀 124評(píng)論 0 0