Redis系列五 Redis持久化

2022-09-15 10:24:08 字數 2736 閱讀 4482

一、rdb(redis database)

1、介紹

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

redis會單獨建立(fork)乙個子程序來進行持久化,會先將資料寫入到乙個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序是不進行任何io操作的,這就確保了極高的效能

如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那rdb方式要比aof方式更加的高效。rdb的缺點是最後一次持久化後的資料可能丟失。

2、fork

fork的作用是複製乙個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是乙個全新的程序,並作為原程序的子程序。

3、rdb儲存的檔案格式

rdb預設儲存的檔名為dump.rdb檔案

4、如何觸發rdb快照

使用命令 s**e或者bgs**e

s**e:s**e時只管儲存,其它不管,全部阻塞。

bgs**e:redis會在後台非同步進行快照操作,快照同時還可以響應客戶端請求。可以通過lasts**e命令獲取最後一次成功執行快照的時間。

執行flushall命令,也會產生dump.rdb檔案,但裡面是空的,無意義。

5、恢復快照

將備份檔案 (dump.rdb) 移動到 redis 安裝目錄並啟動服務即可。

config get dir獲取目錄

6、優勢

適合大規模的資料恢復

對資料完整性和一致性要求不高

7、劣勢

在一定間隔時間做一次備份,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改

fork的時候,記憶體中的資料被轉殖了乙份,大致2倍的膨脹性需要考慮。

8、如何停止

動態所有停止rdb儲存規則的方法:redis-cli config set s**e ""

1、介紹

以日誌的形式來記錄每個寫操作,將redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,

redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作

2、檔案儲存格式

3、aof啟動/修復/恢復

正常恢復

將有資料的aof檔案複製乙份儲存到對應目錄(config get dir)

異常恢復

備份被寫壞的aof檔案

redis-check-aof --fix進行修復

4、rewrite

介紹aof採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當aof檔案的大小超過所設定的閾值時,redis就會啟動aof檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof。

重寫原理

aof檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,

而是將整個記憶體中的資料庫內容用命令的方式重寫了乙個新的aof檔案,這點和快照有點類似。

觸發機制

redis會記錄上次重寫時的aof大小,預設配置是當aof檔案大小是上次rewrite後大小的一倍且檔案大於64m時觸發

5、優勢

6、劣勢

相同資料集的資料而言aof檔案要遠大於rdb檔案,恢復速度慢於rdb。

aof執行效率要慢於rdb,每秒同步策略效率較好,不同步效率和rdb相同

三、總結

1、rdb持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存

2、aof持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,aof命令以redis協議追加儲存每次寫的操作到檔案末尾.

redis還能對aof檔案進行後台重寫,使得aof檔案的體積不至於過大

3、只做快取:如果你只希望你的資料在伺服器執行的時候存在,你也可以不使用任何持久化方式.

4、同時開啟兩種持久化方式

在這種情況下,當redis重啟的時候會優先載入aof檔案來恢復原始的資料,因為在通常情況下aof檔案儲存的資料集要比rdb檔案儲存的資料集要完整.

rdb的資料不實時,同時使用兩者時伺服器重啟也只會找aof檔案。那要不要只使用aof呢?

作者建議不要,因為rdb更適合用於備份資料庫(aof在不斷變化不好備份),

快速重啟,而且不會有aof可能潛在的bug,留著作為乙個萬一的手段。

5、效能建議

因為rdb檔案只用作後備用途,建議只在sl**e上持久化rdb檔案,而且只要15分鐘備份一次就夠了,只保留s**e 900 1這條規則

如果enalbe aof,好處是在最惡劣情況下也只會丟失不超過兩秒資料,啟動指令碼較簡單只load自己的aof檔案就可以了。代價一是帶來了持續的io,二是aof rewrite的最後將rewrite過程中產生的新資料寫到新檔案造成的阻塞幾乎是不可避免的。

只要硬碟許可,應該儘量減少aof rewrite的頻率,aof重寫的基礎大小預設值64m太小了,可以設到5g以上。預設超過原大小100%大小時重寫可以改到適當的數值。  

如果不enable aof ,僅靠master-sl**e replication 實現高可用性也可以。能省掉一大筆io也減少了rewrite時帶來的系統波動。代價是如果master/sl**e同時倒掉,會丟失十幾分鐘的資料,啟動指令碼也要比較兩個master/sl**e中的rdb檔案,載入較新的那個。

Redis學習 五 Redis持久化

redis是乙個記憶體資料庫,那麼如果不做持久化的話,當redis伺服器守護程序退出,伺服器宕機,計算機斷電 就會導致記憶體中的資料丟失,如果redis只是作為乙個快取伺服器來用的話,那麼不會有什麼影響,但是如果作為乙個記憶體資料庫的話,當上面的情況發生就會出現丟失所有資料的重大事故 rdb red...

redis 五 Redis持久化之aof

前言 1 官網介紹 以下內容為有道詞典翻譯 aof的優勢 使用aof redis更加持久 您可以使用不同的fsync策略 完全沒有fsync,每秒fsync,每個查詢fsync。使用預設策略fsync時,每秒的寫入效能仍然很好 fsync是使用後台執行緒執行的,並且在沒有進行fsync的情況下,主線...

Redis之(五)持久化

redis提供了兩種持久化的方式 1 rdb redis database 模式,就是在不同的時間點,將redis儲存的資料生成快照並儲存到磁碟等介質上 2 aof appendonlyfile 模式,則換了乙個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動...