redis–15–持久化–RDB
1、 RDB是什么
将数据写入到磁盘里面
1.1、持久化时
在指定的时间间隔内将内存中的 数据集快照 写入磁盘, 也就是Snapshot快照,
1.2、恢复时
将快照文件直接读到内存里。
2、rdb的工作原理
- Redis单独创建一个子进程(fork函数)
- 子进程将Redis数据写入一个临时文件中
- 写入数据结束后,再用这个临时文件替换上次的rdb文件。
- 整个过程中,父进程是不进行任何IO操作的
2.1、 Fork
- fork函数复制一个与当前进程(父进程)一样的进程(子进程)。
- 在使用fork函数那一刻(T1),父子进共享同一内存数据
- 父子进程所有数据(变量、环境变量、程序计数器等)一致
- 在使用fork函数那一刻(T1),父子进共享同一内存数据
- 当父进程是否要对内存的数据做修改
- 是
- 操作系统会对内存中要修改的数据进行备份,保证子进程的数据是T1时刻的数据,这叫"写时复制技术"
- 否
- 父进程和子进程会共用同一段物理内存,
- 是
2.2、 RDB持久化流程
3、优缺点
3.1、缺陷
- Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
- 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
- 如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。
3.2、优点
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高更适合使用
- 节省磁盘空间
- 恢复速度快
4、配置
# rdb文件名称
dbfilename dump6379.rdb
# rdb文件的保存路径,要事先创建好
dir /redis/data/
# 900秒内改了1次。触发rbd
save 900 1
# 300秒内改了10次。触发rbd
save 300 10
# 60秒内改了1万次。触发rbd
save 60 10000
# 后台快照持久化发生错误时,客户端停止向服务端写操作。
stop-writes-on-bgsave-error yes
# 对于存储到磁盘中的快照,是否进行压缩存储。
# yes:采用LZF算法进行压缩。
rdbcompression yes
# 在存储快照后,让redis使用CRC64算法来进行数据校验,会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能,
# 推荐yes
rdbchecksum yes
5、触发rbd的场景
5.1、根据save规则发生rdb
- 按照规则定时将内存数据存储到硬盘中
- 每隔N分钟或N次写操作后, 从内存dump数据形成rdb文件
格式
save 秒钟 写操作次数
默认配置
# 3600秒内改了1次。触发rbd
save 3600 1
# 300秒内改了10次。触发rbd
save 300 10
# 60秒内改了1万次。触发rbd
save 60 10000
测试
# 10秒内改了1次。触发rbd
save 10 1
# 300秒内改了10次。触发rbd
save 300 10
# 60秒内改了1万次。触发rbd
save 60 10000
5.2、 save,bgsave 命令
为了测试,我们将 5.1的配置改为默认配置
# 900秒内改了1次。触发rbd
save 900 1
# 300秒内改了10次。触发rbd
save 300 10
# 60秒内改了1万次。触发rbd
save 60 10000
执行save
测试前将dump6379.rdb文件删掉
执行bgsave
测试前将dump6379.rdb文件删掉
5.2.1、 save,bgsave区别
save
- save是手动持久化。而且只管持久化,其它不管,会阻塞来自客户端的请求
- 不建议使用
bgsave
- 在后台异步进行持久化操作, 持久化同时还可以响应客户端请求。
- 可以通过 lastsave 命令获取最后一次成功执行快照的时间
5.3、 flushall命令
测试前将dump6379.rdb文件删掉
5.4、主从复制(replication)
发生在主从复制场景,即使没有定义save配置规则,并且也没有手动执行快照,也会生成rdb快照文件
6、rdb的备份和恢复
原理
redis启动后会自动读取rdb文件,将数据从硬盘加载到内存中
6.1、备份步骤
通过redis.conf配置文件,找到rdb文件目录,通过cp命令进行备份
cp dump6379.rdb dump6379.rdb.back
6.1、恢复步骤
1. 关闭redis
2. 删掉dump6379.rdb
3. dump6379.rdb.back 改为 dump6379.rdb
4. 启动Redis, 备份数据会直接加载
7、动态停止RDB
#save后给空值,表示禁用保存策略
127.0.0.1:6379> config set save ""