資安

一文啃下來redis持久化的方式

小小又開始更文章了,今天的內容是redis持久化方式

Redis的持久化

Redis有兩種持久化方式,分別為快照(RDB文件)以及追加式文件(AOF文件)
對於這兩種持久化相關的知識點如下

  1. RDB持久化方式會在一個特定的間隔保存那個時間點的一個數據快照。
  2. AOF持久化方式會記錄一個服務器收到的寫操作,在服務啟動時,這些記錄的操作會逐條執行從而重建出原來的數據,寫操作命令的格式和Redis協議一致,以追加方式進行保存。
  3. Redis持久化可以禁用。
  4. 兩種方式的持久化同時存在的,當Redis重啟時,AOF優先於RDB,即追加式文件會優先於快照式文件。

RDB 快照式文件

工作原理

  1. Redis調用fork()產生一個子進程。
  2. 子進程把數據寫到一個臨時的文件。
  3. 當子進程寫完新的RDB文件後,會把舊的RDB文件替換掉。

優點

  1. RDB文件是一個簡單的文件,其保存了某個時間點的Redis數據,相當適用於備份,可以設定一個時間點,對RDB文件進行歸檔,這樣可以任意恢復不同時間點的文件。
  2. RDB適用於災備,單文件可以很方便的傳輸到服務器上。
  3. RDB性能很好,需要持久化的時候,會fork一個子進程用於持久化,然後把持久化的工作交給子進程,自己不會又相關的I/O操作。
  4. 相比較AOF,在數據量大的情況下,RDB啟動數據會更快。

缺點

  1. RDB會造成數據丟失,每五分鐘一次的保存快照,若在這五分鐘內因為某些原因不能工作,此時會造成數據的丟失。
  2. RDB使用fork子進程進行數據持久化,在數據量大的情況下,會花費一點時間,如果Redis進行停止服務,那麼在CPU性能不好的情況下,會造成服務停止時間超過一秒。

文件路徑和名稱

默認文件路徑會保存文件為 dump.rdb 文件,在redis目錄下。
修改路徑,修改配置文件redis.conf實現

# RDB文件名,默認為dump.rdb。
dbfilename dump.rdb

# 文件存放的目錄,AOF文件同樣存放在此目錄下。默認為當前工作目錄。
dir ./

保存點

可以修改配置的保存點
格式如下

save 60 1000

上面的含義是,如果redis每60秒,更改了1000次,那麼就更新配置文件。

禁用格式如下

save ""

關於錯誤處理

如果redis,生成快照失敗,那麼就會接受數據,此時會返回給用戶,持久化失敗,此時可以進行如下的配置,禁用掉這個功能。

stop-writes-on-bgsave-error yes

關於數據壓縮

默認情況下Redis會採用LZF進行數據壓縮,如果需要關閉,配置如下

rdbcompression yes

數據校驗

在RDB的末尾,會有一個CRC64的校驗碼在文件末尾,這樣會保證文件的完整性,在保存的時候會失去性能,如果需要追求更高的性能,此時使用yes禁用掉,此時會把校驗碼改為e,加載文件的時候,看到e會直接跳過。

rdbcompression yes

手動生成快照

使用save命令會在當前線程生成RDB快照文件。
使用BGSAVE命令會在後臺生成快照文件。使用LASTSAVE命令可以查到操作是否成功

127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> LASTSAVE
(integer) 1433936394

AOF

快照並不可靠,使用追加的命令,進行添加AOF。

優點

  1. 比RDB可靠,可以制定不同的同步方式。
  2. 其日誌是一個純粹的追加的文件,遇到突發情況,可以使用redis-check-aof進行修復。
  3. AOF過大的時候,會進行重寫操作。
  4. AOF會把命令一條條的導入,如果誤操作,可以刪除最後一行,然後進行數據恢復

缺點

  1. 文件過大
  2. 同步導致性能過慢。
  3. 數據不一致

啟用AOF

appendonly yes

文件路徑

# 文件存放目錄,與RDB共用。默認為當前工作目錄。
dir ./

# 默認文件名為appendonly.aof
appendfilename "appendonly.aof"

可靠性

默認是每秒進行同步

# appendfsync always
appendfsync everysec
# appendfsync no

日誌重寫

當AOF文件過大的時候,例如,當計數器超過1000的時候,會進行自動的新建文件進行重寫。
工作原理如下

  1. Redis調用fork 產生子進程
  2. 子進程把AOF寫到一個臨時的文件。
  3. 主進程持續把新的變動寫入到buffer,同時舊的也寫入,保證安全。
  4. 子進程完成文件重寫,主進程會獲得一個信號,內存的buffer自動追加到子進程生成的AOF
    設置條件如下
# Redis會記住自從上一次重寫後AOF文件的大小(如果自Redis啟動後還沒重寫過,則記住啟動時使用的AOF文件的大小)。
# 如果當前的文件大小比起記住的那個大小超過指定的百分比,則會觸發重寫。
# 同時需要設置一個文件大小最小值,只有大於這個值文件才會重寫,以防文件很小,但是已經達到百分比的情況。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

禁用命令如下

auto-aof-rewrite-percentage 0

數據修復

如果AOF文件因為某些原因壞掉,通過如下的方式進行修復

  1. 備份AOF文件
  2. 使用redis-check-aof命令修復文件
auto-aof-rewrite-percentage 0

此時文件依舊修復完成。

快照的切換

  1. 備份一個最新的dump.rdb的文件
  2. 運行下列命令
$ redis-cli config set appendonly yes
$ redis-cli config set save ""

第一條命令,是啟動AOF,即追加。
第二條命令是禁用BOF即快照。

關於備份

建議備份如下

  1. 創建定時任務,進行定時的備份快照。
  2. 定時任務運行的時候,把過舊的文件刪除,只保留48個小時內的文件。
  3. 備份文件,需要換數據中心,異地保存。

Leave a Reply

Your email address will not be published. Required fields are marked *