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