天天看點

一文啃下來redis持久化的方式Redis的持久化RDB 快照式檔案AOF關于備份

小小又開始更文章了,今天的内容是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. 備份檔案,需要換資料中心,異地儲存。

繼續閱讀