1. 程式人生 > >Redis資料庫的dump備份與aof備份

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

參考連結: