1、概述
1.1、Redis持久化的重要性
- 數據恢復:Redis是一個內存數據庫,如果系統或服務宕機,內存中的數據將會丟失。Redis的持久化機制可以把數據保存到磁盤上,以便在系統重啟后恢復數據。這是Redis持久化最基本也是最重要的功能。
- 故障恢復:持久化機制可以幫助Redis在出現系統或數據崩潰時,安全地復原所有數據,避免可能出現的數據丟失。這對于維護企業級Web應用系統的穩定性和可用性至關重要。
- 保證數據一致性:通過定期持久化,可以確保即使在數據更新頻繁的情況下,也能保持數據的一致性。這對于需要保證數據準確性的應用來說是非常重要的。
- 支持備份和恢復:持久化文件可以定期備份到其他存儲設備,這樣在遇到災難性故障時,可以從備份中恢復數據,減少損失。
1.2、持久化對Redis性能的影響
在選擇和使用Redis的持久化機制時,需要根據實際的應用場景和需求來權衡持久化和性能之間的關系。例如,可以通過調整持久化的頻率、使用更快的磁盤、優化磁盤I/O等方式來減少持久化對Redis性能的影響。同時,也需要關注Redis的監控和調優,及時發現和解決性能問題。
- 寫操作的延遲:由于持久化需要將數據寫入磁盤,這會導致寫操作有一定的延遲。特別是在使用AOF持久化時,每次寫操作都需要追加到磁盤上的日志文件,這可能會增加寫操作的延遲。
- CPU和內存資源的占用:在進行持久化操作時,Redis需要fork一個子進程來處理持久化任務。這個過程會消耗一定的CPU和內存資源,對Redis的性能有一定的影響。尤其是在大數據量的情況下,fork操作本身可能會消耗較多的系統資源。
- 磁盤I/O的影響:持久化需要將數據寫入磁盤,這會受到磁盤I/O性能的影響。如果磁盤性能較差,或者磁盤I/O負載較高,那么持久化操作可能會成為Redis性能的瓶頸。
- 數據恢復的時間:在Redis重啟時,需要加載持久化文件來恢復數據。這個過程可能會消耗一定的時間,導致Redis在啟動時的性能下降。
1.3、Redis的三種持久化方式概述
Redis提供了三種持久化方式,分別是RDB(Redis DataBase)持久化、AOF(Append Only File)持久化和混合持久化。下面簡要概述這三種方式的工作原理和特點:
- RDB持久化:RDB持久化生成的快照文件是一個緊湊壓縮的二進制文件,占用空間較小,適用于備份和全量復制等場景。同時,由于快照文件是完整的數據備份,因此恢復速度較快。但是,RDB持久化可能存在數據丟失的風險,因為它只保存了某個時間點的數據快照,無法記錄數據的變化過程。
- AOF持久化:AOF持久化可以記錄數據的變化過程,因此即使出現宕機等故障,也只會丟失最后一次持久化之后的數據,保證了數據的可靠性。同時,AOF文件是以文本形式存儲的,易于閱讀和解析。但是,AOF持久化可能會產生較大的I/O開銷,并且在數據恢復時可能需要較長的時間。
- 混合持久化:混合持久化結合了RDB和AOF兩種持久化方式的優點,既保證了數據的可靠性,又提高了數據恢復的速度。但是,混合持久化可能會增加持久化文件的復雜性和管理難度。
2、RDB持久化
RDB持久化是通過生成數據快照(Snapshot)的方式,將當前Redis進程的數據持久化到磁盤上。觸發RDB持久化的方式可以是手動觸發(如使用SAVE或BGSAVE命令),也可以是自動觸發(如根據配置文件中指定的時間間隔和鍵值對數量進行觸發)。
RDB持久化的方式:定時持久化(Save)、觸發持久化(Save、Bgsave)。
2.1、RDB持久化的優缺點
(1)優點:
- 數據緊湊:RDB生成的數據快照是一個緊湊的二進制文件,占用空間較小,這對于存儲和傳輸都非常有利。
- 恢復速度快:由于RDB文件是完整的數據備份,因此在恢復數據時,只需要加載RDB文件即可,恢復速度較快。
- 適合備份:RDB文件非常適合用于進行備份和災難恢復,特別是在數據量大且對恢復時間要求較高的場景下。
(2)缺點:
- 數據丟失風險:RDB持久化只能保存某個時間點的數據快照,如果Redis進程在兩次快照之間宕機,那么這期間的數據變更將會丟失。因此,RDB持久化可能無法滿足對數據完整性要求較高的應用。
- fork操作開銷大:在生成RDB快照時,Redis需要fork一個子進程來進行持久化操作。這個fork操作可能會消耗較多的CPU和內存資源,對Redis的性能有一定的影響。特別是在大數據量的情況下,fork操作可能會成為性能瓶頸。
- 版本兼容性問題:由于RDB文件使用特定二進制格式保存,因此在Redis版本更新過程中,可能存在老版本Redis服務無法兼容新版RDB格式的問題,導致數據無法正確恢復。
2.2、實現方式
(1)自動觸發
修改Redis配置文件。
SAVE seconds changes
// 在seconds秒內觸發了changes次寫操作,就自動觸發持久化
(2)手動觸發
在客服端命令行中直接敲命令,redis服務器重啟后失效。
SAVE // 在Redis主進程中進行數據持久化,會阻塞Redis服務器。
BGSAVE // 開辟一個Redis服務(fork)進行同步,不會造成Redis主服務器阻塞。
2.3、總結
- RDB持久化模式是全量持久化方式,在N秒后并且滿足K條寫操作,就會將這個時間段內的所有數據持久化到磁盤中的dump.rdb文件中。
- 盡量不要吧備份文檔(dump.rdb)和Redis服務器放在同一臺機器上,以防止物理機損壞后備份文件也損壞。
3、AOF持久化
AOF持久化是通過記錄Redis服務器接收到的所有寫操作命令,并以文本的形式追加到磁盤上的AOF文件中。當Redis重啟時,會通過重新執行AOF文件中的命令來恢復數據。
- Redis默認是沒有開啟AOF持久化的,需要在配置文件中配置:
appendonly
,改為yes重啟服務就可以了。 - AOF文件有一個膨脹合并的操作,當AOF文件的大小達到閾值的時候就會進行命令壓縮,也就是AOF重寫。
- AOF緩存區會根據寫回策略將緩存區中的命令寫回磁盤AOF文件中。
3.1、AOF持久化的優缺點
(1)優點:
- 更高的數據安全性:AOF持久化可以記錄Redis服務器接收到的所有寫操作命令,因此即使Redis進程意外宕機,也只會丟失最后一次持久化之后的數據,從而保證了數據的可靠性。
- 易于數據恢復:由于AOF文件以文本形式存儲了所有的寫操作命令,因此在數據恢復時,只需要重新執行這些命令即可,恢復過程相對簡單。
- 對Redis性能影響較小:AOF持久化在進行寫操作時,只是簡單地將命令追加到AOF文件中,而不會像RDB持久化那樣需要fork子進程進行數據快照的生成,因此對Redis性能的影響較小。
(2)缺點:
- 文件體積較大:由于AOF文件記錄了所有的寫操作命令,因此隨著時間的推移,AOF文件的體積可能會變得非常大,這可能會占用大量的磁盤空間。
- 恢復速度較慢:在Redis重啟進行數據恢復時,需要逐行執行AOF文件中的命令,這可能會導致恢復速度較慢,特別是在AOF文件體積較大的情況下。
- 可能存在數據不一致的風險:如果AOF文件在寫入過程中發生錯誤或者損壞,可能會導致數據恢復時出現不一致的情況。此外,如果AOF文件的同步策略配置不當,也可能會導致數據丟失。
3.2、實現方式
在 Redis 中 AOF 持久化功能默認是不開啟的,需要我們修改 redis.conf 配置文件中的以下參數:
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
3.3、寫回策略
寫回策略需要修改配置文件中的appendfsync指令。
appendfsync everysec // 默認
- always:同步寫回,每個命令執行完畢后立刻同步回磁盤。這種策略可以確保數據的完整性和安全性,因為即使Redis進程意外宕機,也不會丟失任何數據。但是,由于每次寫操作都需要同步寫回磁盤,會對Redis的性能產生一定的影響,特別是在高并發場景下。
- everysec:默認值,每隔一秒將緩存區中的命令寫入磁盤AOF文件中。可以在一定程度上平衡數據的安全性和性能。但是,如果Redis進程在某一秒內意外宕機,那么這一秒內的數據將會丟失。
- no:由操作系統決定什么時候同步到磁盤中,這種策略可以最大化地提高Redis的性能,因為寫回操作完全由操作系統控制,不會受到Redis進程的影響。但是,這也意味著數據的安全性完全依賴于操作系統的寫回策略,如果操作系統出現故障或者宕機,可能會導致數據丟失。
3.4、AOF重寫機制
當AOF文件的大小超過所設置的閾值后,redis就會自動啟動AOF文件的內容壓縮,只保留可以恢復數據的最小指令集。
可以在redis.conf文件中查看閾值:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
或者手動使用命令來執行重寫機制:bgrewriteaof
。
4、混合持久化
混合持久化是Redis 4.0之后新增的一種方式,結合了RDB和AOF的優點。在寫入時,先將當前的數據以RDB的形式寫入文件的開頭,再將后續的操作命令以AOF的格式存入文件。這樣既能保證Redis重啟時的速度,又能降低數據丟失的風險。
在同時開啟RDB和AOF時,Redis重啟的時候只會加載AOF文件,而不會加載RDB文件,AOF文件的優先級比RDB文件的優先級高,只有AOF文件不存在的時候才會讀取RDB文件。
- RDB做全量持久化。
- AOF做增量持久化。
4.1、混合模式的優缺點
(1)優點:
- 結合了RDB和AOF的優點:混合持久化結合了RDB持久化的數據緊湊性和AOF持久化的數據安全性,既保證了數據的可靠性,又提高了數據恢復的速度。
- 降低了數據丟失的風險:由于混合持久化結合了AOF持久化,因此即使Redis進程在RDB快照生成之后宕機,也可以通過AOF文件來恢復數據,降低了數據丟失的風險。
- 提高了重啟速度:混合持久化在AOF文件的前半部分包含了RDB格式的全量數據,這使得Redis在重啟時可以先加載RDB快照,快速恢復到宕機前的狀態,然后再通過AOF文件中的增量命令來恢復后續的數據變更,從而提高了重啟速度
(2)缺點:
- AOF文件可讀性變差:由于混合持久化在AOF文件的前半部分添加了RDB格式的全量數據,這使得AOF文件的可讀性變差,不易于閱讀和解析。
- 版本兼容性問題:混合持久化是Redis 4.0之后引入的新特性,因此在使用混合持久化時,需要確保Redis的版本支持混合持久化。如果Redis版本過低,可能無法正確加載混合持久化生成的AOF文件。
- 可能增加持久化文件的復雜性:混合持久化生成的AOF文件既包含了RDB格式的全量數據,又包含了AOF格式的增量命令,這使得AOF文件的結構和內容變得更加復雜。在管理和維護時可能需要更多的注意和操作。