redis数据备份原理和定时冷备份脚本

文件目录:

|- /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 定时调度脚本去做数据备份

  1. 小时级:每小时都 copy 一份 rdb 的备份,到一个目录中去,仅仅保留最近 48 小时的备份
  2. 日级:每天都保留一份当日的 rdb 的备份,到一个目录中去,仅仅保留最近 1 个月的备份
  3. 每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去

使用脚本来完成。

创建相关目录: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 脚本说明:

https://www.cnblogs.com/erbing/p/10019172.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值