Redis持久化-RDB與AOF
阿新 • • 發佈:2018-11-25
RDB:Redis Data Base
是什麼
- 在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,它恢復時是將快照檔案直接讀到記憶體裡
- Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。
- fork的作用是複製一個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是一個全新的程序,並作為原程序的子程序。因此極為消耗資源
備份發生在什麼時候
當我們執行flushall指令或者shutdown時,資料庫會自動進行備份
備份到哪
備份的位置在redis.conf配置檔案中進行配置
怎麼備份
備份的方式有兩種:自動和手動
自動備份
我們可以在redis.conf檔案中配置自動備份的條件
手動備份
可以通過執行save或者gbsave指令讓Redis進行備份
- save指令:執行save指令後會阻塞其他程序,只進行備份,前臺不能進行讀寫操作
- bgsave:bgsave指令會fork一個子程序,進行非同步備份,不影響前臺操作
怎麼禁用備份
- 在配置檔案中不設定save
- 將save的值設為空字串
備份後怎麼恢復
Redis每次啟動後都會將redis.conf配置檔案中指定的路徑和檔名所對應的檔案讀入記憶體,以此達到恢復的目的
缺點
- 最後一次的資料可能不能進行備份,當Reids出現錯誤退出時,可能還沒來得及備份
- 消耗資源,每次備份都需要fork一個子程序
redis.conf其他相關配置
AOF:Append Only File
採用什麼什麼方式進行持久化
AOF採用日誌檔案的方式實現Redis的持久化,日誌檔案會記錄使用者對資料庫的每一次寫操作(增刪改)。當需要恢復時,只需要從頭至尾將日誌檔案記錄的命令執行一遍即可。
相關配置
重寫:Rewrite
是什麼
AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof
重寫原理
AOF檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似
觸發條件
Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發
缺點
1.隨著記錄的增多,日誌檔案會越來越大
2.恢復速度比RDB慢
兩者對比
- RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存
- AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾。Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大
- 只做快取:如果你只希望你的資料在伺服器執行的時候存在,你也可以不使用任何持久化方式。
- 同時開啟兩種持久化方式
在這種情況下,當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。RDB的資料不實時,同時使用兩者時伺服器重啟也只會找AOF檔案。那要不要只使用AOF呢?作者建議不要,因為RDB更適合用於備份資料庫(AOF在不斷變化不好備份),快速重啟,而且不會有AOF可能潛在的bug,留著作為一個萬一的手段。