redis-16.持久化之RDB

aliyeye發表於2021-02-20

RDB

RDB啟動方式

第一種

:question:誰,什麼時間,幹什麼事情
命令執行

  • 誰:redis操作者(使用者)
  • 什麼時間:即時(隨時進行)
  • 幹什麼事情:儲存資料
  • 命令
    save
  • 作用
    手動執行一次儲存操作

RDB啟動方式 —— save指令相關配置

redis配置檔案引數

  • dbfilename dump.rdb
    說明:設定本地資料庫檔名,預設值為dump.rdb
    經驗:通常設定為dump-埠號.rdb
  • dir
    說明:設定儲存.rdb
    經驗:通常設定成儲存空間較大的目錄中,目錄名稱data
  • rdbcompression yes
    說明:設定儲存至本地資料庫時是否壓縮資料,預設為yes,採用LZF壓縮
    經驗:通常預設為開啟專題,如果設定為no,可以節省CPU執行時間,但會使儲存的檔案變大(巨大)
  • rdbchecksum yes
    說明:設定是否進行RDB檔案格式校驗,該校驗過程在寫檔案和讀檔案過程均進行
    經驗:通常預設為開啟狀態,如果設定為no,可以節約讀寫性過程約10%時間消耗,但是存在一定的資料損壞的風險

RDB啟動方式 —— save指令工作原理

u2QxE8KSSB.png!large

注意:save指令的執行會阻塞當前Redis伺服器,直到當前RDB過程完成為止,有可能會造成長時間阻塞,線上環境不建議使用

第二種

:question:資料量過大,單執行緒執行方式造成效率過低如何處理
後臺執行

  • 誰:redis操作者(使用者)發起指令;redis伺服器控制指令執行
  • 什麼時間:即時(發起);合理的時間(執行)
  • 幹什麼事情:儲存資料
  • 命令
    bgsave
  • 作用
    手動啟動後臺儲存操作,但不是立即執行

RDB啟動方式 —— bgsave指令工作原理

LXT15eedE8.png!large

注意:bgsave命令時針對save阻塞問題做的優化。Redis內部所有涉及到RDB操作都採用bgsave的方式,save命令可以放棄使用。

RDB啟動方式 —— bgsave指令相關配置

  • dbfilename dump.rdb
  • dir
  • rdbcompression yes
  • rdbchecksum yes
  • stop-writes-on-bgsave-error yes
    說明:後臺儲存過程中如果出現錯誤現象,是否停止儲存操作
    經驗:通常預設開啟狀態

自動執行

:question:反覆執行儲存指令,忘記了怎麼辦?不知道資料產生了多少變化,何時儲存?
自動執行

  • 誰:redis伺服器發起指令(基於條件)
  • 什麼時間:滿足條件
  • 幹什麼事情:儲存資料
  • 配置
    save second changes
  • 作用
    滿足限定時間範圍內key的變化達到指定數量即進行持久化
  • 引數
    second:監控時間範圍
    changes:監控key的變化量
  • 位置
    在conf檔案中進行配置
  • 範例

    save 900 1
    save 300 10
    save 60 10000

RDB啟動方式 —— save配置 原理

2TvfC9oYh0.png!large

注意
save配置要根據實際業務情況進行設定,頻度過高或過低都會出現效能問題,結果可能是災難性的
save配置中對於second與changes設定通常具有互補對應關係,儘量不要設定成包含關係
save配置啟動後執行的是bgsave操作

RDB三種啟動方式對比

方式 save指令 bgsave指令 save配置
讀寫 同步 非同步 非同步
阻塞客戶端指令
額外記憶體消耗
啟動新的程式

RDB特殊啟動形式

  • 全量複製
    在主從複製中詳細講解
  • 伺服器執行過程中重啟
    debug reload
  • 關閉伺服器時指定儲存資料
    shutdown save

RDB優點

  • RDB 是一個勁湊壓縮的二進位制檔案,儲存效率較高
  • RDB內部儲存的是redis在某個時間點的資料快照,非常適合於資料備份,全量複製等場景
  • RDB恢復資料的速度要比AOF快很多
  • 應用:伺服器中每X小時執行basave備份,並將RDB檔案拷貝到遠端機器中,用於災難恢復

RDB缺點

  • RDB方式無論是執行指令還是利用配置,無法做到實時持久化,具有較大的可能性丟失資料
  • bgsave指令每次執行要執行fork操作建立子程式,要犧牲掉一些效能
  • Redis的眾多版本中未進行RDB檔案格式的版本統一,有可能出現各版本服務之間資料格式無法相容現象
  • 儲存資料量較大,效率較低(基於快照思想,每次讀寫都是全部資料,當資料量巨大時,效率非常低)
  • 大資料量下的IO效能較低
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章