1. 程式人生 > >深入理解Redis(番外)——持久化

深入理解Redis(番外)——持久化

如果 ESS crc sum 不用 記錄 文件 每次 也會

引語

Redis作為一款內存數據庫,自然所有數據都加載在內存中,那麽自然就有小夥伴會問,如果服務器宕機了怎麽辦,數據不都丟了嗎,不用擔心,Redis早就提供了兩種方式來將數據進行持久化,即便服務器宕機,在Redis重啟後,數據也能恢復過來。這兩種方式分別是RDB持久化和AOF持久化,那麽這兩種方式各有什麽優劣、該如何配置、怎麽去選擇呢?請看下文:

RDB

RDB持久化實際上將Redis中的數據做了一份快照到本地文件中、定期備份,備份流程如下:

  1. 判定觸發了備份條件,過了指定時長並更新了指定數量的Key,則準備備份;
  2. 調用系統函數中的fork(),創建一個子進程,執行fork的時候操作系統會使用copy-on-write策略,即fork函數父子進程共享同一內存數據,當父進程要更改其中的某片數據時,操作系統會將該數據復制一份從而保證子進程的數據不受影響,所以rdb中的數據時fork那一刻時的內存數據;
  3. 子進程將數據寫入到一個臨時的rdb文件中;
  4. 子進程寫入完成後使用新的rdb文件替換舊的rdb文件。

從上面的流程我們可以看出,RDB備份的效率比較高,如果發生宕機恢復的速度也很快。但是如果服務器發生宕機,沒來得及寫入磁盤的數據則會丟失;同時,在fork時,如果數據集比較大,也可能會阻塞一段時間Redis,所以對於數據安全性要求較高的可以考慮後面一種方式aof。相關配置:


################################ 快照 ################################# 

# 保存數據庫到磁盤
# save 秒 更新次數
# 當秒和更新次數同時滿足時,則執行RDB導出操作

save 900 1 # 過900秒後數據庫發生了至少1個Key值改變則進行RDB操作
save 300 10 # 過300秒後數據庫發生了至少10個Key值改變則進行RDB操作
save 60 10000 # 過60秒後數據庫發生了至少10000個Key值改變則進行RDB操作


# 在默認情況下,當RDB操作被激活且持久化失敗時,Redis是否停止接受更新操作
# 因為需要用戶了解到數據並沒有正確持久化,如果沒人註意這個問題,將是一個災難
# 當然如果你已經合理配置了Redis服務器的監視和備份,可以關掉此功能
stop-writes-on-bgsave-error yes

# 是否使用LZF壓縮,使用了LZF壓縮後的數據文件會比較小
# 如果你想節省一部分子進程的cpu消耗可以關閉此功能,但是會產生比較大的數據文件
rdbcompression yes

# 為了防止文件損壞,此選項可以追加一個循環冗余校驗碼(CRC64)到快照文件的末尾
# 但是他會消耗約10%的cpu,如果對性能追求極致,可以設置為no
rdbchecksum yes

# 導出的rdb文件名稱
dbfilename dump.rdb

# 導出的rdb文件存儲目錄
dir ./

AOF

AOF會以日誌的形式記錄服務器所處理的每個寫、刪除操作到文本中,具體步驟如下:

  1. 客戶端發送寫命令;
  2. 服務端同步寫命令道AOF文件中;

從操作步驟上來看,aof的方式無疑更為安全,但由於每一步操作都需要記錄下來,效率相對低下,且會產生非常巨大的數據文件,恢復起來也很慢,相關配置如下:

# 是否打開aof日誌功能
appendonly no

# aof文件存放路徑與文件名稱
appendfilename appendonly.aof

# always:每一個命令都同步到aof文件中去
# everysec:每秒寫一次數據到aof文件中去
# no:交由操作系統判定緩存區大小,統一寫入aof
# 相比之下always最安全,但是由於每次都要寫入,開銷大,速度慢;no的速度最快,但是同步頻率比較低,容易丟失數據
#appendfsync always/everysec/no


# 在RDB操作時,是否停止aof操作,停止時,系統會等待rdb完成後,一次性將這期間的命令寫入到aof中去
no-appendfsync-on-rewrite no

# 配置是否重寫aof命令,該命令與auto-aof-rewrite-min-size配合使用,由於我們每次操作都會記錄到aof文件中,那麽aof文件就會變得非常龐大
# 例如我們對一個key進行了1000次set操作,最後他的結果是10,那麽aof就會記錄1000次,如果能根據數據庫將這些操作合並為set key 10就好了
# 使用這個命令可以保證當aof增長是原來的100%時,則發生重寫,這樣就會大幅縮小aof文件的大小,也會提升aof的數據恢復效率
auto-aof-rewrite-percentage 100 
# 當aof文件大於64mb時重寫
auto-aof-rewrite-min-size 64mb 

到這裏想必大家也對於持久化有了基本的認識了,順便推薦一本《Redis 設計與實現》翻資料的時候發現的,很適合入坑。

深入理解Redis(番外)——持久化