作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
上一章,我讲解了Redis的两种持久化方式的基本配置,那么在生产环境中,Redis的持久化到底该如何运用呢?企业级的数据备份和各种灾难下的数据恢复,又是怎么做的呢?
本章,我就通过实战演练,讲一讲企业级Redis灾备方案。
一、持久化配置策略
Redis的持久化配置,就两种——RDB和AOF,在生产环境配置下,主要就是关注它们的一些核心参数。我们来一一看下。
1.1 RDB
RDB的配置,用Redis默认提供的配置方案就够了,这里不再赘述。
1.2 AOF
生产环境,一定要把AOF持久化打开,持久化策略用默认的appendfsync everysec
就可以了。
二、数据备份策略
我们知道,RDB非常适合做冷备,每次生成之后,就不会再有修改了。所以,一种最简单实用的数据备份方案就是利用crontab:
- 写crontab定时脚本做数据备份;
- 小时级备份:每小时复制一份RBD拷贝到某个目录中,该目录中仅保留最近48小时的备份;
- 日级别备份:每天复制一份当日的RBD拷贝到某个目录中,该目录中仅保留最近1个月的备份;
- 每天晚上将上述所有的数据备份,发送一份到远程的云服务上去。
我这里给出这些crontab的脚本,供大家参考。
2.1 小时级备份
脚本位置:/usr/local/redis/copy/redis_rdb_copy_hourly.sh
备份文件位置:/usr/local/redis/snapshotting/[当前小时]/
#!/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
然后执行命令crontab -e
,输入以下内容:
0 * * * * sh /usr/local/redis/copy/redis_rdb_copy_hourly.sh
2.2 日级别备份
脚本位置:/usr/local/redis/copy/redis_rdb_copy_daily.sh
备份文件位置:/usr/local/redis/snapshotting/[当前日期]/
#!/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 -1month +%Y%m%d`
rm -rf /usr/local/redis/snapshotting/$del_date
然后执行命令crontab -e
,输入以下内容:
0 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
三、数据恢复策略
数据恢复分为很多种情况,我们先来看下各种情况下的恢复策略。
- Redis进程挂掉:重启Redis进程即可,直接基于AOF日志文件恢复数据,默认情况下最多丢失1s数据;
- AOF和RDB文件出现了丢失/损坏:从云端找一个最新的小时级RDB备份文件,复制到Redis的RBD目录中去,可以恢复到某一个小时的数据。
3.1 恢复步骤
由于Redis启动时默认优先从AOF文件恢复数据,所以如果直接将云端RDB文件拷贝到Redis目录下,很可能启动后是没有数据的。正确的操作步骤应该如下:
- 停止Redis;
- 修改配置文件,关闭AOF持久化,同时删除Redis的AOF日志文件;
- 拷贝RDB备份文件到Redis目录下,然后启动Redis;
- 通过redis-cli命令行
config set appendonly yes
热修改启动AOF持久化,此时AOF日志文件中的数据就和RBD文件中的一致了; - 最后,停止Redis,修改Redis配置文件,开启AOF持久化。
四、总结
本章,我主要介绍了生产环境的Redis灾备方案,核心是Redis的数据恢复步骤,基于RBD文件恢复Redis数据时,一定要记得先关闭掉aof持久化,因为Redis默认优先从AOF日志文件恢复数据。