Redis持久化RDB和AOF原理


Redis持久化RDB和AOF原理

前言:
redis持久化方式分為兩種:RDB快照和AOF方式(默認為RDB模式),當Redis服務器重啟的時候,會自動恢復數據,優先從AOF中恢復,其次才從RDB中恢復
 
一、RDB快照模式
RDB方式原理:當redis需要做持久化時(執行SAVA或者BGSAVA命令,或者是達到配置條件時執行),redis會fork一個子進程,子進程將數據寫到磁盤上一個臨時RDB文件中,當子進程完成寫臨時文件后,將原來的RDB替換掉(默認文件名為dump.rdb)
 
RDB備份條件和命令:
1、執行SAVE命令,在當前線程執行,會卡住
2、執行BGSAVE命令,在后台線程執行,馬上返回
3、當符合用戶給定的配置條件時Redis會自動將內存中的所有數據進行快照並存儲在硬盤上。由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照,在配置文件redis.conf中 已經預置了3個條件:
save 900 1 # 900秒內有至少1個鍵被更改則進行快照 save 300 10 # 300秒內有至少10個鍵被更改則進行快照 save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
 
RDB優缺點:
定時備份,Redis效率高,但是容易造成數據丟失,丟失的多少和備份策略有關,例如:5分鍾備份一次,但是第8分時宕機了,那么就丟失了后面的3分鍾數據
 
一、AOF模式
AOF方式原理:AOF就可以做到全程持久化,Redis每執行一個修改數據的命令,都會把這個命令添加到AOF文件中,當Redis重啟時,將會讀取AOF文件進行“重放”以恢復到 Redis關閉前的最后時刻。
由於os會在內核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要 通過fsync函數強制os寫入到磁盤的時機。有三種方式如下(默認是:每秒fsync一次)
appendonly yes              //啟用aof持久化方式
# appendfsync always      //每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec     //每秒鍾強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦
# appendfsync no    //完全依賴os,性能最好,持久化沒保證
 
AOF優缺點
AOF基本可以保證數據不丟失,但是AOF持久化文件會變的越來越大。例如我們調用incr test命令100次,文件中必須保存全部的100條命令,其實有99條都是多余的。
 

三、二者優缺點

RDB存在哪些優勢呢?

1). 一旦采用該方式,那么你的整個Redis數據庫將只包含一個文件,這對於文件備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24小時的數據,同時還要每天歸檔一次最近30天的數據。通過這樣的備份策略,一旦系統出現災難性故障,我們可以非常容易的進行恢復。

2). 對於災難恢復而言,RDB是非常不錯的選擇。因為我們可以非常輕松的將一個單獨的文件壓縮后再轉移到其它存儲介質上。

3). 性能最大化。對於Redis的服務進程而言,在開始持久化時,它唯一需要做的只是fork出子進程,之后再由子進程完成這些持久化的工作,這樣就可以極大的避免服務進程執行IO操作了。

4). 相比於AOF機制,如果數據集很大,RDB的啟動效率會更高。

RDB又存在哪些劣勢呢?

1). 如果你想保證數據的高可用性,即最大限度的避免數據丟失,那么RDB將不是一個很好的選擇。因為系統一旦在定時持久化之前出現宕機現象,此前沒有來得及寫入磁盤的數據都將丟失。

2). 由於RDB是通過fork子進程來協助完成數據持久化工作的,因此,如果當數據集較大時,可能會導致整個服務器停止服務幾百毫秒,甚至是1秒鍾。

AOF的優勢有哪些呢?

1). 該機制可以帶來更高的數據安全性,即數據持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事實上,每秒同步也是異步完成的,其效率也是非常高的,所差的是一旦系統出現宕機現象,那么這一秒鍾之內修改的數據將會丟失。而每修改同步,我們可以將其視為同步持久化,即每次發生的數據變化都會被立即記錄到磁盤中。可以預見,這種方式在效率上是最低的。至於無同步,無需多言,我想大家都能正確的理解它。

2). 由於該機制對日志文件的寫入操作采用的是append模式,因此在寫入過程中即使出現宕機現象,也不會破壞日志文件中已經存在的內容。然而如果我們本次操作只是寫入了一半數據就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,我們可以通過redis-check-aof工具來幫助我們解決數據一致性的問題。

3). 如果日志過大,Redis可以自動啟用rewrite機制。即Redis以append模式不斷的將修改數據寫入到老的磁盤文件中,同時Redis還會創建一個新的文件用於記錄此期間有哪些修改命令被執行。因此在進行rewrite切換時可以更好的保證數據安全性。

4). AOF包含一個格式清晰、易於理解的日志文件用於記錄所有的修改操作。事實上,我們也可以通過該文件完成數據的重建。

AOF的劣勢有哪些呢?

1). 對於相同數量的數據集而言,AOF文件通常要大於RDB文件。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

2). 根據同步策略的不同,AOF在運行效率上往往會慢於RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB一樣高效。

二者選擇的標准,就是看系統是願意犧牲一些性能,換取更高的緩存一致性(aof),還是願意寫操作頻繁的時候,不啟用備份來換取更高的性能,待手動運行save的時候,再做備份(rdb)。rdb這個就更有些 eventually consistent的意思了。

四、常用配置

RDB持久化配置

Redis會將數據集的快照dump到dump.rdb文件中。此外,我們也可以通過配置文件來修改Redis服務器dump快照的頻率,在打開6379.conf文件之后,我們搜索save,可以看到下面的配置信息:

save 900 1              #在900秒(15分鍾)之后,如果至少有1個key發生變化,則dump內存快照。

save 300 10            #在300秒(5分鍾)之后,如果至少有10個key發生變化,則dump內存快照。

save 60 10000        #在60秒(1分鍾)之后,如果至少有10000個key發生變化,則dump內存快照。

AOF持久化配置

在Redis的配置文件中存在三種同步方式,它們分別是:

appendfsync always     #每次有數據修改發生時都會寫入AOF文件。

appendfsync everysec  #每秒鍾同步一次,該策略為AOF的缺省策略。

appendfsync no          #從不同步。高效但是數據不會被持久化。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM