Redis 高级特性(3)—— 持久化及数据恢复
1. 持久化概念
所謂持久化是指將數(shù)據(jù)從內(nèi)存中以某種形式同步到硬盤中,在 redis 重啟后能夠根據(jù)硬盤中的記錄恢復(fù)數(shù)據(jù)。Redis 持久化有兩種方式,分別為 RDB 【快照】方式 和 AOF 【日志】方式。
1. RDB 【快照】方式
RDB 持久化是 Redis 的默認(rèn)支持,無需進(jìn)行配置。RDB 是指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤。
當(dāng)符合一定規(guī)則時,Redis 自動將內(nèi)存中的所有數(shù)據(jù)生成一份副本并存儲到硬盤上。分為以下四種情況:
-
根據(jù)配置規(guī)則自動進(jìn)行快照
SAVE 900 1 SAVE 300 10 SAVE 60 1000SAVE 900 1 表示 900s 內(nèi)有一個或一個以上的鍵被更改則進(jìn)行快照配置文件中
-
用戶執(zhí)行 SAVE 或 BGSAVE 命令
(1) SAVE 命令
Redis 會同步的進(jìn)行快照操作,在快照執(zhí)行過程中會阻塞所有來自客戶端請求。
(2) BGSAVE 命令
Redis 會在后臺異步地進(jìn)行快照操作,在快照執(zhí)行過程服務(wù)端可以繼續(xù)響應(yīng)來自客戶端的請求.
具體操作是 Redis 進(jìn)程執(zhí)行 fork 操作創(chuàng)建子進(jìn)程,RDB 持久化過程由子進(jìn)程負(fù)責(zé),完成后自動結(jié)束。阻塞只發(fā)生在 fork 階段,一般時間很短。建議使用。 -
執(zhí)行 FLUSHALL 命令
只要快照配置條件不為空,執(zhí)行該命令時就會執(zhí)行一次快照操作;而當(dāng)沒有定義快照條件時,即使執(zhí)行該命令也不會執(zhí)行快照操作
-
執(zhí)行復(fù)制 replication
即使沒有定義自動快照條件,且沒有手動執(zhí)行過快照操作,進(jìn)行復(fù)制操作時也會進(jìn)行自動快照
2. AOF 【日志】方式
該機(jī)制將以日志的形式記錄服務(wù)器所處理的每一個寫操作,在 Redis 服務(wù)器啟動之初會讀取該文件來重新構(gòu)建數(shù)據(jù)庫,以保證啟動后數(shù)據(jù)庫中的數(shù)據(jù)是完整的。
- 默認(rèn)關(guān)閉,通過 appendonly yes 可開啟
- 開啟后,每執(zhí)行一條更改數(shù)據(jù)庫中的命令時,Redis 都會將該命令寫入硬盤的 AOF 文件
- 達(dá)到一定條件時,Redis 會自動重寫 AOF 文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
- 啟動時 Redis 會逐個執(zhí)行 AOF 文件中的命令將硬盤中的數(shù)據(jù)載入到內(nèi)存中
- appendfsync everysec 通過配置文件中的該配置項(xiàng),可使硬盤緩存中的數(shù)據(jù)每 1s 同步一次到真正的硬盤中
事實(shí)上由于操作系統(tǒng)緩存機(jī)制,數(shù)據(jù)并沒有真正寫入硬盤,而是進(jìn)入系統(tǒng)硬盤緩存。
兩者區(qū)別:
RDB 持久化是指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,實(shí)際操作過程是 fork 一個子進(jìn)程,先將數(shù)據(jù)集寫入臨時文件,寫入成功后,再替換之前的文件,用二進(jìn)制壓縮存儲。
AOF 持久化以日志的形式記錄服務(wù)器所處理的每一個寫、刪除操作,查詢操作不會記錄,以文本的方式記錄,可以打開文件看到詳細(xì)的操作記錄。
3. RDB 數(shù)據(jù)恢復(fù)
RDB 方式的持久化的數(shù)據(jù)恢復(fù)不需太多操作,只要將備份文件放入 Redis 的安裝目錄,啟動即可。Redis 會自動加載文件至內(nèi)存。在加載過程中會一直處于阻塞狀態(tài)。
3.1 優(yōu)勢:
- 整個數(shù)據(jù)庫只包含一個備份文件。容易恢復(fù)和存儲。
- 方便復(fù)制和轉(zhuǎn)移。
- 相比于 AOF,數(shù)據(jù)集很大的情況下,RDB 的啟動效率更高。
- 性能最大化。對于 Redis 的服務(wù)進(jìn)程而言,在開始持久化時,它唯一需要做的只是 fork 出子進(jìn)程,之后再由子進(jìn)程完成這些持久化的工作,這樣就可以極大的避免服務(wù)進(jìn)程執(zhí)行操作。
3.2 劣勢:
- 如果想最大限度避免數(shù)據(jù)丟失,RDB 不是一個好選擇,如果系統(tǒng)在持久化期間出現(xiàn)宕機(jī),沒有寫入磁盤的數(shù)據(jù)都會丟失。
- RDB 通過 fork 子進(jìn)程來協(xié)助完成持久化,如果數(shù)據(jù)集較大,會導(dǎo)致服務(wù)器停止一些時間。
4. AOF 數(shù)據(jù)恢復(fù)
與 RDB 一樣,重啟 Redis,Redis 會自動加載 AOF 文件,實(shí)現(xiàn)數(shù)據(jù)恢復(fù)。
4.1 優(yōu)勢
- AOF 的數(shù)據(jù)安全性和同步性比 RDB 形式高。默認(rèn)為每秒同步一次,如果設(shè)置為每操作同步一次,則數(shù)據(jù)會實(shí)現(xiàn)完全同步。
- AOF 文件是通過追加的形式生成的。如果最后一次寫入出現(xiàn)異常也不會影響之前的文件數(shù)據(jù)。
- AOF 文件具有清晰可讀的文件格式,如果我們錯誤的寫入了命令,可以立馬關(guān)閉,在重寫沒進(jìn)行時,先進(jìn)入文件中,去掉寫錯的命令。
4.2 劣勢
- AOF 占用的空間比 RDB 大。
- AOF 的同步速度比 RDB 慢。
5. 總結(jié)如何選擇
如果對數(shù)據(jù)的完整性要求不是極高,可以丟失一點(diǎn)數(shù)據(jù),那選擇 RDB 是最好的。RDB 無論是備份方便性和恢復(fù)速度都高于 AOF,同時可以避免 AOF 的一些bug。
如果對數(shù)據(jù)的完整性要求極高,請選擇 AOF 形式。
總結(jié)
以上是生活随笔為你收集整理的Redis 高级特性(3)—— 持久化及数据恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis 高级特性(2)—— 发布 订
- 下一篇: Redis 高级特性(4)— 单线程架构