徹底搞懂Redis持久化機制,輕鬆應對工作面試

一燈架構發表於2023-04-20

image

1. 為什麼要持久化

Redis是基於記憶體儲存的資料庫,如果遇到服務重啟或者崩潰,記憶體中的資料將會被清空。所以為了確保資料安全性和可靠性,我們需要將記憶體中的資料持久化到磁碟上。

持久化不僅可以防止由於系統故障、重啟或者其他原因導致的資料丟失。還可以用於備份、資料恢復和遷移等操作。

2. Redis持久化機制概述

Redis提供了兩種主要的持久化機制:RDB持久化和AOF持久化。此外,還可以採用混合持久化(RDB + AOF)的方式,將這兩種持久化方式結合在一起。下面我們簡要概述這些持久化機制。

2.1 RDB持久化

RDB(Redis DataBase)持久化是一種基於快照的持久化方式。在指定的時間間隔內,如果滿足一定條件(如某段時間內發生的寫操作次數),Redis會生成一個包含當前記憶體資料的RDB檔案。這個RDB檔案可以用於資料恢復或備份。RDB持久化提供了較高的資料壓縮率和快速的資料載入速度,但可能存在一定程度的資料丟失。

2.2 AOF持久化

AOF(Append Only File)持久化是一種基於日誌的持久化方式。Redis將所有的寫操作命令記錄到一個AOF檔案中。當Redis重新啟動時,可以透過重放AOF檔案中的命令來恢復資料。AOF持久化提供了更高的資料安全性,可以保證資料的完整性。然而,與RDB持久化相比,AOF檔案通常較大,資料載入速度較慢。

2.3 混合持久化(RDB + AOF)

混合持久化結合了RDB持久化和AOF持久化的優點,可以在保證資料安全性的同時,提供較快的資料載入速度。在這種持久化方式下,Redis會同時生成RDB檔案和AOF檔案。當Redis重新啟動時,優先使用AOF檔案恢復資料,以確保資料的完整性。混合持久化適用於對資料安全性和效能要求較高的場景。

3. RDB持久化

3.1 RDB持久化原理

RDB持久化是基於快照的持久化,把當前時刻全量資料持久化到磁碟上,最終生成一個RBD檔案。

3.2 RDB持久化觸發方式

RDB持久化可以透過以下幾種方式觸發:

  1. 手動觸發:使用SAVEBGSAVE命令。SAVE是同步命令,執行過程中會阻塞其他請求。BGSAVE是非同步命令,主程式會forks一個子程式,進行非同步持久化,持久化過程中主程式仍然可以處理其他請求。

  2. 自動觸發:在配置檔案中設定觸發條件,redis.conf配置如下:

    # 900s內至少有一次寫操作
    save 900 1
    # 300s內至少有1次寫操作
    save 300 10
    # 60s內至少有10000次寫操作
    save 60 10000
    
  3. 關閉Redis時觸發:Redis在關閉服務時會自動觸發一次RDB持久化。

  4. 主從同步時觸發:當從節點連線到主節點時,主節點會觸發一次RDB持久化,並將生成的RDB檔案傳送給從節點進行同步。

3.3 RDB持久化優缺點

RDB持久化具有以下優點:

  1. 高效能:由於採用子程式進行磁碟操作,主程式無需進行磁碟IO,保證了Redis的高效能。
  2. 快速恢復:RDB檔案包含了某一時刻的完整資料快照,可以快速恢復資料。
  3. 更小的儲存空間:RDB檔案經過壓縮,佔用較小的磁碟空間。

RDB持久化的缺點包括:

  1. 資料丟失:由於RDB持久化是基於時間間隔的,可能存在一定程度的資料丟失。
  2. 子程式佔用記憶體:在生成RDB檔案過程中,子程式會佔用和主程式相同的記憶體空間,可能導致記憶體不足的問題。

4. AOF持久化

4.1 AOF持久化原理

AOF(Append Only File)持久化是一種基於日誌的持久化方式。Redis將所有的寫操作命令追加到一個AOF檔案中。當Redis重新啟動時,可以透過重放AOF檔案中的命令來恢復資料。

4.2 AOF持久化配置

AOF持久化的配置主要包括以下幾個方面:

  1. 啟用AOF持久化:在配置檔案中設定appendonly yes

    # 開啟aof持久化
    appendonly yes
    
    # aof檔名
    appendfilename "appendonly.aof"
    
  2. AOF檔案同步策略:在配置檔案中設定appendfsync選項。可選值包括:

    • always:每次寫操作都同步到磁碟,保證最高的資料安全性,但效能較差。
    • everysec:每秒同步一次磁碟,提供較好的資料安全性和效能平衡。
    • no:由作業系統決定何時同步磁碟,效能最好,但資料安全性較差。
    # 持久化策略,always表示每次寫入都進行持久化
    appendfsync always
    
  3. AOF重寫策略:在redis.conf檔案中進行配置,控制AOF重寫的觸發條件。

    # 指定在執行BGSAVE或BGREWRITEAOF命令時是否禁用AOF檔案同步。預設為yes,表示禁用同步。
    no-appendfsync-on-rewrite yes
    
    # 定AOF檔案大小增長到原始大小的百分比時進行重寫。
    # 預設為100,表示AOF檔案大小增長到原始大小的兩倍時進行重寫。
    auto-aof-rewrite-percentage 100
    
    # 指定進行AOF重寫的最小AOF檔案大小。預設為64mb。
    auto-aof-rewrite-min-size 64
    

4.3 AOF重寫(Rewrite)

