5-Redis 的持久化之 RDB

studyMore發表於2019-01-01

2016-12-22 13:58:48


該系列文章連結
NoSQL 資料庫簡介
Redis的安裝及及一些雜項基礎知識
Redis 的常用五大資料型別(key,string,hash,list,set,zset)
Redis 配置檔案介紹
Redis 持久化之RDB
Redis 持久化之AOF
Redis 主從複製
Redis 事務
Redis 釋出與訂閱
Redis jdedis 介紹


 

redis 作為快取的優秀資料庫,也提供了將快取中的資料寫入到硬碟的手段。
有兩種:一種是 RDB,另一種則是 AOF,本篇文章介紹 RDB。

1.RDB 簡介
RDB:redis database
定義:在指定的時間間隔內將記憶體中的資料集快照寫入到硬碟中,也就是 snapshot 快照,它恢復時是將快照檔案直接讀取到記憶體中

2.RDB 持久化過程
簡單來說,就是 redis 會單獨建立(fork)一個子程式來進行持久化,先將資料寫入到硬碟中的一個臨時檔案中,等到持久化過程結束,就用這個臨時檔案替換上次持久化好的檔案。
整個過程中,主程式不進行任何與之相關的IO操作,這就確保了 redis 的極高效能
那麼:什麼叫 fork?
redis 會複製一個與當前程式一樣的程式。新程式的所有資料(eg:程式計數器)數值都和原程式一致,但是是一個全新的程式,並作為原程式的子程式

3.RDB 在 redis.conf 的配置
RDB 在 redis.conf 中的模組是 snapshotting。
下面簡單介紹下 snapshotting
    3.1 save
        將資料庫儲存在磁碟上:

               save <seconds> <changes>

               如果同時發生了給定的秒數和針對DB的給定寫入運算元,則將儲存資料庫。

            在下面的示例中,出現這些情況將會儲存:
            在900秒(15分鐘)內至少改變了1個 key
            在300秒(5分鐘)內至少改變了10個 key
            在60秒內至少改變了10000個 key

               注意:您可以通過註釋掉所有”save”行來完全禁用儲存。

               也可以通過新增帶有單個空字串引數的save指令來刪除所有先前配置的儲存點,如下例所示:
              save “”

    3.2 stop-writes-on-bgsave-error
        預設情況下,如果啟用了RDB快照(至少一個儲存點)並且最新的後臺儲存失敗,Redis將停止接受寫入命令。
        這將使使用者意識到(以一種困難的方式)資料沒有正確地儲存在磁碟上,否則很可能沒有人會注意到以至於會發生一些災難。

        如果後臺儲存過程將再次開始工作,Redis將會自動允許再次寫入。

        然而,如果您已設定對Redis伺服器和永續性的正確監視,則可能需要禁用此功能,以便即使磁碟,許可權等存在問題,Redis也將繼續正常工作。

    3.3 rdbcompression
        資料庫在 dumb.rdb 檔案儲存資料時使用LZF壓縮字串物件?
         預設設定為“yes”,因為它幾乎總是一個勝利。
         如果要在儲存子項中儲存一些CPU,請將其設定為“no”,但如果您具有可壓縮值或鍵,則資料集可能會更大。
         (在業界這個一般設定為 no,因為很多程式設計師認為不需要給老闆省硬碟空間,畢竟在多買個硬碟就好了。空間換時間!)
    3.4 rdbchecksum
        RDB的第5版開始,CRC64校驗和位於檔案的末尾。
         這使得格式更能抵抗損壞,但在儲存和載入RDB檔案時有一定的效能損失(大約10%),因此您可以禁用它以獲得最佳效能。

         禁用校驗和建立的RDB檔案的校驗和為零,將告訴載入程式碼跳過檢查。

    3.5dbfilename
        RDB方式儲存資料的檔名

    3.6 dir
        工作目錄。

        資料將使用`dbfilename`配置指令指定的檔名寫入此目錄
        
        aof 檔案也將被建立在此目錄中。
        
        請注意,您必須在此處指定目錄,而不是檔名。

4.如何觸發或停止 RDB
    觸發 RDB 有很多種方式:
        4.1 在 redis.conf -> save 中寫下觸發的條件
            然後滿足此條件會自動以 RDB 方式持久化

        4.2 使用 save 或者 bgsave 命令主動觸發快照
            save: save 只管儲存,其它所有讀寫操作都會阻塞
            bgsave: redis 會在後臺非同步時進行快照操作,快照同時可以響應客戶端請求,也可以通過 lastsave 命令獲取最後一次成功執行快照的時間

        4.3 執行 flushall 命令,這沒有什麼意義

    動態停止 RDB 儲存規則方法:
        redis-cli config set save “”

5.反持久化:將 RDB 的資料還原到記憶體中
    
    config get dir 獲取儲存資料的目錄

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

6.RDB 的優勢與劣勢
    6.1 優勢
        適合大規模的資料恢復
        對資料完整性和一致性要求不高

    6.2 劣勢
        在一定時間間隔內做一次備份,所以如果 redis 出現意外的話,就會丟失最後一次的所有修改
        fork 父程式的時候,父程式記憶體中的資料被克隆了一份,大致 2 倍的膨脹率需要考慮

 

相關文章