Redis持久化機制,優缺點,如何選擇合適方式


一、什么是Redis持久化?

持久化就是把內存的數據寫到磁盤中去,防止服務宕機了內存數據丟失。

二、Redis 的持久化機制是什么?各自的優缺點?

Redis 提供兩種持久化機制 RDB(默認) 和 AOF 機制:

RDB:是Redis DataBase縮寫快照

RDB是Redis默認的持久化方式。按照一定的時間將內存的數據以快照的形式保存到硬盤中,對應產生的數據文件為dump.rdb。通過配置文件中的save參數來定義快照的周期。

優點:

1、只有一個文件 dump.rdb,方便持久化。
2、容災性好,一個文件可以保存到安全的磁盤。
3、性能最大化,fork 子進程來完成寫操作,讓主進程繼續處理命令,所以是 IO 最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 redis 的高性能
4、相對於數據集大時,比 AOF 的啟動效率更高。

缺點:

數據安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生數據丟失。所以這種方式更適合數據要求不嚴謹的時候。

AOF(Append-only file)持久化方式:是指所有的命令行記錄以 redis 命令請 求協議的格式完全持久化存儲,保存為 aof 文件。

觸發機制-主要三種方式

  • save(同步)
  • bgsave(異步)
  • 自動

(1)save命令:客戶端向Redis發送save命令來創建一個快照文件。

 執行save命令的時候,如果存在老的快照文件,新的將會替換老的。

(2)bgsave命令:客戶端向Redis發送bgsave命令,Redis調用fork創建一個子進程,然后子進程負責將快照寫入硬盤,而父進程則繼續處理命令請求。

 save命令和bgsave命令對比:

 (3)自動生成:通過配置,滿足任何一個條件就會創建快照文件。

 快照持久化選項:

多久執行一次自動快照操作,60s之內有1000次操作寫入時執行
save 60 1000
創建快照失敗后是否仍然繼續執行寫命令
stop-writes-on-bgsave-error no
是否對快照文件進行壓縮
rdbcompression yes
命名硬盤上的快照文件
dbfilename dump.rdb

最佳配置:

dbfilename dump-${port}.rdb
dir /bigdiskpath
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

AOF:持久化

AOF持久化(即Append Only File持久化),則是將Redis執行的每次寫命令記錄到單獨的日志文件中,當重啟Redis會重新將持久化的日志中文件恢復數據。當兩種方式同時開啟時,數據恢復Redis會優先選擇AOF恢復。

優點:

1、數據安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次 命令操作就記錄到 aof 文件中一次。

2、通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof 工具解決數據一致性問題。

3、AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令 進行合並重寫),可以刪除其中的某些命令(比如誤操作的 flushall))

缺點:

1、AOF 文件比 RDB 文件大,且恢復速度慢。
2、數據集大的時候,比 rdb 啟動效率低。

AOF和RDB比較:

  • AOF文件比RDB更新頻率高,優先使用AOF還原數據。
  • AOF比RDB更安全也更大
  • RDB性能比AOF好
  • 如果兩個都配了優先加載AOF

AOF三種策略

(1)always:每條Redis寫命令都同步寫入硬盤。

(2)everysec:每秒執行一次同步,將多個命令寫入硬盤。

(3)no:由操作系統決定何時同步。

三種策略對比:生產環境中需要根據實際的需求進行選擇。

 AOF重寫

隨着Redis的運行,被執行的寫命令不斷同步到AOF文件中,AOF文件的體積越來越大,極端情況將會占滿所有的硬盤空間。如果AOF文件體積過大,還原的過程也會相當耗時。為了解決AOF文件不斷膨脹的問題,需要移除AOF文件中的冗余命令來重寫AOF。

 

AOF重寫的實現方式: bgrewriteaof命令

bgrewriteaof命令和bgsave命令的工作原理相似:Redis創建一個子進程,然后由子進程負責對AOF文件進行重寫。

AOF重寫配置
配置參數說明:

 具體配置:

appendonly yes
appendfilename "appendonly-${port}.aof"
appendfsync everysc
dir /bigdiskpath
no-appendfsync-on-rwrite yes
auto-aof-rewrit-percentage 100
auto-aof-rewrite-min-size 64mb

三、如何選擇合適的持久化方式

  一般來說, 如果想達到足以媲美PostgreSQL的數據安全性,你應該同時使用兩種持久化功能。在這種情況下,當 Redis 重啟的時候會優先載入AOF文件來恢復原始的數據,因為在通常情況下AOF文件保存的數據集要比RDB文件保存的數據集要完整。

如果你非常關心你的數據, 但仍然可以承受數分鍾以內的數據丟失,那么你可以只使用RDB持久化。

  有很多用戶都只使用AOF持久化,但並不推薦這種方式,因為定時生成RDB快照(snapshot)非常便於進行數據庫備份, 並且 RDB 恢復數據集的速度也要比AOF恢復的速度要快,除此之外,使用RDB還可以避免AOF程序的bug。

如果你只希望你的數據在服務器運行的時候存在,你也可以不使用任何持久化方式。

四、Redis持久化數據和緩存怎么做擴容?

  如果Redis被當做緩存使用,使用一致性哈希實現動態擴容縮容。

  如果Redis被當做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦確定不能變化。否則的話(即Redis節點需要動態變化的情況),必須使用可以在運行時進行數據再平衡的一套系統,而當前只有Redis集群可以做到這樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM