分布式实战:Redis企业级灾备方案
本文首发于Ressmix个人站点:https://www.tpvlog.com
上一章,我讲解了Redis的两种持久化方式的基本配置,那么在生产环境中,Redis的持久化到底该如何运用呢?企业级的数据备份和各种灾难下的数据恢复,又是怎么做的呢?
本章,我就通过实战演练,讲一讲企业级Redis灾备方案。
一、持久化配置策略
Redis的持久化配置,就两种——RDB和AOF,在生产环境配置下,主要就是关注它们的一些核心参数。我们来一一看下。
1.1 RDB
RDB的配置,用Redis默认提供的配置方案就够了,这里不再赘述。
1.2 AOF
生产环境,一定要把AOF持久化打开,持久化策略用默认的appendfsync everysec
就可以了。
二、数据备份策略
我们知道,RDB非常适合做冷备,每次生成之后,就不会再有修改了。所以,一种最简单实用的数据备份方案就是利用crontab:
写crontab定时脚本做数据备份;
小时级备份:每小时复制一份RDB拷贝到某个目录中,该目录中仅保留最近48小时的备份;
日级别备份:每天复制一份当日的RDB拷贝到某个目录中,该目录中仅保留最近1个月的备份;
每天晚上将上述所有的数据备份,发送一份到远程的云服务上去。
我这里给出这些crontab的脚本,供大家参考。
2.1 小时级备份
脚本位置:/usr/local/redis/copy/redis_rdb_copy_hourly.sh
备份文件位置:/usr/local/redis/snapshotting/[当前小时]/
1#!/bin/sh
2
3cur_date=`date +%Y%m%d%k`
4rm -rf /usr/local/redis/snapshotting/$cur_date
5mkdir /usr/local/redis/snapshotting/$cur_date
6cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
7
8del_date=`date -d -48hour +%Y%m%d%k`
9rm -rf /usr/local/redis/snapshotting/$del_date
然后执行命令crontab -e
,输入以下内容:
10 * * * * 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/[当前日期]/
1#!/bin/sh
2
3cur_date=`date +%Y%m%d`
4rm -rf /usr/local/redis/snapshotting/$cur_date
5mkdir /usr/local/redis/snapshotting/$cur_date
6cp /var/redis/6379/dump.rdb /usr/local/redis/snapshotting/$cur_date
7
8del_date=`date -d -1month +%Y%m%d`
9rm -rf /usr/local/redis/snapshotting/$del_date
然后执行命令crontab -e
,输入以下内容:
10 0 * * * sh /usr/local/redis/copy/redis_rdb_copy_daily.sh
三、数据恢复策略
数据恢复分为很多种情况,我们先来看下各种情况下的恢复策略。
Redis进程挂掉:重启Redis进程即可,直接基于AOF日志文件恢复数据,默认情况下最多丢失1s数据;
AOF和RDB文件出现了丢失/损坏:从云端找一个最新的小时级RDB备份文件,复制到Redis的RDB目录中去,可以恢复到某一个小时的数据。
3.1 恢复步骤
由于Redis启动时默认优先从AOF文件恢复数据,所以如果直接将云端RDB文件拷贝到Redis目录下,很可能启动后是没有数据的。正确的操作步骤应该如下:
停止Redis;
修改配置文件,关闭AOF持久化,同时删除Redis的AOF日志文件;
拷贝RDB备份文件到Redis目录下,然后启动Redis;
通过redis-cli命令行
config set appendonly yes
热修改启动AOF持久化,此时AOF日志文件中的数据就和RDB文件中的一致了;最后,停止Redis,修改Redis配置文件,开启AOF持久化。
四、总结
本章,我主要介绍了生产环境的Redis灾备方案,核心是Redis的数据恢复步骤,基于RDB文件恢复Redis数据时,一定要记得先关闭掉aof持久化,因为Redis默认优先从AOF日志文件恢复数据。