1. 程式人生 > >圖解分析redis的RDB和AOF這兩種持久化機制的工作原理

圖解分析redis的RDB和AOF這兩種持久化機制的工作原理

▌大綱

  • RDB和AOF兩種持久化機制的介紹
  • RDB持久化機制的優點
  • RDB持久化機制的缺點
  • AOF持久化機制的優點
  • AOF持久化機制的缺點
  • RDB和AOF到底該如何選擇

 

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

1、redis預設情況下,每隔一秒,呼叫一次作業系統fsync函式,強制將os cache中的資料刷入到磁碟檔案中。

2、redis中的記憶體大小是有一定限度的,當達到一定程度時將會用快取淘汰演算法,LRU,自動將一部分資料從記憶體中清除

3、當AOF檔案大小達到一定程度時,將做rewrite操作,也就是基於當時redis記憶體中的資料,重新構建一個更新的AOF檔案,刪除舊的AOF檔案

 

RDB持久化機制的優點

1、RDB會生成多個數據檔案,每個資料檔案都代表了某一時刻中redis的資料,這種多個數據檔案的方式,非常適合做冷備份,可以將這種完整的資料檔案傳送到一些遠端的安全儲存上去,比如說Amazon的S3雲服務上去,在國內可以是阿里雲的ODPS分散式儲存上,以預定好的備份策略來定期備份redis中的資料。
   RDB做冷備,優勢在哪?由redis去控制固定時長生成快照檔案的事情,比較方便;而AOF需要自己寫一些指令碼去做這個事情,各種定時

2、RDB對redis對外提供的讀寫服務,影響非常小,可以讓redis保持高效能,因為redis主程序只需要fork一個子程序,讓子程序執行磁碟IO操作來進行RDB持久化即可。
   RDB,每次寫,都是直接寫redis記憶體,只是在一定的時候,才會將資料寫入磁碟
   AOF,每次都是要寫檔案,雖然可以快速寫入os cache中,但是還是有一定的時間開銷,速度肯定比RDB慢一些

3、相對於AOF持久化機制來說,直接基於RDB資料檔案來重啟和恢復redis程序,更加快速
   AOF,存放的指令日誌,做資料恢復時,其實是要回放和執行所有的指令日誌,來恢復出來記憶體中的所有資料
   RDB,就是一份資料檔案,恢復的時候,直接載入到記憶體中即可

 

RDB持久化機制的缺點

(1)如果想要在redis故障時,儘可能少的丟失資料,那麼RDB沒有AOF好。一般來說,RDB資料快照檔案,都是每隔5分鐘,或者更長時間生成一次,這個時候一旦redis程序宕機,那麼丟失最近5分鐘的資料
(2)RDB每次在fork子程序來執行RDB快照資料檔案生成的時候,如果資料檔案特別大,可能會導致對客戶端提供的服務暫停數毫秒,或者幾秒。一般不要讓RDB的間隔太長,否則每次生成的RDB檔案太長了,對redis本身的效能不好
 

 

AOF持久化機制的優點

(1)AOF可以更好的保護資料不丟失,一般AOF會隔1秒,通過一個後臺執行緒執行一次fsync操作,最多丟失1秒資料

(2)AOF日誌檔案以append-only模式寫入,所有沒有任何磁碟定址的開銷,寫入效能非常高,而且檔案不容易破損,即使有檔案尾部破損,也很容易修復

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

(4)AOF日誌檔案的命令通過非常可讀的方式記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。

 

AOF持久化機制的缺點

(1)對於同一份資料來說,AOF日誌檔案通常比RDB資料快照檔案大。

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

(3)做資料恢復的時候,比較慢,並且做冷備份時不太方便,需要自己寫複雜的指令碼。

 

RDB和AOF如何選擇

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

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

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