深入理解Redis--RDB和AOF

        Redis是一個No-SQ緩存數據庫,數據保存在內存中,由於讀寫頻繁,或在出現宕機等等異常情況,數據往往會丟失。不用擔心,Redis給我們提供了持久化的機制,分別是RDB(Redis DataBase)和AOF(Append Only File)。

一、持久化流程

(1)客戶端向服務端發送寫操作(數據在客戶端的內存中)。

(2)數據庫服務端接收到寫請求的數據(數據在服務端的內存中)。

(3)服務端調用write這個系統調用,將數據往磁盤上寫(數據在系統內存的緩衝區中)。

(4)操作系統將緩衝區中的數據轉移到磁盤控制器上(數據在磁盤緩存中)。

(5)磁盤控制器將數據寫到磁盤的物理介質中(數據真正落到磁盤上)。

 以上是正常的保存流程,但是在大多數情況下,我們的機器會出現不同的故障,這裏劃分了兩種情況:

(1)Redis數據庫發生故障,只要在上面的第三步執行完畢,那麼就可以持久化保存,剩下的兩步由操作系統替我們完成。

(2)操作系統發生故障,必須上面5步都完成纔可以。

二、RDB機制

     RDB其實就是把數據以快照的形式保存在磁盤上。什麼是快照呢,你可以理解成把當前時刻的數據拍成一張照片保存下來。

     RDB持久化是指在指定的時間間隔內,將內存中的數據集以快照的形式,寫入磁盤。也是默認的持久化方式,這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。在redis.conf文件中,有RDB和AOF兩種持久化機制的各種配置。

      既然RDB機制是通過把某個時刻的所有數據生成一個快照來保存,那麼就應該有一種觸發機制,是實現這個過程。對於RDB來說,提供了三種機制:save、bgsave、自動觸發。

1、Save觸發方式

    該命令會阻塞當前Redis,然後執行Save命令,期間無法使用Redis其他命令,RDB過程完成之後自動釋放,這種方式侷限性比較大,基本不會使用到,他會嚴重影響其他客戶端使用。如下圖:

2、Bgsave觸發方式

     執行該命令時,Redis會異步執行快照操作,同時也能處理客戶端發送過來的請求。如下圖:

     具體流程:Redis進程執行fork操作,創建子進程,RDB持久化(快照)操作交由子進程負責,完成後自動結束。在fork階段,Redis會發生阻塞,一般時間很短,(下篇文章會講到Redis fork優化),正常都採取這種方式進行RDB持久化。

Save和Bgsave對比:

3、自動觸發

     通過配置redis.conf文件,進行觸發設置,以下主要配置.

(1)save:配置觸發 Redis的 RDB 持久化條件,主要是多少時間段內,KEY的變化,然後觸發保存操作 。“save x y”,x 爲時間,y爲key值變化次數。以下三Redis默認配置:

save 900 1  、save 300 10、save 60 10000

(2)stop-writes-on-bgsave-error:設置了對Redis服務器和持久性的監視,默認值爲yes。將即使磁盤或在權限出現故障,也Redis也照常工作。

(3)rdbcompression:對於存儲到磁盤中的快照,可以設置是否進行壓縮存儲。默認值是yes,

(4)rdbchecksum:默認值是yes。在存儲快照後,我們還可以讓redis使用CRC64算法來進行數據校驗,但是這樣做會增加大約10%的性能消耗。

(5)dbfilename: 設置快照的文件名,默認是 dump.rdb

(6)dir:設置快照文件的存放路徑。

4、RDB 的優勢和劣勢

①、優勢

(1)RDB文件緊湊,全量備份,非常適合用於進行備份和災難恢復。

(2)生成RDB文件的時候,redis主進程會fork()一個子進程來處理所有保存工作,主進程不需要進行任何磁盤IO操作。

(3)RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

②、劣勢

       RDB快照是一次全量備份,存儲的是內存數據的二進制序列化形式,存儲上非常緊湊。當進行快照持久化時,會開啓一個子進程專門負責快照持久化,子進程會擁有父進程的內存數據,父進程修改內存子進程不會反應出來,所以在快照持久化期間修改的數據不會被保存,可能丟失數據。

三、AOF機制

      全量備份總是耗時的,Redis提供一種更加高效的方式AOF,工作機制很簡單,redis會將每一個收到的寫命令都通過write函數追加到AOF文件中,通常在redis-server同級目錄下。

1、持久化原理

       每當有一個寫命令過來時,就直接保存在我們的AOF文件中,如下圖:

2、文件重寫原理

       AOF明顯的會帶來一個問題:持久化文件會越來越大,該怎麼辦呢?Redis提供一個 bgrewriteaof 命令,將內存中的數據保存到臨時文件中,同時fork會創建一個新線程進行文件重寫。注意:重寫時,並不會讀取舊的AOF文件,而是將整個內存中數據重寫到新的一個AOF文件中,類似於RDB快照。

3、AOF三種觸發機制

(1)每次修改同步always:同步持久化 每次發生數據變更會被立即記錄到磁盤 性能較差但數據完整性比較好

(2)每秒同步everysec:異步操作,每秒記錄 如果一秒內宕機,有數據丟失

(3)不同no:從不同步

4、優點

(1)AOF可以更好的保護數據不丟失,一般AOF會每隔1秒,通過一個後臺線程執行一次fsync操作,最多丟失1秒鐘的數據。

(2)AOF日誌文件沒有任何磁盤尋址的開銷,寫入性能非常高,文件不容易破損。

(3)AOF日誌文件即使過大的時候,出現後臺重寫操作,也不會影響客戶端的讀寫。

(4)AOF日誌文件的命令通過可讀的方式進行記錄,這個特性適合做災難性的誤刪除的緊急恢復。比如誤操作用flushall命令清空了所有數據,只要這個時候後臺rewrite還沒有發生,那麼就可以立即拷貝AOF文件,將最後一條flushall命令給刪了,然後再將該AOF文件放回去,就可以通過恢復機制,自動恢復所有數據。

5、缺點

(1)對於同一份數據來說,AOF日誌文件通常比RDB數據快照文件更大。

四、RDB和AOF對比

通過以上介紹,相信都有一定的瞭解,根據實際需求進行選擇,如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章