Redis資料備份與恢復
轉自:https://www.cnblogs.com/deny/p/11531355.html
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命令將其設定成新的主資料庫的從資料庫,即可將資料同步回來。