Redis數據備份與恢復


Redis所有數據都是保存在內存中,Redis數據備份可以定期的通過異步方式保存到磁盤上,該方式稱為半持久化模式,如果每一次數據變化都寫入aof文件里面,則稱為全持久化模式。同時還可以基於Redis主從復制實現Redis備份與恢復。

1. 半持久化RDB模式

    半持久化RDB模式也是Redis備份默認方式,是通過快照(snapshotting)完成的,當符合在Redis.conf配置文件中設置的條件時Redis會自動將內存中的所有數據進行快照並存儲在硬盤上,完成數據備份。

Redis進行RDB快照的條件由用戶在配置文件中自定義,由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。在配置文件中已經預置了3個條件:

save       900    1       #900秒內有至少1個鍵被更改則進行快照;
save       300    10      #300秒內有至少10個鍵被更改則進行快照;
save       60     10000        #60秒內有至少10000個鍵被更改則進行快照。

        默認可以存在多個條件,條件之間是“或”的關系,只要滿足其中一個條件,就會進行快照。 如果想要禁用自動快照,只需要將所有的save參數刪除即可。Redis默認會將快照文件存儲在Redis數據目錄,默認文件名為:dump.rdb文件,可以通過配置dir和dbfilename兩個參數分別指定快照文件的存儲路徑和文件名。也可以在Redis命令行執行config  get  dir獲取Redis數據保存路徑,如圖12-15(a)、12-15(b)所示:

                                                   

 

                                                                             圖12-15(a) 獲取Redis數據目錄

                                                  

                                                                         圖12-15(b) Redis數據目錄及dump.rdb文件

        Redis實現快照的過程,Redis使用fork函數復制一份當前進程(父進程)的副本(子進程),父進程繼續接收並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬盤中的臨時文件,當子進程寫入完所有數據后會用該臨時文件替換舊的RDB文件,至此一次快照操作完成。

        執行fork的時操作系統會使用寫時復制(copy-on-write)策略,即fork函數發生的一刻父子進程共享同一內存數據,當父進程要更改其中某片數據時,操作系統會將該片數據復制一份以保證子進程的數據不受影響,所以新的RDB文件存儲的是執行fork一刻的內存數據。

        Redis在進行快照的過程中不會修改RDB文件,只有快照結束后才會將舊的文件替換成新的,也就是說任何時候RDB文件都是完整的。這使得我們可以通過定時備份RDB文件來實 現Redis數據庫備份。

RDB文件是經過壓縮(可以配置rdbcompression參數以禁用壓縮節省CPU占用)的二進制格式,所以占用的空間會小於內存中的數據大小,更加利於傳輸。除了自動快照,還可以手動發送SAVE和BGSAVE命令讓Redis執行快照,兩個命令的區別在於,前者是由主進程進行快照操作,會阻塞住其他請求,后者會通過fork子進程進行快照操作。

Redis啟動后會讀取RDB快照文件,將數據從硬盤載入到內存,根據數據量大小與結構和服務器性能不同,通常將一個記錄一千萬個字符串類型鍵、大小為1GB的快照文件載入到內存中需花費20~30秒鍾。

通過RDB方式實現持久化,一旦Redis異常退出,就會丟失最后一次快照以后更改的所有數據。此時需要開發者根據具體的應用場合,通過組合設置自動快照條件的方式來將可能發生的數據損失控制在能夠接受的范圍。

2 .全持久化AOF模式

       如果數據很重要無法承受任何損失,可以考慮使用AOF方式進行持久化,默認Redis沒有開啟AOF(append only file)方式的全持久化模式。

在啟動時Redis會逐個執行AOF文件中的命令來將硬盤中的數據載入到內存中,載入的速度相較RDB會慢一些,開啟AOF持久化后每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬盤中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通過dir參數設置的,默認的文件名是appendonly.aof,可以通過appendfilename參數修改該名稱。

Redis允許同時開啟AOF和RDB,既保證了數據安全又使得進行備份等操作十分容易。此時重新啟動Redis后Redis會使用AOF文件來恢復數據,因為AOF方式的持久化可能丟失的數據更少,可以在redis.conf中通過appendonly參數開啟Redis AOF全持久化模式:

appendonly  yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendfsync always  
#appendfsync everysec
#appendfsync no

Redis AOF持久化參數配置詳解:

appendonly  yes                    #開啟AOF持久化功能;
appendfilename appendonly.aof          #AOF持久化保存文件名;
appendfsync always                     #每次執行寫入都會執行同步,最安全也最慢;
#appendfsync everysec                  #每秒執行一次同步操作;
#appendfsync no                    #不主動進行同步操作,而是完全交由操作系統來做,每30秒一次,最快也最不安全;
auto-aof-rewrite-percentage  100      #當AOF文件大小超過上一次重寫時的AOF文件大小的百分之多少時會再次進行重寫,如果之前沒有重寫過,則以啟動時的AOF文件大小為依據;
auto-aof-rewrite-min-size    64mb      #允許重寫的最小AOF文件大小配置寫入AOF文件后,要求系統刷新硬盤緩存的機制。

3 . Redis主從復制備份

       通過持久化功能,Redis保證了即使在服務器重啟的情況下也不會損失(或少量損失)數據。但是由於數據是存儲在一台服務器上的,如果這台服務器的硬盤出現故障,也會導致數據丟失。

為了避免單點故障,我們希望將數據庫復制多個副本以部署在不同的服務器上,即使只有一台服務器出現故障其他服務器依然可以繼續提供服務,這就要求當一台服務器上的數據庫更新后,可以自動將更新的數據同步到其他服務器上,Redis提供了復制(replication)功能可以自動實現同步的過程。通過配置文件在Redis從數據庫中配置文件中加入slaveof  master-ip  master-port即可,主數據庫無需配置。

       Redis主從復制優點及應用場景, WEB應用程序可以基於主從同步實現讀寫分離以提高服務器的負載能力。在常見的場景中,讀的頻率一般比較大,當單機Redis無法應付大量的讀請求時,可以通過復制功能建立多個從數據庫,主數據庫只進行寫操作,而從數據庫負責讀操作,還可以基於LVS+keepalived+Redis對Redis實現均和高可用。

       從數據庫持久化持久化通常相對比較耗時,為了提高性能,可以通過復制功能建立一個(或若干個)從數據庫,並在從數據庫中啟用持久化,同時在主數據庫禁用持久化。

        當從數據庫崩潰時重啟后主數據庫會自動將數據同步過來,所以無需擔心數據丟失。而當主數據庫崩潰時,需要在從數據庫中使用SLAVEOF NO ONE命令將從數據庫提升成主數據庫繼續服務,並在原來的主數據庫啟動后使用SLAVE  OF命令將其設置成新的主數據庫的從數據庫,即可將數據同步回來。


免責聲明!

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



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