Redis持久化,redis

來源:互聯網
上載者:User

Redis持久化,redis

Web程式猿部落格:http://blog.csdn.net/thinkercode

Redis持久化機制

redis是一個支援持久化的記憶體資料庫,也就是說redis需要經常將記憶體中的資料同步到磁碟來保證持久化。
Redis 提供了多種不同層級的持久化方式:

  • RDB 持久化可以在指定的時間間隔內產生資料集的時間點快照(point-in-time snapshot)。
  • AOF 持久化記錄伺服器執行的所有寫操作命令,並在伺服器啟動時,通過重新執行這些命令來還原資料集。 AOF 檔案中的命令全部以 Redis 協議的格式來儲存,新命令會被追加到檔案的末尾。 Redis 還可以在後台對 AOF 檔案進行重寫(rewrite),使得 AOF 檔案的體積不會超出儲存資料集狀態所需的實際大小。
  • Redis 還可以同時使用 AOF 持久化和 RDB 持久化。 在這種情況下, 當 Redis 重啟時, 它會優先使用 AOF 檔案來還原資料集, 因為 AOF 檔案儲存的資料集通常比 RDB 檔案所儲存的資料集更完整。
  • 你甚至可以關閉持久化功能,讓資料只在伺服器運行時存在。
RDB的優點和缺點
  • RDB的優點

    • RDB 是一個非常緊湊(compact)的檔案,它儲存了 Redis 在某個時間點上的資料集。 這種檔案非常適合用於進行備份: 比如說,你可以在最近的 24 小時內,每小時備份一次 RDB 檔案,並且在每個月的每一天,也備份一個 RDB 檔案。 這樣的話,即使遇上問題,也可以隨時將資料集還原到不同的版本。
    • RDB 非常適用於災難恢複(disaster recovery):它只有一個檔案,並且內容都非常緊湊,可以(在加密後)將它傳送到別的資料中心,或者亞馬遜 S3 中。
    • RDB 可以最大化 Redis 的效能:父進程在儲存 RDB 檔案時唯一要做的就是 fork 出一個子進程,然後這個子進程就會處理接下來的所有儲存工作,父進程無須執行任何磁碟 I/O 操作。
    • RDB 在恢複大資料集時的速度比 AOF 的恢複速度要快。
  • RDB的缺點

    • 如果你需要盡量避免在伺服器故障時遺失資料,那麼 RDB 不適合你。 雖然 Redis 允許你設定不同的儲存點(save point)來控制儲存 RDB 檔案的頻率, 但是, 因為RDB 檔案需要儲存整個資料集的狀態, 所以它並不是一個輕鬆的操作。 因此你可能會至少 5 分鐘才儲存一次 RDB 檔案。 在這種情況下, 一旦發生故障停機, 你就可能會丟失好幾分鐘的資料。
    • 每次儲存 RDB 的時候,Redis 都要 fork() 出一個子進程,並由子進程來進行實際的持久化工作。 在資料集比較龐大時, fork() 可能會非常耗時,造成伺服器在某某毫秒內停止處理用戶端; 如果資料集非常巨大,並且 CPU 時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒。 雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,資料的耐久性都不會有任何損失。
AOF的優點和缺點
  • AOF的優點

    • 使用 AOF 持久化會讓 Redis 變得非常耐久(much more durable):你可以設定不同的 fsync 策略,比如無 fsync ,每秒鐘一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的預設策略為每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的效能,並且就算髮生故障停機,也最多隻會丟失一秒鐘的資料( fsync 會在後台線程執行,所以主線程可以繼續努力地處理命令請求)。
    • AOF 檔案是一個只進行追加操作的記錄檔(append only log), 因此對 AOF 檔案的寫入不需要進行 seek , 即使日誌因為某些原因而包含了未寫入完整的命令(比如寫入時磁碟已滿,寫入中途停機,等等), redis-check-aof 工具也可以輕易地修複這種問題。
    • Redis 可以在 AOF 檔案體積變得過大時,自動地在後台對 AOF 進行重寫: 重寫後的新 AOF 檔案包含了恢複當前資料集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在建立新 AOF 檔案的過程中,會繼續將命令追加到現有的 AOF 檔案裡面,即使重寫過程中發生停機,現有的 AOF 檔案也不會丟失。 而一旦新 AOF 檔案建立完畢,Redis 就會從舊 AOF 檔案切換到新 AOF 檔案,並開始對新 AOF 檔案進行追加操作。
    • AOF 檔案有序地儲存了對資料庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式儲存, 因此 AOF 檔案的內容非常容易被人讀懂, 對檔案進行分析(parse)也很輕鬆。 匯出(export) AOF 檔案也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 檔案未被重寫, 那麼只要停止伺服器, 移除 AOF 檔案末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將資料集恢複到 FLUSHALL 執行之前的狀態。
  • AOF的缺點

    • 對於相同的資料集來說,AOF 檔案的體積通常要大於 RDB 檔案的體積。
    • 根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的效能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。
    • AOF 在過去曾經發生過這樣的 bug : 因為個別命令的原因,導致 AOF 檔案在重新載入時,無法將資料集恢複成儲存時的原樣。 (舉個例子,阻塞命令 BRPOPLPUSH 就曾經引起過這樣的 bug 。) 測試套件裡為這種情況添加了測試: 它們會自動產生隨機的、複雜的資料集, 並通過重新載入這些資料來確保一切正常。 雖然這種 bug 在 AOF 檔案中並不常見, 但是對比來說, RDB 幾乎是不可能出現這種 bug 的。
RDB 和 AOF ,我應該用哪一個

一般來說, 如果想達到足以媲美 PostgreSQL 的資料安全性, 應該同時使用兩種持久化功能。
如果非常關心你的資料, 但仍然可以承受數分鐘以內的資料丟失, 那麼可以只使用 RDB 持久化。
有很多使用者都只使用 AOF 持久化, 但並不推薦這種方式: 因為定時產生 RDB 快照集(snapshot)非常便於進行Database Backup, 並且 RDB 恢複資料集的速度也要比 AOF 恢複的速度要快, 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程式的 bug 。

使用RDB持久化策略
  • 配置RDB持久化策略
save 900 1save 300 10save 60 10000dbfilename dump.rdbdir ./

在預設情況下, Redis 將資料庫快照集儲存在名字為 dump.rdb 的二進位檔案中。可以更改dbfilename和dir選項調整快照檔案的位置。
可以對 Redis的save策略進行設定, 讓它在“ N 秒內資料集至少有 M 個改動”這一條件被滿足時, 自動儲存一次資料集。
也可以通過調用 SAVE 或者 BGSAVE , 手動讓 Redis 進行資料集儲存操作。

  • 重啟服務
[root@localhost bin]# ./redis-server restart
快照的運作方式

當 Redis 需要儲存 dump.rdb 檔案時, 伺服器執行以下操作:

使用AOF持久化策略
  • 配置AOF持久化策略
appendonly yes

從現在開始, 每當 Redis 執行一個改變資料集的命令時(比如 SET), 這個命令就會被追加到 AOF 檔案的末尾。
這樣的話, 當 Redis 重新啟時, 程式就可以通過重新執行 AOF 檔案中的命令來達到重建資料集的目的。

  • 重啟服務
[root@localhost bin]# ./redis-server restart
AOF 的運作方式

AOF 重寫和 RDB 建立快照一樣,都巧妙地利用了寫時複製機制。
以下是 AOF 重寫的執行步驟:

使用RDB和AOF雙持久化策略
  • 配置持久化策略
save 900 1save 300 10save 60 10000dbfilename dump.rdbdir ./appendonly yes
  • 重啟服務
[root@localhost bin]# ./redis-server restart
  • RDB和 AOF之間的相互作用
    當 Redis 啟動時, 如果 RDB 持久化和 AOF 持久化都被開啟了, 那麼程式會優先使用 AOF 檔案來恢複資料集, 因為 AOF 檔案所儲存的資料通常是最完整的。
    BGSAVE 執行的過程中, 不可以執行 BGREWRITEAOF 。 反過來說, 在 BGREWRITEAOF 執行的過程中, 也不可以執行 BGSAVE 。這可以防止兩個 Redis 後台進程同時對磁碟進行大量的 I/O 操作。
    如果 BGSAVE 正在執行, 並且使用者顯示地調用 BGREWRITEAOF 命令, 那麼伺服器將向使用者回複一個 OK 狀態, 並告知使用者, BGREWRITEAOF 已經被預定執行: 一旦 BGSAVE 執行完畢, BGREWRITEAOF 就會正式開始。
