redis的RDB和AOF兩種持久化機制

2021-10-11 02:16:55 字數 3019 閱讀 4577

rdb持久化機制,對redis中的資料執行週期性的持久化。

如果我們想要redis僅僅作為純記憶體的快取來用,那麼可以禁止rdb和aof所有的持久化機制。

通過rdb或aof,都可以將redis記憶體中的資料給持久化到磁碟上面來,然後可以將這些資料備份到別的地方去,比如說阿里雲,雲服務。

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

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

(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特別適合做冷備份,冷備。

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

這個問題,也是rdb最大的缺點,就是不適合做第一優先的恢復方案,如果你依賴rdb做第一優先恢復方案,會導致資料丟失的比較多。

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

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

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

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

(4)aof日誌檔案的命令通過非常可讀的方式進行記錄,這個特性非常適合做災難性的誤刪除的緊急恢復。比如某人不小心用flushall命令清空了所有資料,只要這個時候後台rewrite還沒有發生,那麼就可以立即拷貝aof檔案,將最後一條flushall命令給刪了,然後再將該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)唯一的比較大的缺點,其實就是做資料恢復的時候,會比較慢,還有做冷備,定期的備份,不太方便,可能要自己手寫複雜的指令碼去做,做冷備不太合適。

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

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

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

rdb和aof的介紹

aof rewrite原理剖析

比如redis限定了總內容大小為1g,總共能存100w資料,這個時候aof裡面也是存了100w資料相關的寫指令日誌,但是redis已經達到最大了,則需要用lru快取清除演算法,將最不經常用的資料從記憶體中刪除,比如清理了50w資料,然後又重新寫了50w資料,這個時候的aof裡面存了150w資料相關的寫指令日誌,假如aof達到極限了,這個時候要rewrite機制基於redis當前記憶體中的最新的100w資料構建新的aof檔案,老的aof檔案會被刪掉。

redis持久化的兩種方式 RDB和AOF

目的 針對於記憶體資料丟失的情況,redis提供了兩種資料持久化的機制。rdbrdb 將redis的資料通過伺服器快照的方式以二進位制儲存在dump.rdb檔案中。原理 定時fork乙個子執行緒去將記憶體資料進行快照儲存寫入到rdb檔案中,然後替換舊的rdb檔案。主線程處理指令請求。優點 可以快速恢...

Redis中兩種持久化機制RDB和AOF

rdb其實就是把資料以快照的形式儲存在磁碟上。什麼是快照呢,你可以理解成把當前時刻的資料拍成一張 儲存下來。既然rdb機制是通過把某個時刻的所有資料生成乙個快照來儲存,那麼就應該有一種觸發機制,是實現這個過程。對於rdb來說,提供了三種機制 s e bgs e 自動化。我們分別來看一下 127.0....

redis持久化(rdb和aof)

rdb redis database 在制定的時間間隔內將記憶體中的資料集快照寫入磁碟 snapshot快照 redis恢復時將快照檔案直接讀到記憶體。rdb儲存的是dump.rdb檔案 在bin 目錄下會看到 redis會單獨建立 fork 乙個子程序來進行持久化,會先將資料寫入到乙個臨時檔案中,...