1、RDB模式
RDB:基于时间的快照,默认值保留当前最新的一次快照,优点是执行速度快,缺点是可能会丢失从上次快照到当前时间未做快照的数据。
1.1、RDB原理
1.2、RDB相关配置
save 900 1
save 300 10
save 60 10000
dbfilename dump_6379.rdb
dir /apps/redis/data
stop-writes-on-bgsave-error yes
rdbcompression yes # 是否启用压缩
rdbchecksum yes # 是否开启RC64校验
1.3、生成RDB快照的三种方法
-
save:会造成阻塞,不推荐
-
bgsave:异步后台执行,不影响其他命令执行,推荐
-
自动 :制定规则,自动执行
1.3.1、观察自动保存
[root@centos7 ~]#vim /apps/redis/etc/redis.conf
save 60 3
#测试60s内修改3个key,验证是否生成RDB文件
1.3.2、观察bgsave
[root@vms228 ~]# redis-cli -a redis bgsave
127.0.0.1:6379> info Persistence
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0 # 为0代表备份完成
rdb_last_save_time:1644979739
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:237568
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
1.4、RDB模式优缺点
优点:
RDB快照保存某个时间点的数据,用过bgsave备份。
备份时父进程只需要fork出子进程,来处理备份任务,最大化redis性能。
RDB在大量数据时恢复速度比AOF快。
缺点:
不能实时保存数据,不适用于服务器故障时数据丢失恢复。一旦故障,可能会丢失好几分钟的数据。
数据量非常大且cpu紧张时,fork可能非常耗时(长达一秒或者更久)
1.5、手动备份RDB文件
#!/bin/bash
. /etc/init.d/functions
BACKUP=/backup/redis-rdb
DIR=/apps/redis/data
FILE=dump_6379.rdb
PASS=redis
redis-cli -h 127.0.0.1 -a $PASS --no-auth-warning bgsave
result=`redis-cli -a $PASS --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p'`
echo $result
until [ "$result" == 0 ];do
sleep 1
result=`redis-cli -a $PASS --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p'`
done
DATE=`date +%F_%H-%M-%S`
[ -e $BACKUP ] || { mkdir -p $BACKUP ; chown -R redis.redis $BACKUP; }
mv $DIR/$FILE $BACKUP/dump_6379-${DATE}.rdb
action "Backup redis RDB"
2、AOF
AOF 和 RDB 一样使用了写时复制机制,AOF默认为每秒钟 fsync一次,即将执行的命令保存到AOF文件当中,
这样即使redis服务器发生故障的话最多只丢失1秒钟之内的数据,也可以设置不同的fsync策略always,
即设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而
不受到写入AOF文件的I/O影响
注意:如果同时开启了AOF和RDB,AOF的优先级高于RDB的优先级。
AOF 模式默认是关闭的,第一次开启AOF后,并重启服务生效后,会因为AOF的优先级高于RDB,而
AOF默认没有文件存在,从而导致所有数据丢失
2.1、如何正确开启AOF?(重要,第一次开启不能直接修改配置文件)
# 当前采用了RDB备份数据
[root@vms228 ~]# tree /apps/redis/data/
/apps/redis/data/
├── dump_6379.rdb
├── dump_6380.rdb
└── dump_6381.rdb
[root@vms228 ~]# redis-cli -a redis config get appendonly
1) "appendonly"
2) "no"
# 切换AOF时,需要先将RDB文件转换成AOF文件
[root@vms228 ~]# tree /apps/redis/data/
/apps/redis/data/
├── appendonly_6379.aof
├── dump_6379.rdb
├── dump_6380.rdb
└── dump_6381.rdb
[root@vms228 data]# vim /apps/redis/etc/redis_6379.conf
appendonly yes
appendfilename "appendonly_6379.aof"
appendfsync always
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
2.2、AOF rewrite重写
将一些重复的,可以合并的,过期的数据重新写入一个新的AOF文件,从而节约AOF备份占用的硬盘空间,也能加速恢复过程
127.0.0.1:6379> set zhaozhijie zhaozhijie
OK
127.0.0.1:6379> set zhaozhijie zzj
OK
# 整理aof文件
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
2.3、AOF模式的优缺点
2.3.1、优点
数据安全性较高,及时flushall删除了整个数据库,appendonly.aof文件依旧存在。而RDB文件数据就不存在了。
AOF文件体积过大时,支持对AOF进行重写,重写操作绝对安全
[root@vms228 data]# ll -h /apps/redis/data/
总用量 33M
-rw-r--r-- 1 redis redis 17M 2月 16 14:05 appendonly_6379.aof
-rw-r--r-- 1 redis redis 17M 2月 16 13:59 dump_6379.rdb
[root@vms228 data]# redis-cli -a redis
127.0.0.1:6379> flushall
OK
[root@vms228 data]# ll -h
总用量 17M
-rw-r--r-- 1 redis redis 17M 2月 16 14:16 appendonly_6379.aof # 数据依旧存在
-rw-r--r-- 1 redis redis 92 2月 16 14:17 dump_6379.rdb
# 采用AOF模式执行flushall之后数据如何恢复?
答:编辑aof文件,删除flushall这一行
[root@vms228 data]# vim appendonly_6379.aof
删除flushall
[root@vms228 data]# systemctl restart redis_6379.service
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1000007,expires=0,avg_ttl=0
# 再恢复RDB备份
127.0.0.1:6379> bgsave
Background saving started
[root@vms228 data]# ll -h
总用量 33M
-rw-r--r-- 1 redis redis 17M 2月 16 14:25 appendonly_6379.aof
-rw-r--r-- 1 redis redis 17M 2月 16 14:27 dump_6379.rdb
2.3.2、缺点
重复操作也会记录,占用空间大
回复速度比RDB慢
3、RDB和AOF的选择
只充当缓存数据,生产环境一般只需启用RDB
数据需要持久存储,一点不能丢失,要同时启用RDB和AOF,不能只启用AOF