小小又開始更文章了,今天的内容是redis持久化方式
Redis的持久化
Redis有兩種持久化方式,分别為快照(RDB檔案)以及追加式檔案(AOF檔案)
對于這兩種持久化相關的知識點如下
- RDB持久化方式會在一個特定的間隔儲存那個時間點的一個資料快照。
- AOF持久化方式會記錄一個伺服器收到的寫操作,在服務啟動時,這些記錄的操作會逐條執行進而重建出原來的資料,寫操作指令的格式和Redis協定一緻,以追加方式進行儲存。
- Redis持久化可以禁用。
- 兩種方式的持久化同時存在的,當Redis重新開機時,AOF優先于RDB,即追加式檔案會優先于快照式檔案。
RDB 快照式檔案
工作原理
- Redis調用fork()産生一個子程序。
- 子程序把資料寫到一個臨時的檔案。
- 當子程序寫完新的RDB檔案後,會把舊的RDB檔案替換掉。
優點
- RDB檔案是一個簡單的檔案,其儲存了某個時間點的Redis資料,相當适用于備份,可以設定一個時間點,對RDB檔案進行歸檔,這樣可以任意恢複不同時間點的檔案。
- RDB适用于災備,單檔案可以很友善的傳輸到伺服器上。
- RDB性能很好,需要持久化的時候,會fork一個子程序用于持久化,然後把持久化的工作交給子程序,自己不會又相關的I/O操作。
- 相比較AOF,在資料量大的情況下,RDB啟動資料會更快。
缺點
- RDB會造成資料丢失,每五分鐘一次的儲存快照,若在這五分鐘内因為某些原因不能工作,此時會造成資料的丢失。
- 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。
- 比RDB可靠,可以制定不同的同步方式。
- 其日志是一個純粹的追加的檔案,遇到突發情況,可以使用redis-check-aof進行修複。
- AOF過大的時候,會進行重寫操作。
- AOF會把指令一條條的導入,如果誤操作,可以删除最後一行,然後進行資料恢複
- 檔案過大
- 同步導緻性能過慢。
- 資料不一緻
啟用AOF
appendonly yes
檔案路徑
# 檔案存放目錄,與RDB共用。預設為目前工作目錄。
dir ./
# 預設檔案名為appendonly.aof
appendfilename "appendonly.aof"
可靠性
預設是每秒進行同步
# appendfsync always
appendfsync everysec
# appendfsync no
日志重寫
當AOF檔案過大的時候,例如,當計數器超過1000的時候,會進行自動的建立檔案進行重寫。
工作原理如下
- Redis調用fork 産生子程序
- 子程序把AOF寫到一個臨時的檔案。
- 主程序持續把新的變動寫入到buffer,同時舊的也寫入,保證安全。
-
子程序完成檔案重寫,主程序會獲得一個信号,記憶體的buffer自動追加到子程序生成的AOF
設定條件如下
# Redis會記住自從上一次重寫後AOF檔案的大小(如果自Redis啟動後還沒重寫過,則記住啟動時使用的AOF檔案的大小)。
# 如果目前的檔案大小比起記住的那個大小超過指定的百分比,則會觸發重寫。
# 同時需要設定一個檔案大小最小值,隻有大于這個值檔案才會重寫,以防檔案很小,但是已經達到百分比的情況。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
禁用指令如下
auto-aof-rewrite-percentage 0
資料修複
如果AOF檔案因為某些原因壞掉,通過如下的方式進行修複
- 備份AOF檔案
- 使用redis-check-aof指令修複檔案
auto-aof-rewrite-percentage 0
此時檔案依舊修複完成。
快照的切換
- 備份一個最新的dump.rdb的檔案
- 運作下列指令
$ redis-cli config set appendonly yes
$ redis-cli config set save ""
第一條指令,是啟動AOF,即追加。
第二條指令是禁用BOF即快照。
關于備份
建議備份如下
- 建立定時任務,進行定時的備份快照。
- 定時任務運作的時候,把過舊的檔案删除,隻保留48個小時内的檔案。
- 備份檔案,需要換資料中心,異地儲存。