Redis系列(十)、詳解Redis持久化方式AOF、RDB以及混合持久化

目錄

介紹

RDB

介紹

配置

使用

AOF

介紹

配置

重寫

使用

AOF和RDB的區別

RDB優缺點

AOF優缺點

AOF和RDB的恢復順序

AOF+RDB混合[推薦]

介紹

配置

使用


之前介紹Redis特點的時候其中有一條是Redis支持數據持久化,可以將內存中的數據持久化到磁盤中,重啓的時候再次加載使用。Redis4之前的數據持久化有AOF和RDB兩種,從Redis4之後新增了AOF+RDB混合持久化的方式,本篇就Redis的三種數據持久化的方式進行詳細介紹以及他們的場景和區別。

Redis系列文章:

Redis系列(一)、CentOS7下安裝Redis6.0.3穩定版

Redis系列(二)、數據類型之字符串String 

Redis系列(三)、數據類型之哈希Hash

Redis系列(四)、數據類型之列表List

Redis系列(五)、數據類型之無序集合Set

Redis系列(六)、數據類型之有序集合ZSet(sorted_set)

Redis系列(七)、常用key命令

Redis系列(八)、常用服務器命令 

Redis系列(九)、Redis的“事務”及Lua腳本操作


介紹

上面提到Redis持久化存儲有兩種持久化方案,RDB(Redis DataBase)和 AOF(Append-Only File)。其中RDB是將內存中的數據進行快照存儲到磁盤,AOF則爲可回放的命令日誌記錄redis內的所有操作。它們各有特點也相互獨立。Redis4之後支持RDB-AOF混合持久化的方式,結合了兩者的優點,可以通過 aof-use-rdb-preamble 配置項可以打開混合開關。

RDB

介紹

RDB(Redis DataBase)是將Redis內存中的數據進行Snaptshot快照存儲在磁盤內,是Redis的默認持久化方案。使用RDB持久化默認有三種策略,該持久化策略在redis.conf中可配置,會以一段時間內有指定次數據修改的規則觸發快照動作,快照文件名爲dump.rdb,該文件默認使用LZF壓縮算法 。每當Redis服務重啓的時候會從該文件中加載數據進內存。

RDB持久化除了可以根據配置中的策略觸發,也可以手動觸發,使用save和bgsave命令即可。這兩個命令的區別的save會阻塞服務器進程,在進行save的過程中,服務器不能處理任何請求,而bgsave會通過一個子進程在後臺處理rdb持久化。事實上save和bgsave調用的都是rdbSave函數,因此Redis不允許save和bgsave同時運行,這也是爲了避免出現競爭導致rdb文件數據不準確。

bgsave操作使用CopyOnWrite機制進行寫時複製,是由一個子進程將內存中的最新數據遍歷寫入臨時文件,此時父進程仍舊處理客戶端的操作,當子進程操作完畢後再將該臨時文件重命名爲dump.rdb替換掉原來的dump.rdb文件,因此無論bgsave是否成功,dump.rdb都不會受到影響。

另外在主從全量同步、debug reload以及shutdown的情況下也會觸發RDB數據持久化。

配置

我們可以修改redis.conf文件中的SNAPSHOTTING中修改RDB的默認持久化策略。

vim $REDIS_HOME/bin/redis.conf

#RDB持久化策略 默認三種方式,[900秒內有1次修改],[300秒內有10次修改],[60秒內有10000次修改]即觸發RDB持久化,我們可以手動修改該參數或新增策略
save 900 1
save 300 10
save 60 10000

#RDB文件名
dbfilename "dump.rdb"
#RDB文件存儲路徑
dir "/opt/app/redis6/data"

策略配置:

#在seconds秒內有changes次數據修改就觸發RDB持久化
save <seconds> <changes>

使用

執行save/bgsave前後 rdb文件被更新: 

將rdb文件備份後重啓服務,數據沒了,關閉服務將備份文件改回來,數據又回來了: 

AOF

介紹

AOF(Append-Only File)記錄Redis中每次的寫命令,類似mysql中的binlog,服務重啓時會重新執行AOF中的命令將數據恢復到內存中,RDB(按策略持久化)持久化方式記錄的粒度不如AOF(記錄每條寫命令),因此很多生產環境都是開啓AOF持久化。

AOF中記錄了操作和數據,在日誌文件中追加完成後纔會將內存中的數據進行變更。

AOF持久化流程

  1. 客戶端的請求寫命令會被append追加到AOF緩衝區內;
  2. AOF緩衝區根據AOF持久化策略[always,everysec,no]將操作sync同步到磁盤的AOF文件中;
  3. AOF文件大小超過重寫策略或手動重寫時,會對AOF文件rewrite重寫,壓縮AOF文件容量;
  4. Redis服務重啓時,會重新load加載AOF文件中的寫操作達到數據恢復的目的;

配置

開啓了AOF之後,RDB就默認不使用了。使用下面的配置開啓AOF以及策略。(如果使用AOF,推薦選擇always方式持久化,否則在高併發場景下,每秒鐘會有幾萬甚至百萬條請求,如果使用everysec的方式的話,萬一服務器掛了那幾萬條數據就丟失了):

vim $REDIS_HOME/bin/redis.conf

#開啓AOF持久化
appendonly yes

#AOF文件名
appendfilename "appendonly.aof"

#AOF文件存儲路徑 與RDB是同一個參數
dir "/opt/app/redis6/data"

