Redis 的 RDB 持久化方案,相信大家都有所了解,但是对于企业来说,如果只是持久化了一个 RDB 文件,不足以应付生产级别的事故。通常的方案就是对 RDB 进行多个备份,今天带大家来真枪实弹操作下 RDB 的冷备,以及通过 RDB 进行数据恢复。
企业级冷备方案
Redis RDB 持久化是非常适合做企业级的冷备方案的,这里的冷备可以理解为将已生成的文件拷贝到其他机器或者云服务器上。
RDB 适合做冷备的原因如下:
- RDB 文件生成后,改变的频率低,除非频繁触发检查点导致重新生成。
- RDB 是 Redis 内存快照,比 AOF 日志恢复速度快。
- RDB 的生成策略可以自行配置,而且可以配置多项,可以根据系统的使用场景和实际情况进行设置。
备份方案
1.用 Linux 自带的 crontab 命令执行定时任务,调用数据备份脚本。
2.每小时备份一份一次当前最新的 RDB 快照文件到指定目录,只保留最近 48 小时的备份。
3.每天备份一份当前最新的 RDB 快照文件到指定目录,只保留最近一个月的 备份。
4.每天晚上将备份文件都发送远程的云服务器上。
每小时备份
首先需要编写一个脚本,专门用来做数据备份,创建脚本的命令如下:
代码语言:javascript复制mkdir /usr/local/redis
mkdir /usr/local/redis/copy
vi /usr/local/redis/copy/redis_rdb_copy_hourly.sh
mkdir /usr/local/redis/snapshotting
chmod 777 /usr/local/redis
然后编写这个脚本文件:
代码语言:javascript复制#!/bin/sh
cur_date=`date %Y%m%d%H`
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`
rm -rf /usr/local/redis/snapshotting/$del_date
脚本解释:
- cur_data 代表当前时间,精确到小时,比如 2021080616。
- 删除当前小时的快照文件。
- 创建当前小时的备份文件,文件为空的。
- 拷贝当前的快照文件到上一步创建的空的备份文件中。
- del_date 代表 48 小时以前的时间,精确到小时,比如 2021080416。
- 删除 48 小时以前的备份文件。
设置定时任务,每个小时的 0 分跑一次脚本:
代码语言:javascript复制crontab -e
0 * * * * sh /usr/local.redis/copy/redis_rdb_copy_hourly.sh
因为要等到下一个小时的 0 点,所以就手动运行脚本来测试:
代码语言:javascript复制cd /usr/local/redis/copy
./redis_rdb_copy_hourly.sh
会在 snapshotting 文件夹创建一个目录:2021080809,表示这是 2021-08-08 09 时的备份文件夹(注意这个时间是 UTC 时间)。这个目录里面还会有一个 dump.rdb 文件。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2ozk74r534mcg