Redis的持久化RDB和AOF

2021-09-28 15:46:23 字數 2234 閱讀 1704

rdb

什麼是rdb

在指定時間間隔內,將記憶體中的資料集快照寫入磁碟,也就是snapshot快照,它恢復時是將快照檔案直接讀到記憶體中,來達到恢復資料的。

如何持久化

redis會單獨建立(fork)乙個子程序來進行持久化,會先將資料寫進乙個臨時檔案中,等到持久化過程結束了,再用這個臨時檔案替換上次持久化好的檔案。在這個過程中,只有子程序來負責io操作,主程序仍然處理客戶端的請求,這就確保了極高的效能。

snapshot

在預設情況下, redis 將資料庫快照儲存在名字為 dump.rdb 的二進位制檔案中。通過觸發快照的形式,來做到將指定時間間隔內的資料持久化到dump.rdb。例如,可以2分鐘內持久化一次,將對資料庫的寫操作,備份到磁碟上的dump.rdb。如何觸發持久化呢?可以通過檢視或者設定redis.conf配置檔案來指定觸發規則。

以下是redis配置檔案的觸發快照的預設配置 

rdb優點與缺點

優點

如果要進行大規模資料的恢復,rdb方式要比aof方式恢復速度要快。

rdb可以最大化redis效能,父程序做的就是fork子程序,然後繼續接受客戶端請求,讓子程序負責持久化操作,父程序無需進行io操作。

rdb是乙個非常緊湊(compact)的檔案,它儲存了某個時間點的資料集,非常適合用作備份,同時也非常適合用作災難性恢復,它只有乙個檔案,內容緊湊,通過備份原檔案到本機外的其他主機上,一旦本機發生宕機,就能將備份檔案複製到redis安裝目錄下,通過啟用服務就能完成資料的恢復。

缺點

rdb這種持久化方式不太適應對資料完整性要求嚴格的情況,因為,儘管我們可以用過修改快照實現持久化的頻率,但是要持久化的資料是一段時間內的整個資料集的狀態,如果在還沒有觸發快照時,本機就宕機了,那麼對資料庫所做的寫操作就隨之而消失了並沒有持久化本地dump.rdb檔案中。

每次進行rdb時,父程序都會fork乙個子程序,由子程序來進行實際的持久化操作,如果資料集龐大,那麼fork出子程序的這個過程將是非常耗時的,就會出現伺服器暫停客戶端請求,將記憶體中的資料複製乙份給子程序,讓子程序進行持久化操作。

aof

什麼是aof持久化

redis的aof是如何做到持久化的呢?從配置檔案中,我們可以發現

資料恢復重寫

當然如果aof 檔案一直被追加,這就可能導致aof檔案過於龐大。因此,為了避免這種狀況,redis新增了重寫機制,當aof檔案的大小超過所指定的閾值時,redis會自動啟用aof檔案的內容壓縮,只保留可以恢復資料的最小指令集,可以使用命令bgrewiteaof。

重寫原理:aof檔案持續增長過大時,會fork出一條新程序來將檔案重寫(也是臨時檔案最後再rename),遍歷新程序的記憶體中的資料,每條記錄都會有一條set語句,重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了乙個新的aof檔案,有點類似於快照。

配置檔案如下:

優點aof檔案是乙個只進行追加操作的日誌檔案,對檔案寫入不需要進行seek,即使在追加的過程中,寫入了不完整的命令(例如:磁碟已滿),可以使用redis-check-aof工具可以修復這種問題

redis可以在aof檔案變得過大時,會自動地在後台對aof進行重寫:重寫後的新的aof檔案包含了恢復當前資料集所需的最小命令集合。整個重寫操作是絕對安全的,因為redis在建立aof檔案的過程中,會繼續將命令追加到現有的aof檔案中,即使在重寫的過程中發生宕機,現有的aof檔案也不會丟失。一旦新aof檔案建立完畢,redis就會從舊的aof檔案切換到新的aof檔案,並對新的aof檔案進行追加操作。

aof檔案有序地儲存了對資料庫執行的所有寫入操作。這些寫入操作一redis協議的格式儲存,易於對檔案進行分析;例如,如果不小心執行了flushall命令,但只要aof檔案未被重寫,通過停止伺服器,移除aof檔案末尾的flushall命令,重啟伺服器就能達到flushall執行之前的狀態。

缺點

對於相同的資料集來說,aof檔案要比rdb檔案大。

根據所使用的持久化策略來說,aof的速度要慢與rdb。一般情況下,每秒同步策略效果較好。不使用同步策略的情況下,aof與rdb速度一樣快。

rdb與aof如何選擇

Redis的RDB持久化

redis是乙個鍵值對資料庫伺服器,伺服器中通常包含著任意個非空資料庫,而每個非空資料庫中又可以包含任意個鍵值對,為了方便起見,我們將伺服器中的非空資料庫以及它們的鍵值對統稱為資料庫狀態。舉個例子,下圖展示了乙個包含三個非空資料庫的redis伺服器,這三個資料庫以及資料庫中的鍵值對就是該伺服器的資料...

redis持久化(rdb和aof)

rdb redis database 在制定的時間間隔內將記憶體中的資料集快照寫入磁碟 snapshot快照 redis恢復時將快照檔案直接讀到記憶體。rdb儲存的是dump.rdb檔案 在bin 目錄下會看到 redis會單獨建立 fork 乙個子程序來進行持久化,會先將資料寫入到乙個臨時檔案中,...

Redis 持久化方式 RDB

redis持久化資料的兩種方式之一,另外一種是aof。redis會定期儲存資料快照至乙個rbd檔案中,並在啟動時自動載入rdb檔案,恢復之前儲存的資料。自動觸發 可以在redis的配置檔案中進行設定,以達到滿足條件自動觸發rdb備份。其他可能 主從複製的時候 因為要複製給從節點最新資訊,所以也會觸發...