Redis AOF 和 RDB 持久化策略原理

1、數據持久化

默認狀況下 Redis 的數據都是保存在內存中,爲避免 Redis 進程意外退出而致使數據丟失的問題,Redis 提供了 RDB 和 AOF 兩種方式來實現數據的持久化存儲。git

2、RDB 機制

RDB 機制是以指定的時間間隔將 Redis 中的數據生成快照並保存到硬盤中,它更適合於定時備份數據的應用場景。能夠經過手動或者自動的方式來觸發 RDB 機制:github

2.1 手動觸發

能夠經過如下兩種方式來手動觸發 RDB 機制:redis

  • save :save 命令會阻塞當前 Redis 服務,直到 RDB 備份過程完成,在這個時間內,客戶端的全部查詢都會被阻塞;
  • bgsave :Redis 進程會 fork 出一個子進程,阻塞只會發生在 fork 階段,以後持久化的操做則由子進程來完成。

2.2 自動觸發

除了手動使用命令觸發外,在某些場景下也會自動觸發 Redis 的 RDB 機制:算法

  • redis.conf 中配置了 save m n ,表示若是在 m 秒內存在了 n 次修改操做時,則自動觸發bgsave;
  • 若是從節點執行全量複製操做,則主節點自動執行bgsave,並將生成的 RDB 文件發送給從節點;
  • 執行 debug reload 命令從新加載 Redis 時,會觸發save操做;
  • 執行 shutdown 命令時候,若是沒有啓用 AOF 持久化則默認採用bgsave進行持久化。

2.3 相關配置

1. 文件目錄shell

RDB 文件默認保存在 Redis 的工做目錄下,默認文件名爲 dump.rdb,能夠經過靜態或動態方式修改:數據庫

  • 靜態配置:經過修改 redis.conf 中的工做目錄dir和數據庫存儲文件名dbfilename兩個配置;安全

  • 動態修改:經過在命令行中執行如下命令:網絡

    config set dir{newDir}
    config set dbfilename{newFileName}
    複製代碼

2. 壓縮算法app

Redis 默認採用 LZF 算法對生成的 RDB 文件作壓縮處理, 這樣能夠減小佔用空間和網絡傳輸的數據量,可是壓縮過程會耗費 CPU 的計算資源, 你能夠按照實際狀況,選擇是否啓用。能夠經過修改 redis.conf 中的 rdbcompression 配置或使用如下命令來進行動態修改:運維

config set rdbcompression{yes|no}
複製代碼

3、AOF 機制

AOF 是 Redis 提供的另一種持久化的方式,它以獨立日誌的方式記錄每次寫入操做,重啓時再從新執行這些操做,從而達到恢復數據的命令。

3.1 執行原理

開啓 AOF 機制後,全部的寫入命令都會追加到 aof_buf 緩衝區中,並按照指定的策略定時將緩衝區中的數據同步到磁盤上。 AOF 除了記錄每條命令外,還會在適當的時候 fork 出一個子進程對 AOF 文件進行重寫,在重寫過程當中,Redis 會將能夠合併的語句進行合併,將無效的語句進行刪除,從而減少 AOF 文件的體積,以便減小文件的佔用空間和方便在數據恢復時可以更快的進行加載。

3.2 同步策略

Redis 提供了三種同步策略,用於控制 AOF 緩衝區同步數據到磁盤上的行爲,由參數appendfsync控制:

可選配置 說明
always 命令寫入 aof_buf 後就調系統 fsync 操做同步到 AOF 文件
everysec 命令寫入 aof_buf 後就調用系統的 write 操做,但 fsync 同步文件的操做則由專門線程每秒調用一次
no 命令寫入 aof_buf 後就調用系統的 write 操做,不對 AOF 文件作 fsync 同步,同步操做由操做系統負責,一般同步週期最長爲30秒

write 和 fsync 操做說明:

  • write 操做會觸發延遲寫機制,Linux 在內核提供頁緩衝區用來提升硬盤的 IO 性能,write 操做在寫入系統緩衝區後直接返回。同步操做依賴於系統調度機制,例如緩衝區頁空間寫滿或達到特定時間週期。 同步文件以前,若是此時系統故障宕機,緩衝區內數據將丟失。
  • fsync 針對單個文件操做,作強制硬盤同步,fsync 操做將阻塞直到寫入硬盤完成後返回,它保證了數據持久化的安全。

Redis 默認的同步機制爲everysec,此時可以兼顧性能和保證數據安全,在發生意外宕機的時,最多會丟失一秒的數據。

3.3 相關配置

想要使用 AOF 功能,須要配置 appendonly的值爲yes,默認值爲no。默認 AOF 的文件名爲 appendonly.aof, 能夠經過修改appendfilename的值進行修改,和 RDB 文件的保存位置同樣,默認保存在 Redis 的工做目錄下。

4、對比分析

4.1 優勢與缺點

RDB 的優勢

  • RDB 使用一次性生成內存快照的方式, 產生的文件緊湊壓縮比更高, 適用於備份和全量複製等場景。
  • RDB 文件一般比同一數據集的等效 AOF 文件小,因此使用 RDB 恢復數據遠遠快於 AOF 方式。
  • RDB 最大限度地提升了 Redis 的性能,由於 Redis 父進程只須要 fork 出一個子進程,它本生並不會執行磁盤 I/O 等操做。

RDB 的缺點

  • RDB 方式沒辦法作到數據的實時持久化,假設每次持久化的時間間隔是 5 分鐘,當在上一次持久化後 3 分鐘後發生了服務宕機,則這三分鐘內的數據會所有丟失。
  • fork 操做是一個重量級的操做,若是數據集很大,Fork 操做可能會很是耗時。

AOF 的優勢

  • AOF 可以實現實時或秒級的持久化操做,可以保證數據的最少丟失。
  • 若是忽然宕機,日誌以半寫命令結束,可使用 redis-check-aof 工具進行修復,從而保證數據最少丟失。

AOF 的缺點

  • AOF 文件一般比同一數據集等效的 RDB 文件大。
  • 根據選擇的同步策略的不一樣,AOF 可能比 RDB 還慢。

4.2 使用建議

按照 Redis 官方的推薦,爲保證的數據安全性,能夠同時使用這兩種持久化機制,在 Redis 官方的長期計劃裏面,將來可能會將 AOF 和 RDB 統一爲單一持久化模型。須要注意的是,在這種狀況下,當 Redis 從新啓動時,Redis 將使用 AOF 文件重建數據集,由於它能夠保證數據的最少丟失。

參考資料

  1. 付磊,張益軍 . 《Redis 開發與運維》. 機械工業出版社 . 2017-3-1
  2. 官方文檔:Redis Persistence

更多文章,歡迎訪問 [全棧工程師手冊] ,GitHub 地址:github.com/heibaiying/…

相關文章
相關標籤/搜索