標籤:相同 阻塞 選項 連結 資料庫 redis設定檔 頁面 替換 配置
Redis持久化-RDB
Redis的持久化分為RDB持久化和AOF持久化,本篇文章主要說RDB持久化相關的東西。
RDB持久化就是把當前redis資料庫中的資料儲存到硬碟的過程。
觸發時機
RDB持久化的觸發方式有兩種,第一種是手動觸發,另外一種是自動觸發。
手動觸發
手動觸發RBD主要使用save和bgsave命令。其實bgsave是對save命令阻塞問題的最佳化,因此你應該總是使用bgsave命令。
save
save命令會阻塞當前主進程,直到RDB持久化過程執行完畢,對於記憶體比較大的執行個體會造成非常長時間的阻塞,因此線上環境不要使用。
bgsave
bgsave命令執行時,redis主進程會fork出子進程,具體的RDB的過程是由子進程來完成的,在持久化期間,主進程依然響應來自應用程式的命令。阻塞僅僅會發生在fork出子進程的階段。
自動觸發redis設定檔中使用了save配置
如果在redis設定檔中使用了save m n (表示m秒內進行了n次資料修改)配置,滿足情況的時候會觸發bgsave
redis叢集中從節點執行全量複製操作
從節點執行全量複製操作的時候,主節點會自動觸發bgsave命令生存rdb檔案並發送給從節點
執行debug reload載入redis
在執行debug reload(這個時候redis執行個體的run id不會發生變化)重新載入redis的時候,也會自動觸發bgsave
預設情況下執行shutdown命令
預設情況下執行shutdown命令,如果沒有開啟AOF持久化功能,就會自動執行bgsave。
bgsave觸發RBD的執行過程
( TODO 後續補充流程圖)
- 主進程執行bgsave命令,首先會檢查當前是否存在正在啟動並執行子進程,如果存在的話,bgsave命令就會直接退出。
- 上述條件滿足的情況下,主進程會fork出子進程,在fork操作期間,主進程會短暫的阻塞,可以使用
info stats命令的latest_fork_usec選項查看最近一次fork操作所耗費的時間,單位是微秒
- 父進程fork完成以後,會繼續響應來自其他應用程式員的命令(但是save,bgsave,bgrewriteaof這三個命令特殊一些,會有不同的回應程式式)
- 子進程建立RDB檔案,由於os的寫時複製機制(copy on write)父子進程會共用相同的物理頁面,當父進程處理寫請求時os會為父進程要修改的頁面棄置站台,而不是寫共用的頁面。所以子進程的地址空間內的數 據是fork時刻整個資料庫的一個快照。.
- 當子進程將快照寫入臨時檔案完畢後,用臨時檔案替換原來的快照檔案,並發送訊號通知父進程RDB持久化過程完成
- 父進程收到通知,更新相關的持久化資訊
RDB持久化的優缺點優點
- 非常適合備份,全量複製等情境
- redis載入RBD恢複資料會比使用AOF方式恢複的快
缺點
- 沒辦法做到即時/准即時的持久化
- 因為RDB檔案是一個壓縮過的二進位檔案,在redis的版本演化過程中,存在多個格式的RDB格式,因此存在老版本的redis不能完全相容新版RDB格式的情況
原文連結:https://wenchao.ren/archives/165
Redis持久化-RDB