AOF持久化機制的一些問題
  • AOF重寫
    因為 AOF 的運作方式是不斷地將命令追加到檔案的末尾, 所以隨著寫入命令的不斷增加, AOF 檔案的體積也會變得越來越大。舉個例子, 如果你對一個計數器調用了 100 次 INCR , 那麼僅僅是為了儲存這個計數器的當前值, AOF 檔案就需要使用 100 條記錄(entry)。然而在實際上, 只使用一條 SET 命令已經足以儲存計數器的當前值了, 其餘 99 條記錄實際上都是多餘的。為了處理這種情況, Redis 支援一種有趣的特性: 可以在不打斷服務用戶端的情況下, 對 AOF 檔案進行重建(rebuild)。執行 BGREWRITEAOF 命令, Redis 將產生一個新的 AOF 檔案, 這個檔案包含重建當前資料集所需的最少命令。Redis可以自動觸發 AOF 重寫。
  • AOF 的耐久性如何?
    可以配置 Redis 多久才將資料 fsync 到磁碟一次。
    有三個選項:
    • 每次有新命令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全。
    • 每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料。
    • 從不 fsync :將資料交給作業系統來處理。更快,也更不安全的選擇。
      推薦(並且也是預設)的措施為每秒 fsync 一次, 這種 fsync 策略可以兼顧速度和安全性。總是 fsync 的策略在實際使用中非常慢, 即使在 Redis 2.0 對相關的程式進行了改進之後仍是如此 —— 頻繁調用 fsync 註定了這種策略不可能快得起來。
  • 如果 AOF 檔案出錯了,怎麼辦?
    伺服器可能在程式正在對 AOF 檔案進行寫入時停機, 如果停機造成了 AOF 檔案出錯(corrupt), 那麼 Redis 在重啟時會拒絕載入這個 AOF 檔案, 從而確保資料的一致性不會被破壞。
    當發生這種情況時, 可以用以下方法來修複出錯的 AOF 檔案:
怎麼從 RDB 持久化切換到 AOF 持久化

可以在不重啟的情況下,從 RDB 切換到 AOF :

CONFIG SET appendonly yesCONFIG SET save ""
  • 確保命令執行之後,資料庫的鍵的數量沒有改變。
  • 確保寫命令會被正確地追加到 AOF 檔案的末尾。
    步驟 3 執行的第一條命令開啟了 AOF 功能: Redis 會阻塞直到初始 AOF 檔案建立完成為止, 之後 Redis 會繼續處理命令請求, 並開始將寫入命令追加到 AOF 檔案末尾。
    步驟 3 執行的第二條命令用於關閉 RDB 功能。 這一步是可選的, 如果你願意的話, 也可以同時使用 RDB 和 AOF 這兩種持久化功能。

    別忘了在 redis.conf 中開啟 AOF 功能! 否則的話, 伺服器重啟之後, 之前通過 CONFIG SET 設定的配置就會被遺忘, 程式會按原來的配置來啟動伺服器。

  • 備份 Redis 資料

    磁碟故障, 節點失效, 諸如此類的問題都可能讓你的資料消失不見, 不進行備份是非常危險的。
    Redis 對於資料備份是非常友好的, 可以在伺服器啟動並執行時候對 RDB 檔案進行複製: RDB 檔案一旦被建立, 就不會進行任何修改。 當伺服器要建立一個新的 RDB 檔案時, 它先將檔案的內容儲存在一個臨時檔案裡面, 當臨時檔案寫入完畢時, 程式才使用 rename(2) 原子地用臨時檔案替換原來的 RDB 檔案。這也就是說, 無論何時, 複製 RDB 檔案都是絕對安全的。
    以下是官方的建議:

    • 建立一個定期任務(cron job), 每小時將一個 RDB 檔案備份到一個檔案夾, 並且每天將一個 RDB 檔案備份到另一個檔案夾。
    • 確保快照的備份都帶有相應的日期和時間資訊, 每次執行定期任務指令碼時, 使用 find 命令來刪除到期的快照: 比如說, 你可以保留最近 48 小時內的每小時快照, 還可以保留最近一兩個月的每日快照。
    • 至少每天一次, 將 RDB 備份到你的資料中心之外, 或者至少是備份到你運行 Redis 伺服器的物理機器之外。

    相關文章

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.