Redis提供了兩種不同的持久化政策:RDB和AOF。在4.0之後的版本,Redis提供了由RDB和AOF結合的混合持久化。
一、RDB持久化
1.1 什麼是RDB持久化
RDB持久化是通過快照完成的,當符合規則時,Redis會對記憶體中的所有資料進行周遊并且以二進制檔案的形式存在磁盤上。當執行個體重新開機時,Redis會讀取此二進制檔案進行資料恢複。
1.2 相關參數
127.0.0.1:6379> config get dir #RDB快照檔案存儲目錄
127.0.0.1:6379> config get dbfilename #RDB快照檔案名
127.0.0.1:6379> config get rdbchecksum #在讀寫rdb檔案時是否進行檢查
127.0.0.1:6379> config get rdbcompression #是否對RDB檔案進行壓縮
127.0.0.1:6379> config get stop-write-on-bgsave-error #當持久化錯誤時是否停止寫檔案
127.0.0.1:6379> config get save #持久化規則
1.3 RDB觸發條件
RDB生成快照檔案有兩種方式:自動觸發和手動觸發。
1、手動觸發
save:Redis立即執行快照,這個時候Redis會被阻塞,直到快照完成;
bgsave:bgsave通過fork子程序完成快照備份,Redis在fork子程序的時候需要拷貝父程序的空間記憶體頁表的,是以在fork子程序的時候Redis是阻塞的,阻塞時間由拷貝父程序空間記憶體頁表決定。
2、自動觸發
在配置檔案中配置save m n:save m n代表着在m秒内,Redis發生n次變化,則觸發bgsave執行持久化。在配置檔案中可以配置多個save,實作長時間少變化的持久化和短時間多變化的持久化政策。
在關閉Redis的時候,Redis會調用bgsave持久化。
在Redis主備複制的時候,備節點執行全量複制,主節點會調用bgsave持久化之後再将rdb檔案發送給備節點。
flushall:執行flushall指令會清空資料庫,Redis會調用bgsave執行持久化。
1.4 RDB檔案格式
#REDIS
52 45 44 49 53
#版本号
30 30 30 36
#FE表示資料庫編号
FE 00
# FD 表示過期時間
FD $length-encoding
#用于表示value的類型
$value-type
# Key 值
$string-encoded-key
# Value值
$encoded-value
# FC 表示毫秒級的過期時間
FC $length-encoding
#用于表示value的類型
$value-type
# Key 值
$string-encoded-key
# Value值
$encoded-value
#用于表示未過期value的類型
$value-type
$string-encoded-key
$encoded-value
# 下一個庫編号
FE $length-encoding
# FF:RDB檔案結束的标志
FF
1.5 RDB的優點
1、RDB對Redis對外提供的讀寫服務影響非常小,可以讓Redis保持高性能;
2、使用RDB資料檔案來恢複Redis資料,十分快速;
1.6 RDB的缺點
1、使用RDB進行資料持久化,如果Redis當機,會導緻Redis丢失最後一次RDB持久化之後的所有資料;
2、RDB每次在fork子程序來執行RDB快照資料檔案生成的時候,如果資料檔案很大,會導緻服務暫停時間較長;
二、AOF持久化
2.1 什麼是AOF持久化
Redis為了解決RDB存在資料丢失的問題,提供了AOF持久化。AOF會将Redis執行的寫指令追加到AOF磁盤檔案中,在Redis啟動時會優先選擇從AOF檔案恢複資料。由于每一次的寫操作,Redis都會寫入到檔案中,是以開啟AOF持久化會對性能有一定的影響。
2.2 相關參數
auto-aof-rewrite-min-size 64mb
#AOF檔案最小重寫大小,當AOF檔案大小大于該值時候才可能重寫,4.0預設配置64mb。
auto-aof-rewrite-percentage 100
#目前AOF檔案大小和上一次重寫時檔案大小的對比,如100代表目前AOF檔案是上次重寫的兩倍時候才重寫。
appendfsync everysec
#Redis在執行完一個指令後,會以協定格式将指令追加到伺服器狀态的 aof_buf 緩沖區的末尾,之後按照規則重新整理到磁盤
#no:不使用fsync方法同步,而是交給作業系統write函數去執行同步操作。性能最高,安全性最低。
#always:表示每次有寫操作都調用fsync将資料寫入到AOF檔案。性能最差,安全性最高。
#everysec:調用作業系統write寫入檔案,然後fsync每秒一次從核心重新整理到磁盤。兼顧性能和資料安全,是以Redis預設推薦使用該配置。Redis的處理政策:主線程每次進行AOF會對比上次fsync成功的時間;如果距上次不到2s,主線程直接傳回;如果超過2s,則主線程阻塞直到fsync同步完成。是以,如果系統硬碟負載過大導緻fsync速度太慢,會導緻Redis主線程的阻塞;此外,使用everysec配置,AOF最多可能丢失2s的資料,而不是1s。
aof-load-truncated yes
#當Redis突然運作崩潰時,會出現AOF檔案被截斷的情況,Redis可以在發生這種情況時退出并加載錯誤,以下選項控制此行為。
#yes:加載截斷的AOF檔案,Redis伺服器啟動發出日志以通知使用者該事件。
#no:服務将中止并顯示錯誤并停止啟動。Redis在重新開機之前需使用Redis-check-aof工具修複AOF檔案再啟動。
appendonly no
#yes開啟AOF持久化,no關閉AOF持久化
appendfilename appendonly.aof
#指定AOF檔案名,無法通過config set 設定,隻能通過修改配置檔案設定。
dir /usr/local/Redis
#AOF檔案存放目錄
2.3 AOF重寫機制
在Redis運作過程中,會不斷往AOF檔案中追加寫指令,這樣就會導緻AOF檔案十分臃腫。是以需要對AOF檔案進行壓縮。
AOF重寫是通過周遊所有資料庫的所有鍵,如果鍵過期或者重複無效将跳過。Redis重寫通過子程序執行以保證主程序的正常工作。在重寫期間,原AOF檔案會繼續對寫指令進行記錄,同時還會寫到重寫緩存中,待重寫完成後追加寫入到新的AOF檔案中,然後再将原AOF檔案覆寫。其中新AOF檔案替換原AOF檔案的過程會阻塞。
2.3.1 觸發條件
AOF重寫可以手動觸發和自動觸發:
手動觸發:
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
自動觸發:
auto-aof-rewrite-min-size: AOF檔案最小重寫大小,隻有當AOF檔案大小大于該值時候才可能重寫,4.0預設配置64mb。
auto-aof-rewrite-percentage:目前AOF檔案大小和最後一次重寫後的大小之間的比率等于或者等于指定的增長百分比,如100代表目前AOF檔案是上次重寫的兩倍時候才重寫。
當沒有bgsave、bgrewriteaof進行且符合上述兩個參數時,AOF就會進行重寫。
2.4 AOF檔案格式
(+) 表示一個正确的狀态資訊,具體資訊是目前行+後面的字元。
(-) 表示一個錯誤資訊,具體資訊是目前行-後面的字元。
(*) 表示消息體總共有多少行,不包括目前行,*後面是具體的行數。
($) 表示下一行資料長度,不包括換行符長度\r\n,$後面則是對應的長度的資料。
(:) 表示傳回一個數值,:後面是相應的數位元組符。
2.5 AOF的優點
1、AOF相對于RDB講以更好的保證資料不丢失,一般來講AOF會設定為每隔1秒通過背景線程去執行一次fsync操作,如果Redis程序挂掉,最多丢失1秒的資料。
2、AOF檔案是追加寫入,寫入性能非常高。
3、AOF日志檔案相對于RDB檔案更易讀,當存在誤操作的時候可以在AOF檔案重寫前修改檔案以用來做緊急的資料恢複。
2.6 AOF的缺點
1、AOF檔案相對于RDB檔案來說要更大;
2、AOF持久化開啟後對性能影響比RDB大;
3、資料恢複慢。
三、混合持久化
3.1 混合持久化過程
Redis在4.0版本加入混合持久化,以結合兩種持久化方式的優點。混合持久化通過AOF重寫機制建立一個綜合RDB和AOF格式的新AOF檔案。在重寫時,會将重寫之前的資料儲存為RDB格式,重寫之後繼續以AOF格式追加。
開啟混合持久化後,Redis建立的子程序首先将記憶體副本的全量以RDB方式寫入AOF檔案,然後再将緩沖區的增量指令追加到檔案中,完成後替換原AOF檔案。也就是說這個AOF檔案的上半部分時RDB格式,後半部分時AOF格式。這樣Redis重新讀取時恢複的更快,且資料一緻性更強。
3.2 相關參數
aof-use-rdb-preamble #yes則代表開啟
四、總結
Redis對資料持久化提供了良好的支援,可以根據實際需求選擇持久化政策。另外一定要對Redis的持久化檔案進行備份,根據實際情況調整備份政策,防止資料丢失!