課程大綱
1谒获、Redis持久化的意義
2、如何應(yīng)對(duì)故障的發(fā)生
3业簿、持久化方式-RDB
4瘤礁、持久化方式-AOF
5、RDB持久化機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
6梅尤、AOF持久化機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
7柜思、RDB和AOF到底該如何選擇
1、Redis持久化的意義
redis持久化的意義巷燥,在于故障恢復(fù)
2赡盘、如何應(yīng)對(duì)故障的發(fā)生
常見的故障如下圖所示:
1.比如你部署了一個(gè)redis,作為cache緩存缰揪,當(dāng)然也可以保存一些較為重要的數(shù)據(jù)
2.如果沒有持久化的話陨享,redis遇到災(zāi)難性故障的時(shí)候,就會(huì)丟失所有的數(shù)據(jù)
3.如果通過持久化將數(shù)據(jù)搞一份兒在磁盤上去,然后定期比如說同步和備份到一些云存儲(chǔ)服務(wù)上去抛姑,那么就可以保證數(shù)據(jù)不丟失全部赞厕,還是可以恢復(fù)一部分?jǐn)?shù)據(jù)回來的
3、持久化方式-RDB
RDB 持久化方式如下圖所示:
RDB持久化機(jī)制定硝,對(duì)redis中的數(shù)據(jù)執(zhí)行周期性的持久化.
4坑傅、持久化方式-AOF
AOF 持久化方式如下圖所示:
AOF機(jī)制對(duì)每條寫入命令作為日志,以append-only的模式寫入一個(gè)日志文件中喷斋,在redis重啟的時(shí)候唁毒,可以通過回放AOF日志中的寫入指令來重新構(gòu)建整個(gè)數(shù)據(jù)集
4.1、AOF rewrite 原理如下圖所示:
4.2星爪、持久化RDB-AOF注意事項(xiàng)
1.如果同時(shí)使用RDB和AOF兩種持久化機(jī)制浆西,那么在redis重啟的時(shí)候,會(huì)使用AOF來重新構(gòu)建數(shù)據(jù)顽腾,因?yàn)锳OF中的數(shù)據(jù)更加完整.
2.通過RDB或AOF近零,都可以將redis內(nèi)存中的數(shù)據(jù)給持久化到磁盤上面來,然后可以將這些數(shù)據(jù)備份到別的地方去抄肖,比如說阿里云久信,云服務(wù)
3.如果redis掛了,服務(wù)器上的內(nèi)存和磁盤上的數(shù)據(jù)都丟了漓摩,可以從云服務(wù)上拷貝回來之前的數(shù)據(jù)裙士,放到指定的目錄中,然后重新啟動(dòng)redis管毙,redis就會(huì)自動(dòng)根據(jù)持久化數(shù)據(jù)文件中的數(shù)據(jù)腿椎,去恢復(fù)內(nèi)存中的數(shù)據(jù),繼續(xù)對(duì)外提供服務(wù).
4.如果我們想要redis僅僅作為純內(nèi)存的緩存來用夭咬,那么可以禁止RDB和AOF所有的持久化機(jī)制
5啃炸、RDB持久化機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
RDB持久化機(jī)制的優(yōu)點(diǎn):
1.RDB會(huì)生定期生成新的dump數(shù)據(jù)文件,當(dāng)前時(shí)間下的數(shù)據(jù)文件都代表了某一個(gè)時(shí)刻中redis最新的數(shù)據(jù)卓舵,定時(shí)復(fù)制當(dāng)前時(shí)間最新的dump文件南用,生成多個(gè)備份文件的方式,非常適合做冷備掏湾,可以將這種完整的數(shù)據(jù)文件發(fā)送到一些遠(yuǎn)程的安全存儲(chǔ)上去裹虫,比如說Amazon的S3云服務(wù)上去,在國內(nèi)可以是阿里云的ODPS分布式存儲(chǔ)上忘巧,以預(yù)定好的備份策略來定期備份redis中的數(shù)據(jù)恒界。
2.RDB對(duì)redis對(duì)外提供的讀寫服務(wù)睦刃,影響非常小砚嘴,可以讓redis保持高性能,因?yàn)閞edis主進(jìn)程只需要fork一個(gè)子進(jìn)程,讓子進(jìn)程執(zhí)行磁盤IO操作來進(jìn)行RDB持久化即可际长。這個(gè)特性很重要耸采。
3、相對(duì)于AOF持久化機(jī)制來說工育,直接基于RDB數(shù)據(jù)文件來重啟和恢復(fù)redis進(jìn)程虾宇,更加快速。
RDB持久化機(jī)制的缺點(diǎn):
1.如果想要在redis故障時(shí)如绸,盡可能少的丟失數(shù)據(jù)嘱朽,那么RDB沒有AOF好。一般來說怔接,RDB數(shù)據(jù)快照文件搪泳,都是每隔5分鐘,或者更長時(shí)間生成一次扼脐,這個(gè)時(shí)候就得接受一旦redis進(jìn)程宕機(jī)岸军,那么會(huì)丟失最近5分鐘的數(shù)據(jù)。
2.RDB每次在fork子進(jìn)程來執(zhí)行RDB快照數(shù)據(jù)文件生成的時(shí)候瓦侮,如果數(shù)據(jù)文件特別大艰赞,可能會(huì)導(dǎo)致對(duì)客戶端提供的服務(wù)暫停數(shù)毫秒,或者甚至數(shù)秒肚吏。
6方妖、AOF持久化機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
AOF持久化機(jī)制的優(yōu)點(diǎn):
1、AOF可以更好的保護(hù)數(shù)據(jù)不丟失罚攀,一般AOF會(huì)每隔1秒吁断,通過一個(gè)后臺(tái)線程執(zhí)行一次fsync操作,最多丟失1秒鐘的數(shù)據(jù)
2坞生、AOF日志文件以append-only模式寫入仔役,所以沒有任何磁盤尋址的開銷,寫入性能非常高是己,而且文件不容易破損又兵,即使文件尾部破損,也很容易修復(fù)
3卒废、AOF日志文件即使過大的時(shí)候沛厨,出現(xiàn)后臺(tái)重寫操作,也不會(huì)影響客戶端的讀寫摔认。因?yàn)樵趓ewrite log的時(shí)候逆皮,會(huì)對(duì)其中的指導(dǎo)進(jìn)行壓縮,創(chuàng)建出一份需要恢復(fù)數(shù)據(jù)的最小日志出來参袱。再創(chuàng)建新日志文件的時(shí)候电谣,老的日志文件還是照常寫入秽梅。當(dāng)新的merge后的日志文件ready的時(shí)候,再交換新老日志文件即可剿牺。
4企垦、AOF日志文件的命令通過非常可讀的方式進(jìn)行記錄晒来,這個(gè)特性非常適合做災(zāi)難性的誤刪除的緊急恢復(fù)钞诡。比如某人不小心用flushall命令清空了所有數(shù)據(jù),只要這個(gè)時(shí)候后臺(tái)rewrite還沒有發(fā)生湃崩,那么就可以立即拷貝AOF文件荧降,將最后一條flushall命令給刪了,然后再將該AOF文件放回去攒读,就可以通過恢復(fù)機(jī)制誊抛,自動(dòng)恢復(fù)所有數(shù)據(jù)
AOF持久化機(jī)制的缺點(diǎn):
1、對(duì)于同一份數(shù)據(jù)來說整陌,AOF日志文件通常比RDB數(shù)據(jù)快照文件更大
2拗窃、AOF開啟后,支持的寫QPS會(huì)比RDB支持的寫QPS低泌辫,因?yàn)锳OF一般會(huì)配置成每秒fsync一次日志文件随夸,當(dāng)然,每秒一次fsync震放,性能也還是很高的
3宾毒、以前AOF發(fā)生過bug,就是通過AOF記錄的日志殿遂,進(jìn)行數(shù)據(jù)恢復(fù)的時(shí)候诈铛,沒有恢復(fù)一模一樣的數(shù)據(jù)出來。所以說墨礁,類似AOF這種較為復(fù)雜的基于命令日志/merge/回放的方式幢竹,比基于RDB每次持久化一份完整的數(shù)據(jù)快照文件的方式,更加脆弱一些恩静,容易有bug焕毫。不過AOF就是為了避免rewrite過程導(dǎo)致的bug,因此每次rewrite并不是基于舊的指令日志進(jìn)行merge的驶乾,而是基于當(dāng)時(shí)內(nèi)存中的數(shù)據(jù)進(jìn)行指令的重新構(gòu)建邑飒,這樣健壯性會(huì)好很多。
7级乐、RDB和AOF到底該如何選擇
1疙咸、不要僅僅使用RDB,因?yàn)槟菢訒?huì)導(dǎo)致你丟失很多數(shù)據(jù)
2风科、也不要僅僅使用AOF撒轮,因?yàn)槟菢佑袃蓚€(gè)問題乞旦,第一,你通過AOF做冷備腔召,沒有RDB做冷備杆查,來的恢復(fù)速度更快; 第二扮惦,RDB每次簡單粗暴生成數(shù)據(jù)快照臀蛛,更加健壯,可以避免AOF這種復(fù)雜的備份和恢復(fù)機(jī)制的bug
3崖蜜、綜合使用AOF和RDB兩種持久化機(jī)制浊仆,用AOF來保證數(shù)據(jù)不丟失,作為數(shù)據(jù)恢復(fù)的第一選擇; 建議使用RDB來做不同程度的冷備豫领,在AOF文件都丟失或損壞不可用的時(shí)候抡柿,還可以使用RDB來進(jìn)行快速的數(shù)據(jù)恢復(fù)。
個(gè)人博客:http://www.markfork.com
個(gè)人簡書:http://www.reibang.com/u/c169fce5179b
慕課網(wǎng):https://www.imooc.com/u/2150709/articles