文件目录:
|- /etc
|- /redis # 存放配置文件,按端口名命名
|- 7001.conf
|- /redis-cluster # 存放 redis 集群维护的配置文件目录
|- /init.d
|-/redis_7001 # 启动脚本
|- /var
|-/log/redis # 存放日志文件
|-/7001.log # 日志文件
|-/redis/7001 # 存放数据文件
综合使用 AOF 和 RDB 两种持久化机制:
1、用 AOF 来保证数据不丢失,作为数据恢复的第一选择;
2、用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复;
通过 RDB 或 AOF,都可以将 redis 内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去,比如说阿里云,云服务。如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。我觉得这里面两种最重要的差别是什么?rdb文件是快照 , aof文件是操作指令。
配置rdb持久化操作
redis.conf文件,也就是/etc/redis/*,去配置持久化。
conf文件中
save 60 10000 : 每隔60s,如果有超过10000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redis内存中完整的数据快照,这个操作也被称之为snapshotting,快照。也可以手动调用save或者bgsave命令,同步或异步执行rdb快照生成。
save可以设置多个,就是多个snapshotting检查点,每到一个检查点,就会去check一下,是否有指定的key数量发生了变更,如果有,就生成一个新的dump.rdb文件。
可以设置多个检查点,默认设置了 3 个检查点
配置aof持久化操作
AOF 持久化,默认是关闭的,RDB 是默认开启的。
/etc/redis/****.conf 中的 APPEND ONLY MODE 配置区。
appendonly yes
启用后 appendfsync 属性开始生效,有三个策略可选
-
no:不主动执行fsync
仅仅 redis 负责将数据写入 os cache 就撒手不管了,然后后面 os 自己会时不时有自己的策略将数据刷入磁盘,不可控了
-
always:每次写入一条数据就执行一次 fsync
每次写入一条数据,立即将这个数据对应的写日志 fsync 到磁盘上去,性能非常非常差,吞吐量很低; 确保说 redis 里的数据一条都不丢,那就只能这样了
-
everysec:每隔一秒执行一次 fsync
每秒将 os cache 中的数据 fsync 到磁盘,这个最常用的,生产环境一般都这么配置,性能很高,QPS 还是可以上万的。
QPS 指每秒钟的请求数量。大概的举个例子 :
- mysql -> 是基于大量磁盘,1~2K QPS
- redis -> 基于内存,磁盘做持久化,单机 QPS 一般来说上万没有问题
AOF rewrite
redis 中的数据其实有限的,很多数据可能会自动过期,可能会被用户删除,可能会被 redis 用缓存清除的算法清理掉,总之 redis 中的数据会不断淘汰掉旧的,就一部分常用的数据会被自动保留在 redis 内存中。
所以可能很多之前的已经被清理掉的数据,对应的写日志还停留在 AOF 中,AOF 日志文件就一个,会不断的膨胀,变大。
所以 AOF 会自动在后台每隔一定时间做 rewrite 操作,比如日志里已经存放了针对 100w 数据的写日志了; redis 内存中只剩下 10 万; 基于内存中当前的 10 万数据构建一套最新的日志,到 AOF 中; 覆盖之前的老日志; 确保 AOF 日志文件不会过大,保持跟 redis 内存数据量一致。
redis 2.4 之前,还需要手动,开发一些脚本 crontab 定时通过 BGREWRITEAOF 命令去执行 AOF rewrite,但是 redis 2.4 之后,会自动进行 rewrite 操作
aof rewrite 有两个重要的配置参数
/etc/redis/****.conf
上面的配置意思是: 当 aof 日志超过 64 m 且,上一次 aof 之后的文件大小,比如是 60 m,那么当文件增长到 120 m 的时候,就会触发 rewrite 操作
- auto-aof-rewrite-percentage: 增长百分比,比上一次增长多少内容的时候就会触发 rewrite 操作
- auto-aof-rewrite-min-size:rewrite 操作的最小文件大小,超过该大小才会执行 rewrite 操作
redis发生异常,重启,就会先恢复aof命令里面保存的数据。如果 redis 在 append 数据到 AOF 文件时,机器宕机了,可能会导致 AOF 文件破损。
可以用 redis-check-aof --fix 命令来修复破损的 AOF 文件(该命令在 redis 安装目录下)。
AOF 和 RDB 同时工作
- 他们的自动执行是互斥的
- 如果 RDB 在执行 snapshotting,此时用户手动执行 BGREWRITEAOF 命令,那么等 RDB 快照生成之后,才会去执行 AOF rewrite
- 同时有 RDB snapshot 文件和 AOF 日志文件,那么 redis 重启的时候,会优先使用 AOF 进行数据恢复,因为其中的日志更完整
在企业中,RDB 的生成策略,用默认的也差不多,如果有可能改动的地方,可能是如下两个配置:
-
save 60 10000:如果你希望尽可能确保说,RDB 最多丢 1 分钟的数据,那么尽量就是每隔 1 分钟都生成一个快照,低峰期,数据量很少,也没必要
-
AOF 一定要打开everysec
- auto-aof-rewrite-percentage 100: 就是当前 AOF 大小膨胀到超过上次 100%,上次的两倍
- auto-aof-rewrite-min-size 64mb: 根据你的数据量来定,16mb,32mb
备份脚本
RDB 非常适合做冷备,每次生成之后,就不会再有修改了
数据备份方案:写 crontab 定时调度脚本去做数据备份
- 小时级:每小时都 copy 一份 rdb 的备份,到一个目录中去,仅仅保留最近 48 小时的备份
- 日级:每天都保留一份当日的 rdb 的备份,到一个目录中去,仅仅保留最近 1 个月的备份
- 每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去
使用脚本来完成。
创建相关目录:mkdir /usr/local/redis/snapshotting
mkdir /usr/local/redis/copy
按小时级备份:
1、备份脚本
vi copy/redis_rdb_copy_hourly.sh
#!/bin/sh
# 生成文件夹名称 2020070810
cur_date=`date +%Y%m%d%k`
# 以防万一,先删除,再创建目录
rm -rf /usr/local/redis/snapshotting/$cur_date
# -p 可以创建多级目录
mkdir -p /usr/local/redis/snapshotting/$cur_date
cp /var/redis/7001/dump.rdb /usr/local/redis/snapshotting/$cur_date
# 生成 48 小时前的目录 2020070610
del_date=`date -d -48hour +%Y%m%d%k`
rm -rf /usr/local/redis/snapshotting/$del_date
2、定时操作脚本
# 该命令打开的是一个列表,有多条调度任务就一行一个
crontab -e
# 每/周日时分 0 秒,也就是每小时执行一次该脚本
0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
按天备份也是如此,与前面的脚本一样,只是时间表达式不一样
vi copy/redis_rdb_copy_daily.sh
#!/bin/sh
# 生成文件夹名称 20200708
cur_date=`date +%Y%m%d`
# 以防万一,先删除,再创建目录
rm -rf /usr/local/redis/snapshotting/$cur_date
# -p 可以创建多级目录
mkdir -p /usr/local/redis/snapshotting/$cur_date
cp /var/redis/7001/dump.rdb /usr/local/redis/snapshotting/$cur_date
# 生成 一个月前的文件夹
del_date=`date -d -1month +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$del_date
# 该命令打开的是一个列表,有多条调度任务就一行一个
crontab -e
# 每/周日时分 0 秒,也就是每小时执行一次该脚本
0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
特别注意的是用rdb冷备恢复数据因为也启用aof备份恢复的原因,重启redis会优先给予aof文件恢复,虽然删除了appendonly.aof,但是因为打开了aof持久化,redis就一定会优先基于aof去恢复,即使文件不在,那就创建一个新的空的aof文件。
如何在数据安全丢失的情况下,基于rdb冷备,如何完美的恢复数据,同时还保持aof和rdb的双开?
停止redis,conf配置文件关闭aof(appendonly no)
,拷贝rdb备份,重启redis,确认数据恢复,直接在命令行热修改redis配置,打开aof,这个redis就会将内存中的数据对应的日志,写入aof文件中。此时aof和rdb两份数据文件的数据就同步了。
redis config set热修改配置参数,可能配置文件中的实际的参数没有被持久化的修改,再次停止redis,手动修改配置文件,打开aof的命令,再次重启redisredis-cli
config get appendnoly
config set appendonly yes
最后这个时候,conf文件的aof配置还是no,这个时候,再安全关停一下redis ,在再改成 appendonly
yes,启动redis。
crontab 脚本说明: