Redis-持久化機制

一、持久化

  • 概念
    Redis服務運行過程中,會定期把內存裏的數據保存到硬盤實現了數據永久存儲。持久化功能有效地避免因進程退出造成的數據丟失問題,當下次重啓時利用之前持久化的文件即可實現數 據恢復。
  • Redis持久化機制
    RDB
    AOF
    簡書上查找到的一些關於redis持久化資料

二、RDB(默認啓用)

2.1、RDB介紹

  • 數據庫目錄下的dump.rdb文件
]# grep "dbfilename"  /etc/redis/6379.conf 
dbfilename "dump.rdb"
  • 概念
    Redis數據庫文件,全稱Redis DataBase
    數據持久化默認方式
    按照指定時間間隔,將內存中的數據集快照寫入硬盤
  • Redis數據庫文件,全稱Redis DataBase
    1. 數據持久化方式之一
    2. 數據持久化默認方式
    3. 按照指定時間間隔,將內存中的數據集快照寫入硬盤

2.2、觸發機制

2.2.1、自動觸發

]# grep "save"  /etc/redis/6379.conf 
save 900 1		//15分鐘且有一個key改變即存盤
save 300 10		//5分鐘且有10個key改變即存盤
save 60 10000	//1分鐘且有10000個key改變即存盤
  1. 使用save相關配置,如“save m n”。表示m秒內數據集存在n次修改 時,自動觸發bgsave。
  2. 如果從節點執行全量複製操作,主節點自動執行bgsave生成RDB文件併發送給從節點,更多細節見6.3節介紹的複製原理。
  3. 執行debug reload命令重新加載Redis時,也會自動觸發save操作。
  4. 默認情況下執行shutdown命令時,如果沒有開啓AOF持久化功能則 自動執行bgsave。

2.2.2、手動存盤

  • save 阻塞寫存盤
    使用save命令時,無法進行讀寫數據
    阻塞當前Redis服務器,直到RDB過程完成爲止,對於內存 比較大的實例會造成長時間阻塞,線上環境不建議使用
  • bgsave 不阻塞寫存盤
    不影響讀寫操作
    Redis進程執行fork操作創建子進程,RDB持久化過程由子 進程負責,完成後自動結束。阻塞只發生在fork階段,一般時間很短

2.2.3、工作過程

在這裏插入圖片描述

  1. 執行bgsave命令,Redis父進程判斷當前是否存在正在執行的子進 程,如RDB/AOF子進程,如果存在bgsave命令直接返回。
  2. 父進程執行fork操作創建子進程,fork操作過程中父進程會阻塞,通 過info stats命令查看latest_fork_usec選項,可以獲取最近一個fork操作的耗時,單位爲微秒
  3. 父進程fork完成後,bgsave命令返回“Background saving started”信息並不再阻塞父進程,可以繼續響應其他命令。
  4. 子進程創建RDB文件,根據父進程內存生成臨時快照文件,完成後 對原有文件進行原子替換。執行lastsave命令可以獲取最後一次生成RDB的 時間,對應info統計的rdb_last_save_time選項。
  5. 進程發送信號給父進程表示完成,父進程更新統計信息,具體見 info Persistence下的rdb_*相關選項。

2.3、RDB優點缺點

2.3.1、優點

  • 高性能的持久化實現
    創建一個子進程來執行持久化,先將數據寫入臨時文件,持久化過程結束後,再用這個臨時文件替換上次持久化好的文件;過程中主進程不做任何IO操作
  • 比較適合大規模數據恢復,且對數據完整性要求不是非常高的場合
  • RDB是一個緊湊壓縮的二進制文件,代表Redis在某個時間點上的數據 快照。非常適用於備份,全量複製等場景。比如每6小時執行bgsave備份, 並把RDB文件拷貝到遠程機器或者文件系統中(如hdfs),用於災難恢復。
  • Redis加載RDB恢復數據遠遠快於AOF的方式。

2.3.2、缺點

  • 以外宕機時,丟失最後一次持久化的所有數據
  • RDB方式數據沒辦法做到實時持久化/秒級持久化。因爲bgsave每次運 行都要執行fork操作創建子進程,屬於重量級操作,頻繁執行成本過高。
  • RDB文件使用特定二進制格式保存,Redis版本演進過程中有多個格式 的RDB版本,存在老版本Redis服務無法兼容新版RDB格式的問題。

2.4、使用RDB文件恢復數據

2.4.1、寫入一些數據

192.168.4.51:6351> MSET a 1 b 2 c 3 d 4 e 5 f 6
OK
192.168.4.51:6351> keys *
1) "f"
2) "a"
3) "d"
4) "c"
5) "b"
6) "e"
192.168.4.51:6351> BGSAVE
Background saving started
192.168.4.51:6351> save
OK

2.4.2、備份數據

[root@redis1 ~]# ls /var/lib/redis/6379/
dump.rdb
[root@redis1 ~]# cp /var/lib/redis/6379/dump.rdb /root/
[root@redis1 ~]# ls /root/dump.rdb 
/root/dump.rdb
[root@redis1 ~]# scp /root/dump.rdb  root@192.168.4.52:/root/

2.4.3、恢復數據

[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> SHUTDOWN
not connected> exit  
[root@redis2 ~]# rm -rf /var/lib/redis/6379/dump.rdb 
[root@redis2 ~]# cp /root/dump.rdb  /var/lib/redis/6379/
[root@redis2 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys *
1) "d"
2) "a"
3) "f"
4) "b"
5) "e"
6) "c"

三、AOF

3.1、AOF介紹

  • AOF(append only file)持久化
    追加方式記錄寫操作的文件
    記錄redis服務所有寫操作
    不斷地將新的寫操作,追加到文件的末尾
    默認沒有啓用
    使用cat命令可以查看文件內容

3.2、啓用AOF

192.168.4.51:6351> CONFIG SET appendonly yes	//啓用
OK
192.168.4.51:6351> CONFIG REWRITE 			//寫進配置文件
OK
  • 查看配置文件中AOF的配置
[root@redis1 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly yes
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
  • 查看存放數據的aof文件
]# cat /var/lib/redis/6379/appendonly.aof

3.3、使用AOF文件恢復數據

3.3.1、備份

[root@redis1 ~]# cp /var/lib/redis/6379/appendonly.aof /root/
[root@redis1 ~]# scp /root/appendonly.aof root@192.168.4.52:/root

3.3.2、恢復

[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352 shutdown
[root@redis2 ~]# rm -rf /var/lib/redis/6379/*
[root@redis2 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly no
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
[root@redis2 ~]# sed -i '673s/no/yes/' /etc/redis/6379.conf
[root@redis2 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly yes
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
[root@redis2 ~]# cp /root/appendonly.aof /var/lib/redis/6379/
[root@redis2 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352 
192.168.4.52:6352> keys *

3.4、觸發機制

3.4.1、AOF文件記錄寫操作的方式

[root@redis2 ~]# grep “appendfsync” /etc/redis/6379.conf

  • appendfsync always
    • 時時記錄,並完成磁盤同步
  • appendfsync everysec
    • 每秒記錄一次,並完成磁盤同步
  • appendfsync no
    • 寫入aof ,不執行磁盤同步

3.4.2、日誌重寫

  • auto-aof-rewrite-min-size 64mb
    首次重寫觸發值
  • auto-aof-rewrite-percentage 100
    再次重寫,增長百分比

3.4.3、修復AOF文件

]# redis-check-aof  --fix  appendonly.aof 

3.5、AOF優點與缺點

3.5.1、AOF優點

  • 可以靈活設置持久化方式
  • 出現意外宕機時,僅可能丟失1秒的數據

3.5.2、AOF缺點

  • 持久化文件體積通常會大於RDB方式
  • 執行fsync策略時的速度可能會比RDB方式慢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章