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持久化可以透過以下幾種方式觸發:
-
手動觸發:使用
SAVE
或BGSAVE
命令。SAVE
是同步命令,執行過程中會阻塞其他請求。BGSAVE
是非同步命令,主程式會forks一個子程式,進行非同步持久化,持久化過程中主程式仍然可以處理其他請求。 -
自動觸發:在配置檔案中設定觸發條件,redis.conf配置如下:
# 900s內至少有一次寫操作 save 900 1 # 300s內至少有1次寫操作 save 300 10 # 60s內至少有10000次寫操作 save 60 10000
-
關閉Redis時觸發:Redis在關閉服務時會自動觸發一次RDB持久化。
-
主從同步時觸發:當從節點連線到主節點時,主節點會觸發一次RDB持久化,並將生成的RDB檔案傳送給從節點進行同步。
3.3 RDB持久化優缺點
RDB持久化具有以下優點:
- 高效能:由於採用子程式進行磁碟操作,主程式無需進行磁碟IO,保證了Redis的高效能。
- 快速恢復:RDB檔案包含了某一時刻的完整資料快照,可以快速恢復資料。
- 更小的儲存空間:RDB檔案經過壓縮,佔用較小的磁碟空間。
RDB持久化的缺點包括:
- 資料丟失:由於RDB持久化是基於時間間隔的,可能存在一定程度的資料丟失。
- 子程式佔用記憶體:在生成RDB檔案過程中,子程式會佔用和主程式相同的記憶體空間,可能導致記憶體不足的問題。
4. AOF持久化
4.1 AOF持久化原理
AOF(Append Only File)持久化是一種基於日誌的持久化方式。Redis將所有的寫操作命令追加到一個AOF檔案中。當Redis重新啟動時,可以透過重放AOF檔案中的命令來恢復資料。
4.2 AOF持久化配置
AOF持久化的配置主要包括以下幾個方面:
-
啟用AOF持久化:在配置檔案中設定
appendonly yes
。# 開啟aof持久化 appendonly yes # aof檔名 appendfilename "appendonly.aof"
-
AOF檔案同步策略:在配置檔案中設定
appendfsync
選項。可選值包括:always
:每次寫操作都同步到磁碟,保證最高的資料安全性,但效能較差。everysec
:每秒同步一次磁碟,提供較好的資料安全性和效能平衡。no
:由作業系統決定何時同步磁碟,效能最好,但資料安全性較差。
# 持久化策略,always表示每次寫入都進行持久化 appendfsync always
-
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持久化具有以下優點:
- 更高的資料安全性:根據同步策略的選擇,AOF持久化可以保證較高的資料安全性。
- 更好的容錯性:即使AOF檔案存在部分損壞,仍可以恢復大部分資料。
AOF持久化的缺點包括:
- 較大的儲存空間:與RDB持久化相比,AOF檔案通常較大,佔用較多磁碟空間。
- 資料載入速度較慢:由於需要重放AOF檔案中的命令,資料恢復速度相對較慢。
5. 混合持久化
RDB持久化載入速度快,AOF持久化資料更安全,有沒有一種持久化方式結合兩者的優點?
當然有,就是混合持久化。
5.1 混合持久化原理
Redis首先使用RDB持久化將記憶體中的資料快照儲存到磁碟上,然後再使用AOF持久化將所有新的寫操作追加到AOF檔案中。這樣做的好處是:
- 在系統崩潰時,可以透過RDB檔案進行快速的恢復,而AOF檔案可以用於恢復最近的修改。
- RDB持久化可以減少AOF檔案的大小,從而減少磁碟空間的使用。
- 在RDB持久化中,Redis可以使用子程式來將快照寫入磁碟,這樣可以避免主程式的阻塞。
5.2 混合持久化優缺點
混合持久化具有以下優點:
- 高資料安全性:結合了AOF持久化的高資料安全性。
- 快速恢復:利用RDB持久化的快速資料恢復速度。
- 提高從節點同步效率:利用RDB檔案進行快速同步。
混合持久化的缺點包括:
較大的儲存空間:需要同時維護RDB檔案和AOF檔案,可能佔用較多的磁碟空間。
5.3 混合持久化應用場景
混合持久化適用於對資料安全性和效能要求較高的場景,尤其是在以下情況:
- 需要確保資料完整性,不能容忍資料丟失。
- 需要快速恢復資料,以減少故障恢復時間。
- 需要提高主從同步效率,以保證高可用性和負載均衡。
6. 持久化方案選擇
6.1 持久化方案對比
持久化方式 | RDB | AOF |
---|---|---|
原理 | 透過定期生成資料快照實現持久化 | 透過記錄所有寫操作命令實現持久化 |
資料安全性 | 可能會丟失最近一次快照以來的資料 | 更高,可透過配置同步策略降低資料丟失風險 |
恢復速度 | 較快,因為RDB檔案是一個資料快照 | 較慢,需要逐條執行AOF檔案中的命令 |
儲存空間 | 一般較小,因為RDB檔案經過壓縮 | 一般較大,但可以透過AOF重寫減小檔案大小 |
效能影響 | 較小,因為快照生成過程較短 | 可能較大,但可透過配置同步策略降低效能影響 |
主從同步 | 使用RDB檔案進行同步,同步速度較快 | 使用AOF檔案進行同步,同步速度可能較慢 |
應用場景 | 適用於對資料安全性要求較低、恢復速度要求較高的場景 | 適用於對資料安全性要求較高、可接受較慢恢復速度的場景 |
如果同時開啟了RDB和AOF持久化,Redis優先使用AOF持久化,因為AOF持久化可以保證更高的資料安全性和靈活性,而RDB持久化適用於資料恢復的場景。
6.2 持久化方案選擇
在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。
- 資料安全性要求:如果你的業務對資料安全性要求較高,建議使用AOF持久化或混合持久化。AOF持久化可以透過設定同步策略來保證不同程度的資料安全性。
- 資料恢復速度:如果你的業務需要快速恢復資料,以減少故障恢復時間,建議使用RDB持久化或混合持久化。RDB檔案包含某一時刻的完整資料快照,可以快速恢復資料。
- 儲存空間考慮:如果磁碟空間有限,可以考慮使用RDB持久化,因為RDB檔案經過壓縮,佔用較小的磁碟空間。然而,如果資料安全性要求較高,可以考慮使用混合持久化,儘管這會增加儲存空間的佔用。
- 主從同步效率:如果你使用了Redis主從架構,需要考慮主從同步效率。混合持久化可以利用RDB檔案進行快速同步,提高從節點的同步效率。
- 效能考慮:RDB持久化和混合持久化可以在很大程度上保持Redis的高效能。如果選擇AOF持久化,請選擇合適的同步策略以平衡效能和資料安全性。
7. 總結
本文介紹了Redis的三種持久化機制:RDB持久化、AOF持久化和混合持久化。
RDB持久化透過定期生成資料快照實現持久化,具有快速恢復和更小的儲存空間等優點,但可能存在資料丟失和子程式佔用記憶體等缺點。
AOF持久化透過記錄所有寫操作命令實現持久化,具有更高的資料安全性和更好的容錯性等優點,但可能存在較大的儲存空間和資料載入速度較慢等缺點。
混合持久化結合了RDB持久化和AOF持久化的優點,適用於對資料安全性和效能要求較高的場景。
在選擇Redis持久化方案時,需要根據實際業務需求和場景權衡各個方案的優缺點。
我是「一燈架構」,如果本文對你有幫助,歡迎各位小夥伴點贊、評論和關注,感謝各位老鐵,我們下期見