Redis 持久化(RDB與AOF)詳解

當服務器發生意外導致服務器宕機的時候,redis保存在內存中的數據將會丟失,此時需要將數據持久化到硬盤中,防止丟失數據。redis持久化有兩種基本的方案:RDB與AOF。

一、RDB:數據快照

RDB是一種數據快照的持久化方式,將當前所有數據進行保存。Redis 重啓會通過加載dump.rdb文件恢復數據。

1 使用save指令執行存儲(手動執行):

        save指令的執行會阻塞當前redis服務,直到RDB過程執行完成,數據量大可能會阻塞很長時間,生產環境不建議使用。

       save命令相關配置(redis.conf中):

dir /usr/local/redis/redis-5.0.8/data #文件存儲路徑,包括持久化文件、日誌文件等
dbfilename dump_6379.rdb  #RDB持久化文件的文件名
rdbcompression yes   #是否開啓LZF壓縮;需要消耗cpu,但節省了空間;默認開啓
rdbchecksum yes  #是否進行RDB文件格式檢驗(讀寫都會校驗),設爲no可以節省10%時間,但是有一定的數據損壞風險;默認開啓

 2 使用bgsave(後臺保存)指令執行存儲(手動執行):

      bgsave指令的執行不會阻塞當前redis服務。會調用fork函數生成子進程來進行RDB存儲。可以在日誌文件中看到。建議使用

             bgsave相比於save,多出一個配置:

             stop-writes-on-bgsave-error yes #後臺存儲過程中出現錯誤,是否停止保存操作;默認yes

3 自動執行保存操作(用的是bgsave的方式):

       此方法用於在滿足特定條件的情況下,由redis服務器來發起指令(bgsave),保存數據。

       redis.conf指令:save seconds changes # 在指定時間內(seconds),發生了N次改變(changes ),則自動持久化數據

#一般以前面大,後面小的方式依次配置,需要根據生產環境業務來衡量配置方式
save 900 1           #900秒之內發生1次改變
save 300 10          #300秒之內發生10次改變
save 60 10000        #60秒之內發生10000次改變

4 其它觸發保存的方式

   4.1 主從全量複製的時候

   4.2  服務運行過程中重啓(redis-cli中):debug reload

   4.3  關閉服務器的時候指定(redis-cli中):shutdown save

5  使用dump.rdb文件恢復redis數據:

                只需要將dump.rdb文件複製到對應的redis安裝包下,然後在redis.conf中指定這個文件後啓動redis服務。

6  RDB優點:

    6.1 RDB是一個緊湊的二進制文件,存儲效率高。

    6.2 RDB存儲的是redis在某個時間點的數據快照,非常適合用於數據備份和全量複製等場景

    6.3 RDB恢復數據的速度比AOP快很多

    6.4 服務器可以每隔N小時執行bgsave備份,將備份文件拷貝到其它服務器中,用於災備。

7  RDB缺點

    7.1 每次讀寫RDB都是全量數據,佔用內存和IO,數據量大的時候效率低。

    7.2 無法做到實時持久化,可能丟失數據。

    7.3 basave指令每次都要執行fork函數創建子進程,會犧牲掉一些性能。

    7.4 Redis的衆多版本中未進行RDB文件格式的統一,有可能出現版本服務之間數據格式無法兼容。

二、AOP:過程日誌

       AOP是以獨立日誌的方式記錄每次寫命令,重啓redis時再重新執行AOF文件中的命令來恢復數據。

AOF解決了數據持久化的實時性,目前已經是redis持久化的主流方式。

AOF三種寫數據策略:

        always(每次):每次寫入操作都同步到AOF文件,數據零丟失,性能較差。不建議使用,除非對性能要求不高

        everysec(每秒):每秒將緩衝區的指令同步到AOF文件。最多丟失一秒內的數據,性能較高。建議使用,默認配置

        no(系統控制):由操作系統控制每次同步到AOF文件的週期,整體過程不可控。

1  配置redis.conf

appendonly yes   #是否開啓AOP,默認不開啓。yes | no
appendfilename "6379.aof"  #AOF存儲文件名
appendfsync  everysec  #每秒存儲一次,always | everysec | no
dir /usr/local/redis/redis-5.0.8/data #文件存儲路徑,包括持久化文件、日誌文件等

2  AOF重寫

    隨着時間的推移,AOF文件會越來越大,使用AOF重寫可以“去除很多不必要的或者過時的指令”和”合併一些指令“;可以降低磁盤佔有量,提高磁盤利用率,提高持久化效率,降低持久化寫的時間,提高IO性能。降低數據恢復用時,提高數據恢復效率。

   AOF重寫的兩種方式:

         a、手動重寫:redis-cli執行指令:bgrewriteaof

         b、自動重寫:

auto-aof-rewrite-percentage 100 #自動重寫百分比。設爲0則關閉重寫功能
auto-aof-rewrite-min-size 64mb #達到64mb自動重寫。設爲0k,則不限制重寫最小值

#單位設置:1k => 1000字節、1kb => 1024字節、1m => 1000000字節、1mb => 1024 * 1024字節、1g => 1000000000字節、1gb => 1024 * 1024 * 1024字節
#"info Persistence"指令查看當前大小:aof_current_size、aof_base_size
#觸發條件:1、aof_current_size >  auto-aof-rewrite-min-size
#         2、(aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

三、RDB對比AOF

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