Redis資料庫的dump備份與aof備份
Redis自動備份有兩種方式,第一種是通過dump.rdb檔案實現備份,另外一種使用aof檔案實現自動備份。
Dump.rdb備份
Redis中預設使用dump.rdb檔案實現備份,如果aof備份沒有開啟,那麼啟動redis時,會預設從dump.rbd檔案中讀取原始資料.
如何配置dump.rdb備份,在redis.conf檔案中有命令:
save 900 1
save 300 10
save 60 10000
它代表的意思是dump備份的條件,在900s內有一個key發生改變/300s中有10個key發生改變/60s內有10000個key發生改變時,redis將將當前資料庫快照到dump.rdb檔案中。
也可以執行命令來實現手動備份
SAVE
SAVE命令表示使用主程序將當前資料庫快照到dump檔案
BGSAVE
BGSAVE命令表示,主程序會fork一個子程序來進行快照備份。
兩者的不同是,前者會阻塞主程序,而後者不會,所以一般使用BGSAVE進行手動備份。
redis快照到dump檔案時,會先生成一個temp.rdb檔案,然後重新命名為dump.rdb檔案替換原來檔案實現備份。
redis.conf中的
dbfilename dump.rdb //修改dump檔名稱
dir ./ //修改dump檔案的檔案路徑
aof檔案備份
redis預設關閉了aof檔案備份,redis.conf檔案中找到
appendonly no
把no改為yes
appendfilename appendonly.aof
可以修改預設的aof檔名
appendfsync everysec
這裡預設的everysec會在安全和效率之間權衡,redis預設會每隔1s就呼叫fsync函式,將緩衝區的資料寫到磁盤裡面,但是當fsync函式執行時間超過1s時,redis會適當延遲寫操作。當appendfsync設定為always時,redis會針對每一個寫操作都重新整理到磁碟,這樣雖然安全,但是效能會有所降低。當設定為no時,redis不會主動對資料進行備份,這時什麼時候重新整理備份,就依賴於作業系統的設定了。
Aof bgrewriteaof操作
aof檔案備份,會備份資料庫的歷史記錄,以及相應執行過的指令,相當於一個log檔案,在恢復資料庫的時候會回滾執行命令,同時恢復資料。這樣帶來的一個問題就是,aof檔案會越來越大,如果有一百條指令,最後一條指令恢復的最終資料庫,那麼前99條指令及相應的資料也會存在在aof檔案中。如何解決的這個問題呢?
可以執行命令:
bgrewriteaof
就會把當前資料庫重新整理到aof檔案中,此時aof檔案中將只會儲存當前資料庫的資料,所以如果資料庫被入侵清空,請謹慎執行這個命令,因為它會資料庫上的歷史資料消失。
redis也會自動呼叫bgwriteaof操作:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
這裡的設定針對redis自動進行rewriteaof操作。percentage是指,當redis當前的aof檔案大小相對於上一次進行rewriteaof操作時的大小增長率大於100%時,就會進行rewrite,這裡可以自己設定。
但是,當增長率大於了100%,實際上aof檔案其實很小,這樣rewrite就沒有必要了,所以,還需要設定一個min-size,當redis的增長率大於100%,並且min-size的大於64mb時,就會執行rewriteaof操作。
如果想關閉rewriteaof操作,可以將percentage設定為0。
redis會在以下三個時候進行rewrite操作
- Redis接收到客戶端傳送的bgrewriteaof命令
- Redis aof檔案增長率和增長大小達到auto-aof-rewrite
- Redis接收到客戶端傳送的”CONFIG SET appendonly yes”命令
aof與dump備份不同
aof檔案備份與dump檔案備份不同。dump檔案的編碼格式和儲存格式與資料庫一致,而且dump檔案中備份的是資料庫的當前快照,意思就是,不管資料之前什麼樣,只要BGSAVE了,dump檔案就會重新整理成當前資料庫資料。
當redis重啟時,會按照以下優先順序進行啟動:
- 如果只配置AOF,重啟時載入AOF檔案恢復資料;
- 如果同時 配置了RBD和AOF,啟動是隻載入AOF檔案恢復資料;
- 如果只配置RBD,啟動時將載入dump檔案恢復資料。
注意:只要配置了aof,但是沒有aof檔案,這個時候啟動的資料庫會是空的
在linux環境執行Redis時,如果系統的記憶體比較小,這個時候自動備份會有可能失敗,需要修改系統的vm.overcommit_memory 引數,這個引數是幹什麼的呢,它有三個選值,是linux系統的記憶體分配策略:
- 0, 表示核心將檢查是否有足夠的可用記憶體供應用程序使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程序。
- 1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
- 2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體
Redis官方的說明是,建議將vm.overcommit_memory的值修改為1,可以用下面幾種方式進行修改:
- (1)編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,然後sysctl -p 使配置檔案生效
- (2)sysctl vm.overcommit_memory=1
- (3)echo 1 > /proc/sys/vm/overcommit_memory
參考連結: