前言
RDB
-
RDB持久化是把當前進程數據生成快照保存到硬盤的過程, 觸發RDB持久化過程分爲手動觸發和自動觸發。
-
RDB完成後會自動生成一個文件,保存在
dir
配置的指定目錄下,文件名是
dbfileName
指定。
-
Redis默認會採用LZF算法對生成的RDB文件作壓縮處理,壓縮後的文件遠遠小於內存大小,默認開啓。
手動觸發
自動觸發
-
除了手動觸發RDB,Redis服務器內部還有以下幾個場景可以自動觸發RDB:
-
根據咱們的
save m n
配置規則自動觸發。
-
若是從節點執行全量複製操做, 主節點自動執行bgsave生成RDB文件併發送給從節點。
-
執行
debug reload
命令從新加載Redis時, 也會自動觸發save操做。
-
默認狀況下執行shutdown命令時, 若是沒有開啓AOF持久化功能則自動執行
bgsave
。
RDB執行流程
-
RDB的主流方式就是bgsave,經過下圖咱們來看看RDB的執行流程:
-
經過上圖能夠很清楚RDB的執行流程,以下:
-
執行bgsave命令後,會先判斷是否存在AOF或者RDB的子進程,若是存在,直接返回。
-
父進程fork操做建立一個子進程,fork操做中父進程會被阻塞。
-
fork完成後,子進程開始根據父進程的內存生成臨時快照文件,完成後對原有的RDB文件進行替換。執行
lastsave
命令能夠查看最近一次的RDB時間。
-
子進程完成後發送信號給父進程,父進程更新統計信息。
RDB的優勢
RDB的缺點
AOF
如何開啓AOF
AOF總體的執行流程
命令寫入
*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n
複製代碼
文件同步
-
Redis提供了多種AOF緩衝區同步文件策略, 由參數
appendfsync
控制,以下:
-
配置爲
always
時, 每次寫入都要同步AOF文件, 在通常的SATA硬盤上,Redis只能支持大約幾百TPS寫入, 顯然跟Redis高性能特性背道而馳,不建議配置。
-
配置爲
no
,因爲操做系統每次同步AOF文件的週期不可控,並且會加大每次同步硬盤的數據量,雖然提高了性能,但數據安全性沒法保證。
-
配置爲
everysec
(默認的配置),是
建議的同步策略, 也是默認配置,作到兼顧性能和數據安全性。理論上只有在系統忽然宕機的狀況下丟失1秒的數據(固然,這是不太準確的)。
文件重寫機制
-
隨着命令不斷寫入AOF, 文件會愈來愈大, 爲了解決這個問題, Redis引入AOF重寫機制壓縮文件體積。 AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程。
-
爲何要文件重寫呢? 由於文件重寫可以使得AOF文件的體積變得更小,從而使得能夠更快的被Redis加載。
-
-
auto-aof-rewrite-min-size
:表示運行AOF重寫時文件最小體積, 默認爲64MB。
-
auto-aof-rewrite-percentage
:表明當前AOF文件空間(
aof_current_size
) 和上一次重寫後AOF文件空間(
aof_base_size
) 的比值。
-
自動觸發時機至關於
aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size) /aof_base_size>=auto-aof-rewritepercentage。其中
aof_current_size
和
aof_base_size
能夠在
info Persistence
統計信息中查看。
-
那麼文件重寫後的AOF文件爲何會變小呢? 有以下幾個緣由:
-
進程內已經超時的數據將不會再次寫入AOF文件中。
-
舊的AOF文件含有無效命令,如
del key1
、
hdel key2
等。重寫使用進程內數據直接生成,這樣新的AOF文件只保留最終數據的寫入命令。
-
多條寫命令能夠合併爲一個, 如:
lpush list a
、
lpush list b
、
lpush listc
能夠轉化爲:
lpush list a b c
。爲了防止單條命令過大形成客戶端緩衝區溢出,對於
list
、
set
、
hash
、
zset
等類型操做,以64個元素爲界拆分爲多條。
-
介紹了文件重寫的系列知識,下面來看看Redis內部是如何進行文件重寫的,以下圖:
-
看完上圖,大體瞭解了文件重寫的流程,對於重寫的流程,補充以下:
-
重寫期間,主線程並無阻塞,而是在執行其餘的操做命令,依然會向舊的AOF文件寫入數據,這樣可以保證備份的最終完整性,若是數據重寫失敗,也能保證數據不會丟失。
-
爲了把重寫期間響應的寫入信息也寫入到新的文件中,所以也會爲子進程保留一個緩衝區,防止新寫的文件丟失數據。
-
重寫是直接把當前內存的數據生成對應命令,並不須要讀取老的AOF文件進行分析、命令合併。
-
AOF文件直接採用的
文本協議
,主要是兼容性好、追加方便、可讀性高可認爲修改修復。
-
不管是
RDB
仍是
AOF
都是先寫入一個臨時文件,而後經過
重命名
完成文件的替換。
AOF的優勢
AOF的缺點
AOF和RDB的區別
重啓加載
性能問題與解決方案
總結