Redis(4):Redis持久化簡(jiǎn)介

1.為什么要做持久化?持久化的意義是什么?

(1).Redis持久化的意義

????????看到上述問題你可能想說,做持久化的意義不就是將數(shù)據(jù)保存到磁盤上?對(duì),大體是這樣。redis持久化的意義就是為了容災(zāi),進(jìn)行故障恢復(fù),試想一下,當(dāng)并發(fā)量很大的時(shí)候,redis整個(gè)掛掉了,如果沒有進(jìn)行持久化的話,緩存里的數(shù)據(jù)都沒了,大量的請(qǐng)求都不能直接命中就會(huì)去數(shù)據(jù)庫中查找,就相當(dāng)于mysql直接面對(duì)高并發(fā),mysql承受高并發(fā)的能力并不高,這樣就會(huì)導(dǎo)致Mysql整個(gè)掛掉,mysql掛掉的話就會(huì)導(dǎo)致redis里的數(shù)據(jù)無法恢復(fù),因?yàn)閞edis里的數(shù)據(jù)是從mysql里面查出來的。

(2).Redis持久化的種類

????????redis的持久化主要有兩種類型,rdb和aof。他們倆可以同時(shí)開啟,但是redis會(huì)優(yōu)先使用aof進(jìn)行恢復(fù),因?yàn)閍of相對(duì)rdb來說數(shù)據(jù)更全。當(dāng)然,如果只是把Redis當(dāng)作純內(nèi)存的緩存來用,就可以把rdb和aof都禁用掉。

2.RDB持久化機(jī)制優(yōu)缺點(diǎn)詳解

????????rdb是一定的機(jī)制對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行周期性的持久化,生成后綴為.rdb的快照文件。


rdb持久化簡(jiǎn)圖

(1).rdb持久化的優(yōu)點(diǎn)

? ? ? ? (a).rdb會(huì)生成多個(gè)數(shù)據(jù)文件,每個(gè)文件都代表的是某個(gè)時(shí)刻的redis中的數(shù)據(jù),rdb是非常適合做冷備份的,可以定時(shí)的將生成的rdb文件上傳到云服務(wù)中,當(dāng)你想要恢復(fù)某個(gè)時(shí)刻的數(shù)據(jù)時(shí)只要將云服務(wù)器上的rdb文件下載下來即可恢復(fù)了。 那aof可以用來做冷備嗎?答案是可以的,但是aof只生成一個(gè)文件,你可以定時(shí)的將aof文件復(fù)制出來。但是,更適合做冷備的其實(shí)時(shí)rdb,他的優(yōu)勢(shì)在于,他的定時(shí)是由redis來控制的,使用aof做冷備的話還要你自己寫一些shell腳本之類的去定時(shí)的將文件復(fù)制出來,還有就是在最壞的情況下,rdb恢復(fù)數(shù)據(jù)的速度比aof更快。

? ? ? ? (b).rdb對(duì)Redis提供對(duì)外的讀寫服務(wù)的影響非常的小,可以讓Redis保持比較高的性能,生成新的rdb的時(shí)候是Redis fork了一個(gè)子進(jìn)程,讓子進(jìn)程執(zhí)行磁盤io操作進(jìn)行持久化。aof相對(duì)來說影響redis大一些,因?yàn)閍of每次都是要寫文件的,雖然寫入的是os cache,但是還是要一定的時(shí)間開銷,相對(duì)rdb來說要慢一些。

? ? ? ? (c).為什么說rdb恢復(fù)數(shù)據(jù)比aof快呢?這里解釋一下。因?yàn)閞db存儲(chǔ)的就是Redis某一時(shí)刻的數(shù)據(jù)文件,恢復(fù)的時(shí)候只要將文件加載到內(nèi)存就行了,而aof存儲(chǔ)的是一系列的操作指令,恢復(fù)數(shù)據(jù)的時(shí)候要回放和執(zhí)行所有的操作,所以aof恢復(fù)數(shù)據(jù)的速度相對(duì)來說要慢一些。

? ? ? ? 綜上所述,如果要做冷備的話,還是rdb更合適一些。

(2).rdb持久化的缺點(diǎn)

????????(a).如果想要在redis故障時(shí),盡可能少的丟失數(shù)據(jù),那么RDB沒有AOF好。一般來說,RDB數(shù)據(jù)快照文件,都是每隔5分鐘,或者更長(zhǎng)時(shí)間生成一次,這個(gè)時(shí)候就得接受一旦redis進(jìn)程宕機(jī),那么會(huì)丟失最近5分鐘的數(shù)據(jù),這個(gè)問題,也是rdb最大的缺點(diǎn),就是不適合做第一優(yōu)先的恢復(fù)方案,如果你依賴RDB做第一優(yōu)先恢復(fù)方案,會(huì)導(dǎo)致數(shù)據(jù)丟失的比較多。

????????(b).RDB每次在fork子進(jìn)程來執(zhí)行RDB快照數(shù)據(jù)文件生成的時(shí)候,如果數(shù)據(jù)文件特別大,可能會(huì)導(dǎo)致對(duì)客戶端提供的服務(wù)暫停數(shù)毫秒,或者甚至數(shù)秒,一般不要讓RDB的間隔太長(zhǎng),否則每次生成的RDB文件太大了,對(duì)redis本身的性能可能會(huì)有影響的。

3.AOF持久化機(jī)制詳解

????????AOF機(jī)制對(duì)每條寫入命令作為日志,以append-only的模式寫入一個(gè)日志文件中,在redis重啟的時(shí)候,可以通過回放AOF日志中的寫入指令來重新構(gòu)建整個(gè)數(shù)據(jù)集。


aof持久化機(jī)制簡(jiǎn)圖

(1).aof持久化的優(yōu)點(diǎn)

(a).AOF可以更好的保護(hù)數(shù)據(jù)不丟失,一般AOF會(huì)每隔1秒,通過一個(gè)后臺(tái)線程執(zhí)行一次fsync操作,最多丟失1秒鐘的數(shù)據(jù)。

(b).AOF日志文件以append-only模式寫入,所以沒有任何磁盤尋址的開銷,寫入性能非常高,而且文件不容易破損,即使文件尾部破損,也很容易修復(fù)。

(c).AOF日志文件即使過大的時(shí)候,出現(xiàn)后臺(tái)重寫操作,也不會(huì)影響客戶端的讀寫。因?yàn)樵趓ewrite log的時(shí)候,會(huì)對(duì)其中的指令進(jìn)行壓縮,創(chuàng)建出一份需要恢復(fù)數(shù)據(jù)的最小日志出來。再創(chuàng)建新日志文件的時(shí)候,老的日志文件還是照常寫入。當(dāng)新的merge后的日志文件ready的時(shí)候,再交換新老日志文件即可。

(d).AOF日志文件的命令通過非??勺x的方式進(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ù)。

(2).aof持久化的缺點(diǎn)

(a).對(duì)于同一份數(shù)據(jù)來說,AOF日志文件通常比RDB數(shù)據(jù)快照文件更大。

(b).AOF開啟后,支持的寫QPS會(huì)比RDB支持的寫QPS低,因?yàn)锳OF一般會(huì)配置成每秒fsync一次日志文件,當(dāng)然,每秒一次fsync,性能也還是很高的。如果你要保證一條數(shù)據(jù)都不丟,也是可以的,AOF的fsync設(shè)置成每寫入一條數(shù)據(jù)就fsync一次,那么redis的QPS就會(huì)大幅度降低。

(c).以前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ì)好很多。

(d).唯一的比較大的缺點(diǎn),其實(shí)就是做數(shù)據(jù)恢復(fù)的時(shí)候,會(huì)比較慢,還有做冷備,定期的備份,不太方便,可能要自己手寫復(fù)雜的腳本去做,做冷備不太合適。

4.aof和rdb應(yīng)該如何選擇?

(1).不要僅僅使用RDB,因?yàn)槟菢訒?huì)導(dǎo)致你丟失很多數(shù)據(jù)。

(2).也不要僅僅使用AOF,因?yàn)槟菢佑袃蓚€(gè)問題,第一,你通過AOF做冷備,沒有RDB做冷備,來的恢復(fù)速度更快; 第二,RDB每次簡(jiǎn)單粗暴生成數(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ù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容