Redis03-持久化RDB
1、RDB是什么
RDB是redis数据持久化的一种,在指定时间间隔内将内存中的数据集快照写入磁盘,恢复时将快照文件直接读入内存
2、触发机制
- RDB触发机制有手动和自动两种
2.1、手动触发RDB
- 通过在命令行输入save和bgsave来实现
- save命令会阻塞当前Redis服务器,直到RDB过程完成为止,对于内存几十GB以上的实例会造成长时间阻塞,线上环境不建议使用
- bgsave命令会使Redis进程执行fork操作,创建子进程,快照由子进程负责生成。阻塞只发生在fork阶段,时间很短
- 当redis存储的数据量达到几十GB并且空闲内存不多时,或者运行在虚拟机时,执行BGSAVE可能会造成长时间的系统停顿(fork创建子进程的时间变长了),手动触发的好处在于时间可控,SAVE由于没有创建子进程的过程在生成大快照时会比BGSAVE快
2.2、自动触发RDB
- 使用save相关配置,如 'save m n' 表示m秒之内数据集存在n次修改时,自动触发bgsave
- 主从环境下,从节点连接主节点时,主节点自动执行bgsave生成RDB文件并发送给从节点
- 执行debug reload命令重新加载Redis时,也会自动触发save操作
- 默认情况下执行shutdown命令关闭redis服务器时,如果没有开启AOF持久化功能则自动执行bgsave
3、BGSAVE执行流程
- 执行bgsave命令,Redis父进程判断当前是否存在正在执行的RDB或AOF子进程,不存在就执行,如果存在直接返回。
- 如果没有子进程,父进程执行fork操作创建子进程,fork操作过程中阻塞父进程
- 父进程完成fork操作后,可以继续响应其他命令。
- 子进程创建RDB文件,根据父进程内存生成快照文件,完成后替换上次持久化好的文件
- 进程发送信号给父进程表示完成,父进程更新统计信息

3.1、fork
- Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
- 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”
- 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
4、配置文件
4.1、配置RDB自动触发
- 通过配置文件/etc/redis/redis.conf来实现
相关配置参数
/etc/redis/redis.conf
dbfilename “dump.rdb” // 指定存放数据的文件名
dir /myredis/ //指定rdb文件的保存路径
save 900 1 // 900秒内且有1次修改
save 300 10 // 300秒内且有10次修改
save 60 10000 // 60秒内且有10000修改
- 动态修改
# 动态修改rdb文件存储位置,下次运行持久化时RDB文件会保存到新目录
config set dir/dbfilename newdir/newfilename
动态修改是否压缩,默认开启
config set rdbcompression {yes|no}
- 自动触发的其他选项
# 存储到磁盘中的快照是否压缩
rdbcompression yes|no
# 在存储快照后,使用crc16算法做数据校验,有10%的性能消耗
rdbchecksum yes|no
# 当启用了RDB且最后一次保存数据失败,Redis是否停止接收数据,一般为no
stop-write-on-bgsave-error yes|no
- 禁用启用RDB
# 禁用
slave ""
#save 900 1
#save 300 10
#save 60 10000
# 启用
#salve ""
save 900 1
save 300 10
save 60 10000
5、RDB优缺点
RDB优点
1.由子进程来执行持久化,过程中主进程不做任何IO操作,比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
2.RDB的数据恢复速度比AOF快
RDB的缺点
1.RDB无法做到秒级别的持久化,因为不能每秒执行fork操纵,频繁执行成本太高
2.意外宕机时,最后一次持久化的数据会丢
3.RDB文件采用特定的二进制格式保存,存在旧版redis不支持新版RDB的格式的问题
6、RDB文件的备份、恢复、校验
备份
- 先通过config get dir 查询rdb文件的目录
- 将*.rdb的文件拷贝至备份路径,完成rdb文件备份
恢复
- 关闭Redis
- 把备份的文件拷贝到redis的工作目录下
- 启动Redis
校验
- redis-check-dump 工具检测损坏RDB文件并获取对应的错误报告-

浙公网安备 33010602011771号