隨著寫操作的不斷進行,AOF檔案會不斷增長。為了減小AOF檔案的大小,Redis提供了AOF重寫功能。AOF重寫會建立一個新的AOF檔案,只包含當前記憶體中資料的最小命令集。在重寫過程中,Redis會繼續將新的寫操作追加到原始AOF檔案中。當重寫完成後,新的AOF檔案將替換原始AOF檔案。

可以手動執行bgrewriteaof命令,觸發AOF重寫。

redis> bgrewriteaof

4.4 AOF持久化優缺點

AOF持久化具有以下優點:

  1. 更高的資料安全性:根據同步策略的選擇,AOF持久化可以保證較高的資料安全性。
  2. 更好的容錯性:即使AOF檔案存在部分損壞,仍可以恢復大部分資料。

AOF持久化的缺點包括:

  1. 較大的儲存空間:與RDB持久化相比,AOF檔案通常較大,佔用較多磁碟空間。
  2. 資料載入速度較慢:由於需要重放AOF檔案中的命令,資料恢復速度相對較慢。

5. 混合持久化

RDB持久化載入速度快,AOF持久化資料更安全,有沒有一種持久化方式結合兩者的優點?

當然有,就是混合持久化。

5.1 混合持久化原理

Redis首先使用RDB持久化將記憶體中的資料快照儲存到磁碟上,然後再使用AOF持久化將所有新的寫操作追加到AOF檔案中。這樣做的好處是:

  1. 在系統崩潰時,可以透過RDB檔案進行快速的恢復,而AOF檔案可以用於恢復最近的修改。
  2. RDB持久化可以減少AOF檔案的大小,從而減少磁碟空間的使用。
  3. 在RDB持久化中,Redis可以使用子程式來將快照寫入磁碟,這樣可以避免主程式的阻塞。

5.2 混合持久化優缺點

混合持久化具有以下優點:

  1. 高資料安全性:結合了AOF持久化的高資料安全性。
  2. 快速恢復:利用RDB持久化的快速資料恢復速度。
  3. 提高從節點同步效率:利用RDB檔案進行快速同步。

混合持久化的缺點包括:

較大的儲存空間:需要同時維護RDB檔案和AOF檔案,可能佔用較多的磁碟空間。

5.3 混合持久化應用場景

混合持久化適用於對資料安全性和效能要求較高的場景,尤其是在以下情況:

  1. 需要確保資料完整性,不能容忍資料丟失。
  2. 需要快速恢復資料,以減少故障恢復時間。
  3. 需要提高主從同步效率,以保證高可用性和負載均衡。

6. 持久化方案選擇

6.1 持久化方案對比

持久化方式 RDB AOF
原理 透過定期生成資料快照實現持久化 透過記錄所有寫操作命令實現持久化
資料安全性 可能會丟失最近一次快照以來的資料 更高,可透過配置同步策略降低資料丟失風險
恢復速度 較快,因為RDB檔案是一個資料快照 較慢,需要逐條執行AOF檔案中的命令
儲存空間 一般較小,因為RDB檔案經過壓縮 一般較大,但可以透過AOF重寫減小檔案大小
效能影響 較小,因為快照生成過程較短 可能較大,但可透過配置同步策略降低效能影響
主從同步 使用RDB檔案進行同步,同步速度較快 使用AOF檔案進行同步,同步速度可能較慢
應用場景 適用於對資料安全性要求較低、恢復速度要求較高的場景 適用於對資料安全性要求較高、可接受較慢恢復速度的場景

如果同時開啟了RDB和AOF持久化,Redis優先使用AOF持久化,因為AOF持久化可以保證更高的資料安全性和靈活性,而RDB持久化適用於資料恢復的場景。

6.2 持久化方案選擇

在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。

  1. 資料安全性要求:如果你的業務對資料安全性要求較高,建議使用AOF持久化或混合持久化。AOF持久化可以透過設定同步策略來保證不同程度的資料安全性。
  2. 資料恢復速度:如果你的業務需要快速恢復資料,以減少故障恢復時間,建議使用RDB持久化或混合持久化。RDB檔案包含某一時刻的完整資料快照,可以快速恢復資料。
  3. 儲存空間考慮:如果磁碟空間有限,可以考慮使用RDB持久化,因為RDB檔案經過壓縮,佔用較小的磁碟空間。然而,如果資料安全性要求較高,可以考慮使用混合持久化,儘管這會增加儲存空間的佔用。
  4. 主從同步效率:如果你使用了Redis主從架構,需要考慮主從同步效率。混合持久化可以利用RDB檔案進行快速同步,提高從節點的同步效率。
  5. 效能考慮:RDB持久化和混合持久化可以在很大程度上保持Redis的高效能。如果選擇AOF持久化,請選擇合適的同步策略以平衡效能和資料安全性。

7. 總結

本文介紹了Redis的三種持久化機制:RDB持久化、AOF持久化和混合持久化。
RDB持久化透過定期生成資料快照實現持久化,具有快速恢復和更小的儲存空間等優點,但可能存在資料丟失和子程式佔用記憶體等缺點。
AOF持久化透過記錄所有寫操作命令實現持久化,具有更高的資料安全性和更好的容錯性等優點,但可能存在較大的儲存空間和資料載入速度較慢等缺點。
混合持久化結合了RDB持久化和AOF持久化的優點,適用於對資料安全性和效能要求較高的場景。
在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。

我是「一燈架構」,如果本文對你有幫助,歡迎各位小夥伴點贊、評論和關注,感謝各位老鐵,我們下期見

image

相關文章