一、數據持久化之RDB 1、RDB介紹 Redis 資料庫文件,全稱 Redis DataBase,數據持久化方式之一,數據持久化預設方式,按照指定時間間隔,將記憶體中的數據及快照寫入硬碟 定義RDB文件名 dbfilename "dump.rdb" RDB指dump.rdb文件; redis數據每次 ...
一、數據持久化之RDB
1、RDB介紹
Redis 資料庫文件,全稱 Redis DataBase,數據持久化方式之一,數據持久化預設方式,按照指定時間間隔,將記憶體中的數據及快照寫入硬碟
定義RDB文件名
dbfilename "dump.rdb"
RDB指dump.rdb文件; redis數據每次存檔,如果不指定持久化的方式,數據就會預設存入dump.rdb文件中
2、相關配置
數據從記憶體保存到硬碟的頻率
save 900 1 # 900秒 (15分鐘) 且有1個key改變即存檔
save 300 10 # 300秒 (5分鐘) 且有10個key改變即存檔
save 60 10000 # 60秒 (1分鐘) 且有10000個key改變即存檔
手動存檔
save # 阻塞寫存檔
bgsave # 不阻塞寫存檔
阻塞寫存檔:即當記憶體中有1G大小的數據,執行了save命令,要寫入硬碟,這個過程需要1分鐘,則在這一分鐘的時間內,不允許向記憶體中存入數據
不阻塞寫存檔:即當記憶體中有1G大小的數據,執行了bgsave命令,要寫入硬碟,這個過程需要1分鐘,則在這一分鐘的時間內,是允許向記憶體中繼續存入數據的
save 將記憶體中的數據寫入到硬碟
# 刪除原有的持久化文件
[root@template ~]# rm /var/lib/redis/6379/*
[root@template redis-4.0.8]# redis-cli
127.0.0.1:6379> ping
PONG
# 添加數據
127.0.0.1:6379> mset v1 2 v2 4 v3 xx v4 66
OK
# 將記憶體中的數據馬上寫入到硬碟中(自動存檔的規則,需要滿足條件)
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> exit
# 採用預設持久化方式,數據存到dump.rdb中
[root@template ~]# ll /var/lib/redis/6379/
total 4
-rw-r--r--. 1 root root 231 Apr 17 20:02 dump.rd
重啟redis服務以後,數據依然存在
[root@template redis-4.0.8]# redis-cli shutdown
[root@template redis-4.0.8]# ps -ef | grep redis.conf
root 121839 1221 0 20:05 pts/0 00:00:00 grep --color=auto redis.conf
重新開啟redis服務
[root@template redis-4.0.8]# /etc/init.d/redis_6379 start
Starting Redis server...
查看當前庫下所有的數據,依然存在,數據永久存儲
[root@template redis-4.0.8]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> KEYS *
1) "site"
2) "student"
3) "v1"
4) "v4"
5) "v2"
6) "v3"
3、 數據備份與恢復
備份數據:備份dump.rdb 文件到其他位置
恢複數據:拷貝備份文件到資料庫目錄,啟動 redis 服務
redis伺服器數據備份,備份dump.rdb文件,到/opt目錄下
[root@template ~]# cp /var/lib/redis/6379/dump.rdb /opt/
將備份的數據拷貝給template,讓template擁有相同的數據
[root@template~]# scp /opt/dump.rdb [email protected]:/root/
進行redis的數據恢復,停止redis服務
[root@template~]# /etc/init.d/redis_6379 stop
# 刪除template,redis持久化數據文件
[root@template~]# rm -rf /var/lib/redis/6379/dump.rdb
# 將從template主機備份的文件,拷貝到redis的數據目錄下
[root@template~]# cp /root/dump.rdb /var/lib/redis/6379/
# 重啟服務,會重新載入dump.rdb
[root@template~]# /etc/init.d/redis_6379 start
[root@template~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> exit
4、驗證redis自動存檔
實驗環境準備,停止redis服務
[root@template~]# redis-cli -h 192.168.11.10 -p 6350 -a 123456 shutdown
進入到redis預設路徑下,刪除rdb數據文件
[root@template~]# cd /var/lib/redis/6379/
[root@template~]# rm -rf dump.rdb
配置文件中修改存檔時間
[root@template ~]# vim /etc/redis/6379.conf
.......
219 save 900 1 #900秒 (15分鐘) 且有1個key改變即存檔,不修改
220 save 120 10 #120秒 (2分鐘) 且有10個key改變即存檔, 修改修改修改!!!!!
221 save 60 10000 #60秒(1分鐘)且有10000個key改變即存檔,不修改
啟動redis服務
[root@template ~]# /etc/init.d/redis_6379 start
連接redis,存入變數
[root@template ~]# redis-cli
向reids中連續存入10個以上的變數
127.0.0.1:6379> mset v1 1 v2 1 v3 1 v4 1 v5 1 v6 1 v8 1 v9 1 v10 1 v11 1
127.0.0.1:6379> keys *
127.0.0.1:6379> exit
在redis的數據目錄下,兩分鐘dump.rdb出現,驗證redis自動持久化成功
[root@template ~]# ls /var/lib/redis/6379
5、優點與缺點
RDB優點:
高性能的持久化實現 ——》 創建一個子進程來執行持久化,先將數據寫入臨時文件,持久化過程結束後,再用這個臨時文件替換上次持久化好的文件;過程中主進程不做任何IO操作
1》持久化的效率高,因為是由一個單獨的子進程來負責將記憶體中的數據寫入到硬碟;
2》持久化過程:將當前進程中的數據生成快照文件,替換上次的持久化文件
PS:進程中的數據,指redis的所有數據,比較適合大規模數據恢復,且對數據完整性要求不是非常高的場合
恢複數據簡單,拷貝備份數據,重啟服務即可,因為RDB方式,有可能會丟失最後一次的持久化數據,使用時需要對數據完整性要求不高
RDB的缺點:
意外宕機時,丟失最後一次持久化的所有數據
1》redis 是每隔900秒(15分鐘),或者300秒(5分鐘),或者一分鐘變數改變10000次,會進行一次持久化(將記憶體數據寫入到硬碟);
2》如果在還沒有到達臨界點時(例如:一分鐘變數改變 9999次),硬碟損壞,會導致這9999次的數據丟失。
二、數據持久化之AOF
1、AOF介紹
Append Only File
追加方式記錄寫操作的文件,記錄 redis 服務所有寫操作,不斷的將新的寫操作,追加到文件的末尾,預設沒有啟用,使用cat命令可以查看文件內容
2、開啟AOF持久化功能,在template 上操作
[root@template ~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> config set appendonly yes #開啟AOF持久化功能
127.0.0.1:6379> config rewrite #將臨時配置寫到配置文件中
127.0.0.1:6379> exit
[root@template ~]# ls /var/lib/redis/6379/
appendonly.aof dump.rdb
3、查看AOF相關配置,在template上操作
[root@template ~]# vim /etc/redis/6379.conf
673:appendonly yes # aof持久化已經啟用
677:appendfilename "appendonly.aof" # aof持久化存放數據的文件名
4、AOF文件記錄寫操作的方式
[root@template ~]# vim /etc/redis/6379.conf
702 # appendfsync always #always 在redis中每進行一次寫操作, 都會將記錄存入appendonly.aof中,並將數據持久化到 dump.rdb文件中
703 appendfsync everysec #everysec 將寫操作記錄到appendonly.aof中,每秒執行一次,並將數據持久化到 dump.rdb文件中
704 # appendfsync no # no 只把寫操作記錄到appendonly.aof中,不會進行RDB持久化(節省系統資源)
5、備份與恢復
備份數據:備份 appendonly.aof 文件到其他位置
redis伺服器數據備份,在template 上操作
[root@template ~]# cp /var/lib/redis/6379/appendonly.aof /opt/
將備份的aof數據文件拷貝給node01,讓node01擁有相同的數據
[root@template ~]# scp /opt/appendonly.aof [email protected]:/root/
恢複數據:拷貝備份文件到資料庫目錄,啟動 redis 服務
[root@node01~]# /etc/init.d/redis_6379 stop
[root@node01~]# rm -rf /var/lib/redis/6379/dump.rdb
[root@node01~]# cp appendonly.aof /var/lib/redis/6379/
開啟本機的AOF持久化功能
[root@node01~]# vim /etc/redis/6379.conf
673 appendonly yes #no 修改為yes,啟動AOF功能
[root@node01~]# /etc/init.d/redis_6379 start
[root@node01~]# redis-cli
127.0.0.1:6379> keys *
127.0.0.1:6379> exit
6、優化配置
日誌文件會不斷增大,何時觸發日誌重寫?
auto-aof-rewrite-min-size 64mb //首次重寫觸發值
auto-aof-rewrite-percentage 100 //到達增長百分比,再次執行重寫
查看redis的日誌優化配置,在template上操作
#當日誌的數據第一次達到64mb時,會觸發重寫,重寫後文件大小為50Mb
#繼續嚮日志中存入數據,日誌大小為100Mb時,會觸發重寫,重寫後文件大小為80Mb
#繼續嚮日志中存入數據,日誌大小為160Mb時,會觸發重寫,重寫後文件大小為140Mb
#繼續嚮日志中存入數據,日誌大小為280Mb時,會觸發重寫,重寫後文件大小為260Mb
[root@template~]# vim /etc/redis/6379.conf
744 auto-aof-rewrite-percentage 100
745 auto-aof-rewrite-min-size 64mb
7、AOF優點與缺點
AOF優點
可以靈活設置持久化方式,出現意外宕機時,僅可能丟失1秒的數據
AOF缺點
持久化文件的體積通常會大於 RDB 方式,執行 fsync 策略時的速度可能會比 RDB 方式慢,驗證AOF存儲數據占用更多空間,在template上操作,統計appendonly.aof的行數
[root@node01 6379]# wc -l appendonly.aof
82 appendonly.aof
[root@node01 6379]# redis-cli
127.0.0.1:6379> set test 22
127.0.0.1:6379> exit #斷開redis連接
[root@node01 6379]# wc -l appendonly.aof #再次統計appendonly.aof的行數
94 appendonly.aof
8、生產環境的使用:
RDB和AOF持久化 需要同時開啟,RDB做持久化,AOF記錄redis執行命令
作者:ChAn 出處:http://www.cnblogs.com/sre-chan/-------------------------------------------
個性簽名:今天做了別人不想做的事,明天你就做得到別人做不到的事,嘗試你都不敢,你拿什麼贏!
如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!