在 Redis 中存在兩種方式的備份:一種是快照恢復(RDB),通過快照(snapshotting)實現的,它是備份當前瞬間 Redis 在內存中的數據記錄。
另一種是只追加文件(Append-Only File,AOF),其作用就是當 Redis 執行寫命令后,在一定的條件下將執行過的寫命令依次保存在 Redis 的文件中,將來就可以依次執行那些保存的命令恢復 Redis 的數據了。
RDB備份
對於快照備份而言,如果當前 Redis 的數據量大,備份可能造成 Redis 卡頓,但是恢復重啟是比較快速的;對於 AOF 備份而言,它只是追加寫入命令,所以備份一般不會造成 Redis 卡頓,但是恢復重啟要執行更多的命令,備份文件可能也很大,使用者使用的時候要注意。
在 Redis 中允許使用其中的一種、同時使用兩種,或者兩種都不用,所以具體使用何種方式進行備份和持久化是用戶可以通過配置決定的。對於Redis而言,它的默認配置為:
################################## SNAPSHOTTING###################################
......
save 900 1
save 300 10
save 60 10000
......
stop-writes-on-bgsave-error yes
......
rdbcompression yes
......
dbfilename dump.rdb
############################## APPEND ONLY MODE ###############################
......
appendonly no
......
appendfilename "appendonly.aof"
......
#appendfsync always
appendfsync everysec
# appendfsync no......
......
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
......
aof-load-truncated yes
......
對於快照模式的備份而言,它的配置項如下:
save 900 1
save 300 10
save 60 10000
這 3 個配置項的含義分別為:
- 當 900 秒執行 1 個寫命令時,啟用快照備份。
- 當 300 秒執行 10 個寫命令時,啟用快照備份。
- 當 60 秒內執行 10000 個寫命令時,啟用快照備份。
Redis 執行 save 命令的時候,將禁止寫入命令。
stop-writes-on-bgsave-error yes
這里先談談 bgsave 命令,它是一個異步保存命令,也就是系統將啟動另外一條進程,把 Redis 的數據保存到對應的數據文件中。它和 save 命令最大的不同是它不會阻塞客戶端的寫入,也就是在執行 bgsave 的時候,允許客戶端繼續讀/寫 Redis。
在默認情況下,如果 Redis 執行 bgsave 失敗后,Redis 將停止接受寫操作,這樣以一種強硬的方式讓用戶知道數據不能正確的持久化到磁盤,否則就會沒人注意到災難的發生,如果后台保存進程重新啟動工作了,Redis 也將自動允許寫操作。然而如果安裝了靠譜的監控,可能不希望 Redis 這樣做,那么你可以將其修改為 no。
rdbcompression yes
這個命令意思是是否對 rbd 文件進行檢驗,如果是將對 rdb 文件檢驗。從 dbfilename 的配置可以知道,rdb 文件實際是 Redis 持久化的數據文件。
dbfilename dump.rdb
它是數據文件。當采用快照模式備份(持久化)時,Redis 將使用它保存數據,將來可以使用它恢復數據。
appendonly no
AOF備份
如果 appendonly 配置為 no,則不啟用 AOF 方式進行備份。如果 appendonly 配置為 yes,則以 AOF 方式備份 Redis 數據,那么此時 Redis 會按照配置,在特定的時候執行追加命令,用以備份數據。
appendfilename "appendonly.aof"
這里定義追加的寫入文件為 appendonly.aof,采用 AOF 追加文件備份的時候命令都會寫到這里。
#appendfsync always
appendfsync everysec
# appendfsync no......
AOF 文件和 Redis 命令是同步頻率的,假設配置為 always,其含義為當 Redis 執行命令的時候,則同時同步到 AOF 文件,這樣會使得 Redis 同步刷新 AOF 文件,造成緩慢。而采用 evarysec 則代表每秒同步一次命令到 AOF 文件。
采用 no 的時候,則由客戶端調用命令執行備份,Redis 本身不備份文件。對於采用 always 配置的時候,每次命令都會持久化,它的好處在於安全,壞處在於每次都持久化性能較差。
采用 evarysec 則每秒同步,安全性不如 always,備份可能會丟失 1 秒以內的命令,但是隱患也不大,安全度尚可,性能可以得到保障。采用 no,則性能有所保障,但是由於失去備份,所以安全性比較差。筆者建議采用默認配置 everysec,這樣在保證性能的同時,也在一定程度上保證了安全性。
no-appendfsync-on-rewrite no
它指定是否在后台 AOF 文件 rewrite(重寫)期間調用 fsync,默認為 no,表示要調用 fsync(無論后台是否有子進程在刷盤)。Redis 在后台寫 RDB 文件或重寫 AOF 文件期間會存在大量磁盤 I/O,此時,在某些 Linux 系統中,調用 fsync 可能會阻塞。
auto-aof-rewrite-percentage 100
它指定 Redis 重寫 AOF 文件的條件,默認為 100,表示與上次 rewrite 的 AOF 文件大小相比,當前 AOF 文件增長量超過上次 AOF 文件大小的 100% 時,就會觸發 background rewrite。若配置為 0,則會禁用自動 rewrite。
auto-aof-rewrite-min-size 64mb
它指定觸發 rewrite 的AOF文件大小。若AOF文件小於該值,即使當前文件的增量比例達到 auto-aof-rewrite-percentage 的配置值,也不會觸發自動 rewrite。即這兩個配置項同時滿足時,才會觸發rewrite。
aof-load-truncated yes
Redis 在恢復時會忽略最后一條可能存在問題的指令,默認為 yes。即在 AOF 寫入時,可能存在指令寫錯的問題(突然斷電、寫了一半),這種情況下 yes 會 log 並繼續,而 no 會直接恢復失敗