天天看點

3.redis持久化機制

1.為什麼要做持久化

redis在開發中主要的作用是緩存資料和解決高并發問題,當redis挂掉後,重新開機redis資料不會自動修複,這時請求到redis就不能命中資料,就會出現緩存雪崩,大量請求直達到mysql資料庫,mysql資料庫不能處理高并發,就會挂掉。

是以redis做持久化是很有必要的 如果你把redis的持久化做好,備份和恢複方案做到企業級的程度,那麼即使你的redis故障了,也可以通過備份資料,快速恢複,一旦恢複立即對外提供服務

redis的持久化,跟高可用,是有關系的,企業級redis架構中去講解

redis持久化:RDB,AOF

2.RDB和AOF兩種持久化機制的介紹

3.redis持久化機制
3.redis持久化機制

RDB持久化機制,對redis中的資料執行周期性的持久化

AOF機制對每條寫入指令作為日志,以append-only的模式寫入一個日志檔案中,在redis重新開機的時候,可以通過回放AOF日志中的寫入指令來重新建構整個資料集

如果我們想要redis僅僅作為純記憶體的緩存來用,那麼可以禁止RDB和AOF所有的持久化機制

通過RDB或AOF,都可以将redis記憶體中的資料給持久化到磁盤上面來,然後可以将這些資料備份到别的地方去,比如說阿裡雲,雲服務

如果redis挂了,伺服器上的記憶體和磁盤上的資料都丢了,可以從雲服務上拷貝回來之前的資料,放到指定的目錄中,然後重新啟動redis,redis就會自動根據持久化資料檔案中的資料,去恢複記憶體中的資料,繼續對外提供服務

如果同時使用RDB和AOF兩種持久化機制,那麼在redis重新開機的時候,會使用AOF來重新建構資料,因為AOF中的資料更加完整

2、RDB持久化機制的優點

(1)RDB會生成多個資料檔案,每個資料檔案都代表了某一個時刻中redis的資料,這種多個資料檔案的方式,非常适合做冷備,可以将這種完整的資料檔案發送到一些遠端的安全存儲上去,比如說Amazon的S3雲服務上去,在國内可以是阿裡雲的ODPS分布式存儲上,以預定好的備份政策來定期備份redis中的資料

RDB也可以做冷備,生成多個檔案,每個檔案都代表了某一個時刻的完整的資料快照

AOF也可以做冷備,隻有一個檔案,但是你可以,每隔一定時間,去copy一份這個檔案出來

RDB做冷備,優勢在哪兒呢?由redis去控制固定時長生成快照檔案的事情,比較友善; AOF,還需要自己寫一些腳本去做這個事情,各種定時

RDB資料做冷備,在最壞的情況下,提供資料恢複的時候,速度比AOF快

(2)RDB對redis對外提供的讀寫服務,影響非常小,可以讓redis保持高性能,因為redis主程序隻需要fork一個子程序,讓子程序執行磁盤IO操作來進行RDB持久化即可

RDB,每次寫,都是直接寫redis記憶體,隻是在一定的時候,才會将資料寫入磁盤中

AOF,每次都是要寫檔案的,雖然可以快速寫入os cache中,但是還是有一定的時間開銷的,速度肯定比RDB略慢一些

(3)相對于AOF持久化機制來說,直接基于RDB資料檔案來重新開機和恢複redis程序,更加快速

AOF,存放的指令日志,做資料恢複的時候,其實是要回放和執行所有的指令日志,來恢複出來記憶體中的所有資料的

RDB,就是一份資料檔案,恢複的時候,直接加載到記憶體中即可

結合上述優點,RDB特别适合做冷備份,冷備

3、RDB持久化機制的缺點

(1)如果想要在redis故障時,盡可能少的丢失資料,那麼RDB沒有AOF好。一般來說,RDB資料快照檔案,都是每隔5分鐘,或者更長時間生成一次,這個時候就得接受一旦redis程序當機,那麼會丢失最近5分鐘的資料

這個問題,也是rdb最大的缺點,就是不适合做第一優先的恢複方案,如果你依賴RDB做第一優先恢複方案,會導緻資料丢失的比較多

(2)RDB每次在fork子程序來執行RDB快照資料檔案生成的時候,如果資料檔案特别大,可能會導緻對用戶端提供的服務暫停數毫秒,或者甚至數秒

一般不要讓RDB的間隔太長,否則每次生成的RDB檔案太大了,對redis本身的性能可能會有影響的

4、AOF持久化機制的優點

(1)AOF可以更好的保護資料不丢失,一般AOF會每隔1秒,通過一個背景線程執行一次fsync操作,最多丢失1秒鐘的資料

每隔1秒,就執行一次fsync操作,保證os cache中的資料寫入磁盤中

redis程序挂了,最多丢掉1秒鐘的資料

(2)AOF日志檔案以append-only模式寫入,是以沒有任何磁盤尋址的開銷,寫入性能非常高,而且檔案不容易破損,即使檔案尾部破損,也很容易修複

(3)AOF日志檔案即使過大的時候,出現背景重寫操作,也不會影響用戶端的讀寫。因為在rewrite log的時候,會對其中的指導進行壓縮,建立出一份需要恢複資料的最小日志出來。再建立新日志檔案的時候,老的日志檔案還是照常寫入。當新的merge後的日志檔案ready的時候,再交換新老日志檔案即可。

(4)AOF日志檔案的指令通過非常可讀的方式進行記錄,這個特性非常适合做災難性的誤删除的緊急恢複。比如某人不小心用flushall指令清空了所有資料,隻要這個時候背景rewrite還沒有發生,那麼就可以立即拷貝AOF檔案,将最後一條flushall指令給删了,然後再将該AOF檔案放回去,就可以通過恢複機制,自動恢複所有資料

5、AOF持久化機制的缺點

(1)對于同一份資料來說,AOF日志檔案通常比RDB資料快照檔案更大

(2)AOF開啟後,支援的寫QPS會比RDB支援的寫QPS低,因為AOF一般會配置成每秒fsync一次日志檔案,當然,每秒一次fsync,性能也還是很高的

如果你要保證一條資料都不丢,也是可以的,AOF的fsync設定成沒寫入一條資料,fsync一次,那就完蛋了,redis的QPS大降

(3)以前AOF發生過bug,就是通過AOF記錄的日志,進行資料恢複的時候,沒有恢複一模一樣的資料出來。是以說,類似AOF這種較為複雜的基于指令日志/merge/回放的方式,比基于RDB每次持久化一份完整的資料快照檔案的方式,更加脆弱一些,容易有bug。不過AOF就是為了避免rewrite過程導緻的bug,是以每次rewrite并不是基于舊的指令日志進行merge的,而是基于當時記憶體中的資料進行指令的重新建構,這樣健壯性會好很多。

(4)唯一的比較大的缺點,其實就是做資料恢複的時候,會比較慢,還有做冷備,定期的備份,不太友善,可能要自己手寫複雜的腳本去做,做冷備不太合适

6、RDB和AOF到底該如何選擇

(1)不要僅僅使用RDB,因為那樣會導緻你丢失很多資料

(2)也不要僅僅使用AOF,因為那樣有兩個問題,第一,你通過AOF做冷備,沒有RDB做冷備,來的恢複速度更快; 第二,RDB每次簡單粗暴生成資料快照,更加健壯,可以避免AOF這種複雜的備份和恢複機制的bug

(3)綜合使用AOF和RDB兩種持久化機制,用AOF來保證資料不丢失,作為資料恢複的第一選擇; 用RDB來做不同程度的冷備,在AOF檔案都丢失或損壞不可用的時候,還可以使用RDB來進行快速的資料恢複