#AOF策略,一般都是選擇第一種[always:每個命令都記錄],[everysec:每秒記錄一次],[no:看機器的心情高興了就記錄]
appendfsync always
#appendfsync everysec
# appendfsync no


#aof文件大小比起上次重寫時的大小,增長100%(配置可以大於100%)時,觸發重寫。[假如上次重寫後大小爲10MB,當AOF文件達到20MB時也會再次觸發重寫,以此類推]
auto-aof-rewrite-percentage 100 

#aof文件大小超過64MB時,觸發重寫
auto-aof-rewrite-min-size 64mb 

重寫

AOF持久化機制記錄每個寫命令,當服務重啓的時候會復現AOF文件中的所有命令,會消耗太多的資源且重啓很慢。因此爲了避免AOF文件中的寫命令太多文件太大,Redis引入了AOF的重寫機制來壓縮AOF文件體積。AOF文件重寫是把Redis進程內的數據轉化爲寫命令同步到新AOF文件的過程。

重寫會根據重寫策略或手動觸發AOF重寫。

重寫流程

  1. bgrewriteaof觸發重寫,判斷是否當前有bgsave或bgrewriteaof在運行,如果有,則等待該命令結束後再繼續執行。
  2. 主進程fork出子進程執行重寫操作,保證主進程不會阻塞。
  3. 子進程遍歷redis內存中數據到臨時文件,客戶端的寫請求同時寫入aof_buf緩衝區和aof_rewrite_buf重寫緩衝區 保證原AOF文件完整以及新AOF文件生成期間的新的數據修改動作不會丟失。
  4. 1).子進程寫完新的AOF文件後,向主進程發信號,父進程更新統計信息。2).主進程把aof_rewrite_buf中的數據寫入到新的AOF文件。
  5. 使用新的AOF文件覆蓋舊的AOF文件,完成AOF重寫。

使用

修改redis.conf文件開啓AOF之後,AOF文件爲空,此時如果重啓Redis服務會從AOF中復現數據,因此之前使用RDB持久化的數據都看不到了。因此我們可以使用另一種方式開啓AOF持久化,也可以將當前RDB中的數據緩存到aof文件中。

AOF文件爲文本格式存儲,可以使用cat命令查看。

在redis.conf中開啓AOF,RDB中的數據丟失了:

在命令行中熱修改配置開啓AOF,可以將RDB中的數據持久化到AOF文件中:

重寫:

如果AOF文件遇到格式或編碼錯誤可使用 redis-check-aof 命令修復AOF文件:

#修復
$REDIS_HOME/bin/redis-check-aof --fix $REDIS_HOME/data/appendonly.aof 

 

使用下面的命令查看aof持久化情況:

info persistence

 

AOF和RDB的區別

RDB優缺點

優點

  1. 壓縮後的二進制文件,適用於備份、全量複製及災難恢復
  2. RDB恢復數據性能優於AOF方式

缺點

  1. 無法做到實時持久化,每次都要創建子進程,頻繁操作成本過高
  2. 保存後的二進制文件,不同版本直接存在兼容性問題

AOF優缺點

優點

  1. 以文本形式保存,易讀
  2. 記錄寫操作保證數據不丟失

缺點

  1. 存儲所有寫操作命令,且文件爲文本格式保存,未經壓縮,文件體積高
  2. 恢復數據時重放AOF中所有代碼,恢復性能弱於RDB方式

AOF和RDB的恢復順序

當Redis服務重啓時數據恢復的順序如下:

  1. 判斷是否開啓AOF持久化,若開啓了AOF,則使用AOF持久化文件恢復數據,否則使用RDB持久化文件恢復數據;
  2. 若AOF文件不存在則從RDB文件恢復其實並沒有】;若AOF文件存在則使用AOF文件恢復;
  3. 若AOF文件和RDB文件都不存在則直接啓動Redis;
  4. 若AOF或RDB文件出現錯誤,則啓動失敗返回錯誤信息;

AOF+RDB混合[推薦]

介紹

看了上面的RDB和AOF的介紹後,我們可以發現,使用RDB持久化會有數據丟失的風險,但是恢復速度快,而使用AOF持久化可以保證數據完整性,但恢復數據的時候會很慢。於是從Redis4之後新增了混合AOF和RDB的模式,先使用RDB進行快照存儲,然後使用AOF持久化記錄所有的寫操作,當重寫策略滿足或手動觸發重寫的時候,將最新的數據存儲爲新的RDB記錄。這樣的話,重啓服務的時候會從RDB何AOF兩部分恢復數據,即保證了數據完整性,又提高了恢復的性能。

開啓混合模式後,每當bgrewriteaof命令之後會在AOF文件中以RDB格式寫入當前最新的數據,之後的新的寫操作繼續以AOF的追加形式追加寫命令。當redis重啓的時候,加載 aof 文件進行恢復數據:先加載 rdb 的部分再加載剩餘的 aof部分。

配置

修改下面的參數即可開啓AOF,RDB混合持久化:

vim $REDIS_HOME/bin/redis.conf 

aof-use-rdb-preamble yes

使用

開啓混合持久化模式後,重寫之後的aof文件裏和rdb一樣存儲二進制的 快照數據,繼續往redis中進行寫操作,後續操作在aof中仍然是以命令的方式追加。因此重寫後aof文件由兩部分組成,一部分是類似rdb的二進制快照,另一部分是追加的命令文本:

 

希望本文對你有幫助,請點個贊鼓勵一下作者吧~ 謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章