1. 程式人生 > 其它 >Redis的持久化機制

Redis的持久化機制

目錄

RDB (redis database)

1、什麼是RDB

每隔一段時間,把記憶體中的資料寫入磁碟臨時檔案,作為快照,恢復的時候把快照檔案讀進記憶體。如果宕機重啟,再次啟動redis後,快照資料會恢復到記憶體。

2、備份與恢復

記憶體備份 -> 磁碟臨時檔案
磁碟臨時檔案 -> 恢復到記憶體

3、RDB優劣

優勢:

  • 每隔一段時間備份,全量備份
  • 災備簡單,可以遠端傳輸
  • 子程序備份的時候,主程序不會有任何的IO操作(不會有寫入修改或刪除),保證備份資料的完整性
  • 相對AOF機制來說,當有更大檔案時可以快速重啟恢復

劣勢:

  • 發生故障時,有可能會丟失最後一次備份資料
  • 子程序佔用的記憶體比會和父程序一摸一樣,如會造成CPU負擔
  • 由於定時全量備份是重量級操作,所以對於實時備份。就無法處理了

4、RDB的配置

  • 備份檔案儲存位置配置,可以在 redis.conf 配置檔案中自己配置

  • 儲存機制配置

save 900 1     # 如果有1個key值更新,那麼會在900秒後備份
save 300 10    # 如果有10個key值更新,那麼會在300秒後備份
save 60 10000  # 如果有10000個key值更新,那麼會在60秒後備份
  • stop-writes-on-bgsave-error yes

    yes: 如果save過程出錯,則停止寫操作; no: 可能造成資料不一致

  • rdbcompression yes

    yes:開啟rdb壓縮模式;no:關閉,會節約cpu損耗,但是檔案會大,道理同nginx

  • rdbchecksum yes

    yes:使用CRC64演算法校驗對rdb進行資料校驗,有10%效能損耗; no:不校驗

總結:

RDB適合大量資料的恢復,但是資料的完整性和一致性可能會不足。

AOF (append only file)

RDB會丟失最後一次備份的rdb檔案,但是其實也無所謂,其實也可以忽略不計,畢竟是快取,丟了就丟了,但是如果追求資料的完整性,那就的考慮使用AOF了.

1、特點

  • 以日誌的形式來記錄使用者請求的寫操作。讀操作不會記錄,因為寫操作才會存儲存。
  • 檔案以追加的形式而不是修改的形式。
  • redis的aof恢復其實就是把追加的檔案從開始到結尾讀取執行寫操作。

2、優劣

優勢:

  • AOF更加耐用,可以以秒級別為單位備份,如果發生問題,也只會丟失最後一秒的資料,大大增加了可靠性和資料完整性。所以AOF可以每秒備份一次,使用fsync操作。

  • 以log日誌形式追加,如果磁碟滿了,會執行 redis-check-aof 工具。

  • 當資料太大的時候,redis可以在後臺自動重寫aof。當redis繼續把日誌追加到老的檔案中去時,重寫也是非常安全的,不會影響客戶端的讀寫操作。

  • AOF 日誌包含的所有寫操作,會更加便於redis的解析恢復。

劣勢:

  • 相同的資料,同一份資料,AOF比RDB大

  • 針對不同的同步機制,AOF會比RDB慢,因為AOF每秒都會備份做寫操作,這樣相對與RDB來說就略低。 每秒備份fsync沒毛病,但是如果客戶端的每次寫入就做一次備份fsync的話,那麼redis的效能就會下降。

  • AOF發生過bug,就是資料恢復的時候資料不完整,這樣顯得AOF會比較脆弱,容易出現bug,因為AOF沒有RDB那麼簡單,但是呢為了防止bug的產生,AOF就不會根據舊的指令去重構,而是根據當時快取中存在的資料指令去做重構,這樣就更加健壯和可靠了。

AOF的配置

同樣redis.conf 配置檔案中

# AOF 預設關閉,yes可以開啟
appendonly no

# AOF 的檔名
appendfilename "appendonly.aof"

# no:不同步
# everysec:每秒備份,推薦使用
# always:每次操作都會備份,安全並且資料完整,但是慢效能差
appendfsync everysec

# 重寫的時候是否要同步,no可以保證資料安全
no-appendfsync-on-rewrite no

# 重寫機制:避免檔案越來越大,自動優化壓縮指令,會fork一個新的程序去完成重寫動作,新程序裡的記憶體資料會被重寫,此時舊的aof檔案不會被讀取使用,類似rdb
# 當前AOF檔案的大小是上次AOF大小的100% 並且檔案體積達到64m,滿足兩者則觸發重寫
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

到底採用RDB還是AOF呢

  • 如果你能接受一段時間的快取丟失,那麼可以使用RDB

  • 如果你對實時性的資料比較care,那麼就用AOF

  • 使用RDB和AOF結合一起做持久化,RDB做冷備,可以在不同時期對不同版本做恢復,AOF做熱備,保證資料僅僅只有1秒的損失。當AOF破損不可用了,那麼再用RDB恢復,這樣就做到了兩者的相互結合,也就是說Redis恢復會先載入AOF,如果AOF有問題會再載入RDB,這樣就達到冷熱備份的目的了。