数据备份&数据恢复容灾练习

  • 数据备份
  • 开启RDB数据持久化方案
  • 开启AOF数据持久化方案
  • redis数据备份方案
  • redis数据恢复方案
  • redis数据的容灾练习后的注意事项


数据备份

redis的数据备份方案为RDB和AOF,在企业级应用中,通常我们会将这两种数据持久化方案都开启,RDB非常适合做冷备,每隔一段时间(触发了save命令的执行)生成一份dump.rdb文件,这份是不会再次被修改的,但是之前的dump.rdb是会被新的dump.rdb文件覆盖的。但是RDB相对于AOF来说,在redis发生故障后,RDB丢失的数据会比AOF多,AOF会实时将redis的写命令作为日志先记录在操作系统的OS cache中,redis每秒去调用操作系统的fsync方法将OS cache中的redis写日志记录到appendonly.aof文件中。

开启RDB数据持久化方案

redis的RDB数据持久化默认是开启的,可以直接在redis.conf文件中配置RDB的相关策略,我们搜索SNAPSHOTTING关键字,也就是快照,就可以看到redis关于RDB的相关配置

redis每次重启是不会生成新的dump,只有触发save命令的执行时,才会生成新的dump.rdb文件
配置RDB的策略
save < seconds > < changes >
第一个参数是时间秒 第二个参数是多少个key发送了变化
当这两个条件同时满足时就会生成一个快照
这个策略是可以配置多个的

开启AOF数据持久化方案

在redis.conf文件中我们去搜索APPEND ONLY MODE关键字,也就是仅追加模式,就可以看到redis关于AOF的相关配置

开启AOF的命令
appendonly yes
开启AOF持久化方案后,redis每一次重启后会检查redis保存数据持久化文件的目录下是否存在appendonly.aof文件,如果不存在就会生成一份新的AOF数据文件
AOF 的配置策略
appendfsync always redis每执行一次写命令,就立即在
appendonly.aof中追加一条写命令的日志,这样造成的效果是redis
的QPS大幅度下降
appendfsync everysec redis每秒将新的写命令追加到
appendonly.aof文件中,这样对redis的QPS影响是比较小的,也是
redis默认推荐的策略
appendfsync no redis将写命令追加到appendonly.aof文件中
的控制器交给了操作系统,所以此时的数据备份变得不再可控
AOF rewrite
aof的rewrite操作可以通过下面两个属性进行配置
auto-aof-rewrite-percentage 100 百分比
auto-aof-rewrite-min-size 64mb 上一次rewrite时文件的大小
这两个命令的含义就是在rewrite-min-size的基础上在扩大
rewrite-percentage时redis就会执行rewrite操作

redis数据备份方案

通过上面的了解,我们已经知道了如何去配置RDB和AOF,但是也知道了新的dump文件是会覆盖旧的dump文件的,也就是只有一份dump文件;AOF也会在rewrite-min-size和rewrite-percentage参数的影响下对appendonly.aof文件进行rewrite操作,所以我们要去定时的备份dump.rdb和appendonly.aof文件。

数据备份方案
1.写corntab定时调度脚本去做数据备份
2.每小时都copy一份rdb的备份,放到一个目录中,这个目录中仅保
存最近48小时的备份
3.每天都copy一份rdb的备份,放到一个目录中,这个目录中仅保存
最近一个月的备份
4.每次备份的时候都把最旧的那份备份删除
5.每天晚上将当前服务器上所有的数据备份,发送一份到远程的云
服务器上

每小时数据备份的相关脚本
每小时执行一次备份的脚本
名称为redis_rdb_copy_hourly.sh

#!/bin/sh
cur_date='date +%Y%m%d%k'
rm-rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb
/usr/local/redis/snapshotting/$cur_date
del_date ='date -d -48hour +%Y%m%d%k'
rm -rf /usr/local/redis/snapshotting/$del_date

redis每天执行一次备份的脚本
名称为redis_rdb_copy_daily.sh

#!/bin/sh
cur_date='date +%Y%m%d'
rm-rf /usr/local/redis/snapshotting/$cur_date
mkdir /usr/local/redis/snapshotting/$cur_date
cp /var/redis/6379/dump.rdb
/usr/local/redis/snapshotting/$cur_date
del_date ='date -d -1mounth +%Y%m%d'
rm -rf /usr/local/redis/snapshotting/$del_date

最后每天晚上将所有数据上传一份到远程的服务器

redis数据恢复方案

1.如果是redis进程挂掉,那么重启redis进程即可,redis会直接基于AOF日志文件恢复数据。
2.如果是redis进程所在的服务器挂掉,那么重启服务器后,尝试重启redis进程,尝试直接基于AOF日志文件进行数据恢复
3.如果redis当前最新的AOF和RDB文件出现了丢失或损坏,那么可以尝试基于该服务器上当前最新的RDB数据副本进行数据恢复
数据恢复的流程
3.1停止redis
3.2关闭aof(修改redis.conf)
3.3拷贝RDB备份
3.4重启redis,确认数据恢复
3.5直接在命令行热修改redis配置
config get appendonly
config set appendonly yes
此时就会基于当前redis内存中的数据,生成一份最新的aof文件
3.6此时在进入redis.conf配置文件中,打开aof
4.如果是当前服务器上所有的RDB文件全部损坏,那么从远程服务器上拉取最新的RDB快照回来恢复数据

redis数据的容灾练习后的注意事项

容灾演习的相关配置,以下是我对redis的配置,这样可以模拟一个简单的容灾练习环境
RDB的配置
save 1 5 只有每秒有五条数据发送变化,就执行一次RDB数据持久化
AOF的配置
appendonly yes 开启aof
appendfsync everysec 每秒保存一次
数据持久化文件的位置
/var/redis/6379
容灾练习中的注意事项
redis优先使用AOF产生的aof文件恢复数据,如果要采用aof恢复redis的数据时,直接将aof文件拷贝redis的数据持久化目录下即可。
如果要采用RDB文件去恢复数据,就要注意redis是否开启了aof,如果开启了,redis每次重新启动时如果没有aof文件就会生成一个新的aof文件,此时我们要基于RDB去恢复redis数据,持久化目录下是肯定没有aof文件的,所以在这个时候我们先应该关闭aof,在将dump.rdb文件拷贝到数据持久目录下重启redis,然后检查redis是否恢复,数据恢复后,在redis-cli端执行config set appendonly yes
命令,这时在redis持久化目录下就会基于现在redis内存中的数据生成一份aof文件,这时关闭redis进程,在redis配置文件中开启aof,然后重新启动redis