小小又開始更文章了,今天的內容是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個小時內的文件。
- 備份文件,需要換數據中心,異地保存。