1. 程式人生 > >Redis之RDB和AOF持久化

Redis之RDB和AOF持久化

一、RDB機制的優勢和略施

RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。 也是預設的持久化方式,這種方式是就是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump.rdb。

 

可以通過配置設定自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做快照,下面是預設的快照儲存配置

save 900 1  #900秒內如果超過1個key被修改,則發起快照儲存

   save 300 10 #300秒內容如超過10個key被修改,則發起快照儲存

   save 60 10000

 

二、RDB檔案儲存過程

1     redis呼叫fork,現在有了子程序和父程序。

 

2     父程序繼續處理client請求,子程序負責將記憶體內容寫入到臨時檔案。由於os的寫時複製機制(copy on write)父子程序會共享相同的物理頁面,當父程序處理寫請求時os會為父程序要修改的頁面建立副本,而不是寫共享的頁面。所以子程序的地址空間內的數 據是fork時刻整個資料庫的一個快照。

 

3     當子程序將快照寫入臨時檔案完畢後,用臨時檔案替換原來的快照檔案,然後子程序退出。

 

client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主執行緒中儲存快照的,由於redis是用一個主執行緒來處理所有 client的請求,這種方式會阻塞所有client請求。所以不推薦使用。

 

另一點需要注意的是,每次快照持久化都是將記憶體資料完整寫入到磁碟一次,並不 是增量的只同步髒資料。如果資料量大的話,而且寫操作比較多,必然會引起大量的磁碟io操作,可能會嚴重影響效能。

 

  1. 優勢

一旦採用該方式,那麼你的整個Redis資料庫將只包含一個檔案,這樣非常方便進行備份。比如你可能打算沒1天歸檔一些資料。

方便備份,我們可以很容易的將一個一個RDB檔案移動到其他的儲存介質上

RDB 在恢復大資料集時的速度比 AOF 的恢復速度要快。

RDB 可以最大化 Redis 的效能:父程序在儲存 RDB 檔案時唯一要做的就是 fork 出一個子程序,然後這個子程序就會處理接下來的所有儲存工作,父程序無須執行任何磁碟 I/O 操作。

 

  1. 劣勢

1     如果你需要儘量避免在伺服器故障時丟失資料,那麼 RDB 不適合你。 雖然 Redis 允許你設定不同的儲存點(save point)來控制儲存 RDB 檔案的頻率, 但是, 因為RDB 檔案需要儲存整個資料集的狀態, 所以它並不是一個輕鬆的操作。 因此你可能會至少 5 分鐘才儲存一次 RDB 檔案。 在這種情況下, 一旦發生故障停機, 你就可能會丟失好幾分鐘的資料。

 

2     每次儲存 RDB 的時候,Redis 都要 fork() 出一個子程序,並由子程序來進行實際的持久化工作。 在資料集比較龐大時, fork() 可能會非常耗時,造成伺服器在某某毫秒內停止處理客戶端; 如果資料集非常巨大,並且 CPU 時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒。 雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,資料的耐久性都不會有任何損失。

 

本教程由尚矽谷教育大資料研究院出品,如需轉載請註明來源。