1. 什么是Redis RDB方式备份
Redis RDB(Redis DataBase)是Redis的一种持久化方式,可以将Redis的内存数据转化成硬盘的二进制文件。Redis RDB方式备份就是可以将Redis的内存数据定时转化成二进制文件,这些文件可以用于Redis实例下次启动时恢复数据。RDB备份只需要执行一条配置指令,其具体位置在redis.conf文件中,如下所示:
save 900 1
save 300 10
save 60 10000
1.1 RDB备份的优劣势
RDB备份优势: 1) 文件紧凑,可以压缩空间,节约硬盘空间;2) 从硬盘中恢复数据速度略快于AOF备份;3) 适合进行全量备份,可将多次操作的数据进行批量的恢复,便于维护Redis实例的一致性。
RDB备份劣势:运用RDB备份时候,系统目前是不能执行无限期持有数据,如果Redis异常crash掉,则可能会有一些数据会丢失。这是因为Redis在执行RDB备份时,是会先将整个数据集序列化成为一个数据快照,如果这个过程中挂了则就会导致Redis这一部分的数据在之后操作时丢失。
2. Redis RDB备份的执行流程
Redis RDB备份包含手动备份和自动备份,下面分别对两种备份方式进行操作流程介绍。
2.1 手动备份执行流程
手动备份可以通过发送SAVE或BGSAVE指令实现。SAVE指令会阻塞主服务线程以至于不过在Redis的性能上不进行推荐使用。这时我们只能采用BGSAVE指令,其有以下几个步骤:
首先,主服务进程创建出一个子进程;
子进程接下来会负责执行内存数据的物理备份到磁盘中。而主服务则如往常一样,负责处理新的客户端请求;
子进程完成备份后,会将备份的数据文件替换原来的快照文件;
主进程接下来会恢复快照中不存在的数据;
最后,Redis的一个完成阶段的回调函数负责决策是否清除之前已经达成的日志文件(又称为“以前的重放日志”)。
2.2 自动备份执行流程
自动备份可以通过Redis的配置文件进行设置,我们可以根据业务要求进行设置,Redis支持QPS-based(based on operations)和time-based(基于时间)两种方式。当触发对应方法时,我们只用执行BGSAVE指令即可实现。
3. Redis RDB数据恢复的操作方法
在Redis数据服务出现问题的时候,我们会使用备份来进行数据的恢复。数据恢复我们会从三个方面分析RDB数据的恢复 分别为问题数据定位、从备份文件中提取数据、目标Redis实例的数据恢复,下面我们分别进行步骤讲解:
3.1 问题数据定位
问题的定位方式: Redis的问题一般有两种:一种是主从全挂,另一种是单一实例故障。无论哪种情况,先在日志中查询出错的命令,定位到具体的数据。
#三个必要信息:
timestamp #时间戳
socket fd #套接字描述符
command instrument #命令执行过程的轨迹,
#日志文件注意点:
1)日志文件名称: redis_<port>.log #标准日志文件名规则,<port>:Redis运行的端口号。
2)日志文件存放路径: <Redis程序执行路径>/log #以Redis程序执行路径为基础查找,如未找到可在配置文件中查找。
3.2 从备份文件中提取数据
在Redis的备份目录中找到最新的RDB备份文件,进行传输。
#启动目标实例(目标Redis实例可以在同一台或分布式系统中,也可以在同种或不同种工具箱中)。
$redis-server redis.conf
#执行RDB恢复
redis-cli -h [target host] -p [target port] --rdb /backups/last-save.rdb
#通常的方式
redis-cli --rdb dump-%d | redis-cli -p [target port]
3.3 目标Redis实例的数据恢复
#关闭目标实例
$ redis-cli -h [工具箱名称或Redis节点] -p [端口号] shutdown
#覆盖原实例数据
$ cp /backups/last-save.rdb /var/lib/redis/
#启动目标实例
$ redis-server /etc/redis/[redis-port].conf
4. 总结
Redis RDB备份是Redis一种可行的持久化方式,具有快速、紧凑、恢复简单的特点,因此备受业界的支持。当Redis数据服务出现问题时,我们会从问题数据定位、从备份文件中提取数据、目标Redis实例的数据恢复三个方面出发进行操作。