一、RDB(Redis DataBase)
- RDB 全程是 Redis DataBase,它是一種將 Redis 在某一時刻內存中的數據以快照形式保存到磁盤的機制 ,相當于給執行save/bgsave命令時刻的內存數據庫數據拍了一張快照
- 我們如果通過save命令來執行快照,由于 Redis 是單線程模型,save命令會阻塞主線程,因為快照生成的過程比執行普通指令耗時更長,在此期間 Redis 無法處理客戶端請求。而bgsave命令會 fork 出一個子進程,由子進程在后臺執行備份工作,主線程可以繼續處理客戶端請求,不會造成阻塞。因此在實際應用中,推薦使用bgsave來生成 RDB 快照。需要注意的是,fork 子進程時會有短暫的阻塞,且會占用一定內存(基于寫時復制技術,父子進程共享內存,只有在數據發生修改時才會為子進程分配獨立內存)
- RDB 的優點是:
- 第一個是 RDB 生成的快照文件經過了二進制壓縮,體積相對較小。雖然 Redis 是內存數據庫,但數據量可能較大,不過經過壓縮處理后的 RDB 文件依然便于存儲和傳輸
- 第二個是它恢復數據的速度很快,因為在數據恢復時,直接將 RDB 文件中的數據一次性加載到內存即可,不需要像 AOF 那樣逐條重放日志。所以 RDB 適合做數據備份和災難恢復
- RDB 的缺點是:
- 第一個,兩次快照之間的數據可能會丟失。例如第一次快照后隔了很長時間才進行下一次快照,那么萬一數據庫宕機,就會丟失這兩次快照間隔期間的數據
- 第二個,如果頻繁執行快照,即使使用bgsave開啟后臺線程進行工作,fork 子進程以及子進程進行數據持久化操作都會占用 CPU、內存等系統資源,對服務器性能產生一定影響
二、AOF(Append Only File)
- Redis 會在硬盤上創建一個 AOF(Append Only File)文件,該文件用于記錄服務器執行的所有寫操作命令
- Redis 提供了三種 AOF 寫策略:
- always:每次執行寫操作后,Redis 主線程會立即將寫操作同步到硬盤上的 AOF 文件中。這種策略能保證數據的最高安全性,因為一旦寫操作執行成功,就會被持久化到磁盤,但會對性能產生較大影響,因為每次寫操作都涉及磁盤 I/O
- everysec:Redis 會使用一個后臺線程(更準確地說是子線程)每秒將這一秒內發生的寫操作追加到 AOF 文件中。這種策略在性能和數據安全性之間做了平衡,即使服務器發生故障,最多只會丟失一秒內的數據
- no:將數據寫入 AOF 文件的操作完全交給操作系統決定。Redis 只負責將寫操作追加到 AOF 緩沖區,由操作系統決定何時將緩沖區的數據刷新到磁盤。這種策略性能最高,但數據安全性最低,因為在操作系統未將數據刷新到磁盤時服務器宕機,可能會丟失較多數據
- AOF 的缺點在于:
- 由于 AOF 文件持續記錄寫操作,隨著時間推移和寫操作的增加,AOF 文件會變得越來越大,這會占用大量的磁盤空間
- 在恢復數據時,相較于 RDB 方式,AOF 恢復速度較慢。因為 Redis 單線程需要將 AOF 文件中的所有寫操作命令依次重新執行一遍,而 RDB 是直接將數據加載到內存
- 此外,Redis 為了解決 AOF 文件過大的問題,提供了 AOF 重寫機制,它可以在不改變數據庫狀態的前提下,將 AOF 文件中冗余的命令合并,從而減小 AOF 文件的體積
三、RDB vs AOF如何選擇?
- 如果需要快速恢復數據,采用 RDB 是比較合適的選擇。RDB 是將 Redis 某一時刻的內存數據以快照形式保存到磁盤,恢復數據時直接將 RDB 文件加載到內存,無需像 AOF 那樣重新執行大量的寫命令,因此恢復速度較快,能在短時間內讓 Redis 服務恢復到之前的狀態
- 如果需要保證數據的絕對安全,AOF(always)策略是一個好的選擇。使用?
always
?策略時,每次寫操作都會立即同步到磁盤上的 AOF 文件中,這樣即使 Redis 服務器發生故障或意外宕機,也不會丟失任何已執行的寫操作數據,最大程度地保證了數據的完整性和安全性。不過,這種策略會對 Redis 的性能產生較大影響,因為頻繁的磁盤 I/O 操作會成為性能瓶頸 - 在高并發場景下,選擇 RDB + AOF 結合的策略通常是比較明智的。RDB 可以定期生成數據快照,用于全量數據備份和在需要時快速恢復數據,減輕數據恢復的時間成本;AOF 采用 everysec 策略(而不是 always 策略,因為 always 策略在高并發下性能損耗過大),每秒將寫操作同步到 AOF 文件,在保證數據安全性(最多丟失 1 秒的數據)的同時,也不會對性能造成太大的影響。兩者結合,既能滿足高并發場景下對性能的要求,又能在一定程度上保證數據的安全性和可恢復性
四、總結與持久化配置建議
- 在通用場景下,采用RDB(每天定時執行) + AOF(everysec)結合的策略是較為常見且合理的選擇
- 如果對數據安全性要求極高,可以采用 AOF(always)策略