1. 程式人生 > >[Redis]Redis持久化之RDB快照

[Redis]Redis持久化之RDB快照

Redis持久化之RDB快照

Redis是一個記憶體資料庫管理系統。所謂的記憶體資料庫,就是將資料庫中的資料儲存在記憶體當中。記憶體資料庫的讀寫效率會比一般的資料庫更快,但是一旦斷電或者宕機,資料庫中的資料就會全部丟失。

為了應對資料丟失的問題,Redis提供了將資料持久化到本地的功能,以便對資料進行備份。Redis支援兩種形式的資料持久化,一種是RDB快照(snapshotting),另外一種是AOF(append-only-file)。本篇先對其中的RDB快照進行講解。

簡介

Redis建立快照時,會將某一時刻存在於記憶體中的資料儲存到本地檔案中。快照檔案以.rdb字尾儲存。

具體過程是:

  1. Redis呼叫fork建立一個子程序。(父子程序共享記憶體,直至其中一個程序對記憶體進行了寫操作)

  2. 子程序負責將資料寫入一個臨時檔案,父程序則繼續處理資料庫讀寫請求。

  3. 完全寫入成功後,呼叫rename將新的RDB檔案替換原來的RDB檔案。

通過Redis命令手動建立快照

Redis提供了兩條命令用於手動建立快照。

BGSAVE

呼叫BGSAVE命令時,Redis會在後臺非同步地儲存當前資料庫中的資料。具體過程與上一節中提到的過程一樣。呼叫SYNC命令時,如果主伺服器沒有在執行BGSAVE操作的話,會執行一次BGSAVE。

SAVE

呼叫SAVE命令時,Redis會執行同步儲存,阻塞所有客戶端,不再響應客戶端傳送的請求。SAVE命令一般來說只用於沒有足夠記憶體執行BGSAVE命令,或者對於等待儲存佔用的時間不敏感時才會使用。呼叫SHUTDOWN命令關閉伺服器時也會先執行一次SAVE命令。

注:呼叫LASTSAVE命令可以檢視最近一次將資料持久化到本地的時間,該命令返回一個UNIX時間戳。

通過配置檔案設定自動儲存快照

Redis的RDB快照配置項一共有六個。預設配置如下:

save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./

下面逐個講解一下它們的作用。

  1. save這一項後面需要加上兩個數字,分別代表秒數和更改數。假如設定了save m n,就代表如果在經過m秒之後發生了至少n次更改,Redis就會自動執行一次BGSAVE命令。save配置項可以同時存在多個,如果save太過頻繁,會影響到Redis的效能,頻率太低則會增加資料丟失的風險,所以建議根據需要對save項進行配置。如果移除所有的save配置項或者加上一項save “”,則自動儲存功能會被關閉。

  2. 預設情況下,如果後臺儲存出錯了,Redis會停止接受寫操作。如果後臺的儲存程序重新開始工作,Redis也會自動恢復接受寫操作。這是一種比較簡單粗暴的解決方式,通過這種方式可以顯示地提醒維護者Redis出現了故障,但也會導致在故障被修復前Redis都沒辦法提供完整的服務。如果設定了stop-writes-on-bgsave-error為no,則Redis出問題的時候也可以照常工作,不過這就需要更細緻地監控Redis伺服器的變化。

  3. rdbcompression配置項設定是否對RDB檔案進行壓縮。如果將rdbcompression設定為no的話RDB檔案儲存的速度會快一些,但是儲存下來的檔案也會相應地變大。Redis使用LZF壓縮RDB檔案。

  4. rdbchecksum配置項控制Redis是否使用迴圈冗餘檢驗。如果啟用迴圈冗餘檢驗,可以保證檔案的完整性,但是進行檔案儲存和載入時會損失10%左右的效能,如果追求最大效能可以考慮把這一項關閉。Redis使用的是CRC64。

  5. dbfilename配置RDB檔案的名字。

  6. dir配置RDB檔案儲存的路徑。AOF產生的檔案也會被儲存到這個路徑下面。

使用RDB快照進行持久化的優缺點

優點

  1. 通過合理的配置,可以讓Redis每隔一段時間就儲存一次資料庫副本,也可以很方便地將資料還原到特定的時間點。

  2. RDB檔案相比AOF佔用的空間更小,恢復資料的速度也更快。

  3. 如果建立RDB檔案時出現了錯誤,Redis不會將它用於替換原來的檔案,所以出錯時不會影響到之前儲存的版本。

缺點

  1. 如果硬體、系統、Redis三者其中之一出現問題而崩潰,Redis會丟失全部資料,保留下來的資料只有上一個時間點建立的快照。如果資料對於應用程式來說非常重要,那麼出現錯誤時的損失會非常大。

  2. fork子程序佔用的記憶體隨著資料庫中資料的增加而增加,耗費的時間也會越來越多。

總結

RDB快照算是一種折中的資料持久化策略,比較適合那些對於一段時間內資料的損失不敏感的應用程式。Redis也提供了不少配置項用於配置快照的建立方式,使用者可以根據自身需要調整配置,以達到自己想要的最佳效果。

另:Redis在Github上開源,裡面一些用於建立快照的元件(CRC64、LZF壓縮等)都可以在上面找到原始碼,如果有需要的可以直接利用起來。

關於Redis的另一種持久化策略AOF,請讀者檢視博主的另一篇部落格Redis持久化之AOF