Redis的持久化

木木他爹發表於2022-11-24

redis是一種基於記憶體的非關係型資料庫,記憶體雖然快但是資料也更易丟失,所以redis提供了兩種持久化方式,分別是RDB和AOF,今天就介紹下這兩種持久化方式以及原理

一、RDB

1、介紹

rdb是一種快照式的儲存也是redis預設的持久化策略,它將記憶體中的資料持久化到磁碟中且能做到不影響redis的效能;其有兩種持久化方式,一個是阻塞式的持久化(save)另一個是非阻塞式後臺的持久化(bgSave);

2、實現原理

利用linux父子程式的概念,持久化時fork一個子程式,但並沒有複製父程式記憶體中的所有資料,而只是移動了指標,利用了copy on write機制只在write時才真正的複製資料,速度快;父程式不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的效能;

注意:需要明確linux父子程式之間是相互隔離的,開啟save過後子程式只專注於檔案的落盤操作,此時主程式仍然可以接收客戶端請求,只是在有寫操作時利用copyonwrite機制複製資料

3、優缺點

RDB恢復資料的時間快,bgsave的時候也不會影響redis對外提供的效能,但是會存在較大丟失資料的風險;並且不支援拉鍊儲存,即最新的rdb檔案會覆蓋掉歷史版本的檔案,硬碟永遠只有一份持久化檔案

4、相關配置

  • save time count 在time時間內修改操作發生count筆時觸發rdb
  • stop-writes-on-bgsave-error 在持久化時如果出錯是否停止對外的寫入操作,預設為yes;即當持久化出問題比如說磁碟滿了的時候外界寫入會報錯
  • rdbcompression 預設為yes,表示將存到磁碟中的快照透過LZF演算法進行壓縮處理
  • rdbchecksum 是否使用CRC64演算法校驗rdb檔案是否損壞,預設為yes;如果需要提升redis的效能,此處可以不校驗
  • dbfilename rdb持久化檔案的名稱,預設為dump.rdb
  • dir rdb持久化檔案存放的目錄,預設為當前目錄./

二、AOF

1、介紹

一種透過配置可以做到幾乎實時的寫入式持久化方式,相對應的其會影響系統的效能;

2、實現原理

將每個redis指令都寫入aof檔案,並且具有重寫能力:隨著同步操作越來越多aof檔案的大小也會越來越大,這時會觸發重寫機制;redis可以在不打斷服務客戶端的情況下, 對 AOF 檔案進行重建(rebuild)。執行 BGREWRITEAOF 命令, Redis 將生成一個新的 AOF 檔案, 這個檔案包含重建當前資料集所需的最少命令。需要注意的是redis4.0以後重寫是會把rdb檔案寫到aof檔案裡面,只追加rdb過後的命令;這樣大大提高了效率

3、同步間隔配置

可以配置 Redis 多久才將資料 fsync 到磁碟一次;redis提供了三種方式:

  • 1、從不;將資料交給作業系統來處理,不主動刷盤,是個更快,也更不安全的選擇。
  • 2、每秒(預設);每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),並且在故障時只會丟失 1 秒鐘的資料。
  • 3、總是;每次有新命令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全

4、優缺點

AOF更安全,更不易丟資料,但是AOF恢復資料沒有RDB快,且AOF理論上會存在檔案一直無限變大的可能,即使有重寫和合並RDB機制,但當redis執行的時間足夠長時還是會存在檔案過大的問題

5、相關配置

  • appendonly 是否開啟aof持久化,預設為no
  • appendfilename aof的檔名稱
  • appendfsync 同步間隔,即多久寫入一次,三個候選值:always、everysec和no,預設使用的是everysec
  • no-appendfsync-on-rewrite 在重寫時是否使用no這種刷盤機制,預設為no,不使用

分析:在redis重新時主程式必然也會存在有大量寫入操作的可能,兩者都會操作磁碟,影響效能;該配置意思是在是否使用no這種刷盤機制,上面也結束了,no這種機制是最快但是最不可靠的寫入方式;redis預設為no,即表示在重新時仍然不使用no這種方式,寧願阻塞等待也不願意丟失資料;為yes的話則表示重寫時主程式使用no這種刷盤機智;

  • auto-aof-rewrite-percentage 重寫百分比即下次重寫的觸發時機,預設為100,表示當前aof檔案的增長大小達到上次重寫後aof檔案大小的100%時則自動觸發重寫;如果設定為0則表示不觸發重寫操作
  • auto-aof-rewrite-min-size 指定觸發重寫操作時aof檔案的大小,預設為64M,即aof檔案達到64m才會觸發重寫,不到64M即使滿足auto-aof-rewrite-percentage也不會觸發;
  • aof-load-truncated aof檔案損壞redis是否仍然載入;預設為yes;

注意:如果aof檔案在中間損壞,redis仍將退出並出現錯誤;

三、持久化的選擇策略

  • 如果允許部分資料丟失,可以選擇RDB
  • 如果需要儘量避免資料丟失,可以使用RDB+AOF的混合方式
  • 如果需要在效能和丟失做一箇中和,可以使用AOF的每秒刷盤一次的策略

相關文章