为什么需要Redis持久化?
redis的数据是存储在内存上的,而设备发生断电等故障的时候内存上的数据会消失,写入磁盘的数据不会受到断电的影响,因此我们需要将redis的数据持久化到磁盘上
redis官方提供了rdb(redis database),aof(append only file)两种持久化方式
rdb类似于我们虚拟机的快照,将某一时刻的数据和状态以文件的方式保存,aof则是将每一条写操作记录到一个文件中
rdb
什么是rdb
一句话说就是在指定的时间间隔,执行数据集的时间点快照,把数据和状态以快照文件的方式保存到磁盘,这个快照文件就是rdb文件
rdb备份文件是全量备份,每次备份将整个数据库的数据都进行备份
如何使用rdb
rdb分为自动触发和手动触发两种方式
自动触发
从redis配置文件中可以看到redis自动触发rdb备份的条件:
- 1小时内发生至少一次键变化
- 5分钟内发生至少100次键变化
- 1分钟内发生至少10000次键变化
把433行的#号去掉即开启rdb自动触发,其中的数值可以按需修改
同样的,我们可以在配置文件中设置rdb文件的保存路径以及rdb文件的名称
手动触发
redis提供了两种命令来手动生成rdb文件,分别为save和bgsave
两种都可以保存数据,区别在于save是阻塞的,而bgsave是非阻塞的
save会导致redis服务器无法响应其他请求,必须等待数据备份成功了才能解除阻塞
bgsave会fork一个子进程,通过子进程去备份redis的数据,在后台完成备份,允许主进程修改数据
因此在生产环境中不要使用save命令
恢复数据
当我们flushdb/flushall清空了redis数据的时候应该如何将数据恢复?
首先我们需要明确的是当我们使用flushdb/flushall命令的时候我们的rdb会和我们的最新状态保持一致,也就是说rdb文件也是空的,如果我们没有事先保存rdb文件的备份或者aof文件的话,那就是寄了
如果有事先保存rdb文件备份,那么将该文件放到redis安装路径下,在下一次重启的时候,redis会自动读取rdb的数据,数据将自动恢复
禁用rdb
- 在配置文件中启用save ""
- 执行命令redis-cli config set save ""
rdb的优缺点
优点
- 适合大规模的数据恢复
- 可以按照业务定时备份
- 适合对数据完整性和一致性要求不高的
- 在内存中加载速度比aof快
- 提高redis的性能
缺点
- 快照之间会丢失数据(有部分数据会因为没达到自动触发rdb的条件而丢失)
- 数据量太大时全量备份会使用大量I/O影响服务器性能
- 数据量大的时候fork可能会导致服务请求的瞬间延迟,因为fork会将内存数据克隆
什么情况会触发rdb快照
- 配置文件中设置的自动触发条件
- 手动save/bgsave
- 执行flushall/flushdb命令生成空的rdb文件
- 执行shutdown且没有设置aof持久化
- 主从复制时,主节点自动触发
aof
什么是aof
aof就是以日志的形式来记录每一个写操作,将redis执行过的所有写操作记录下来保存为aof文件
数据恢复时redis从头开始执行aof文件中的每一条指令以完成数据恢复工作
使用aof需要在配置文件中将appendonly 改为yes,默认不开启aof
aof缓冲区写回策略
为避免频繁的I/O,aof引入了缓冲区,何时将缓冲区的数据写入到文件中自然涉及到我们的写回策略
写回策略分三种:always,everysec,no,看名字就能知道是什么意思
在配置文件中可以设置启用哪种写回策略
redis7中aof的新特性
redis7中aof采用了multi part aof的设计方式,将原来的一个aof文件拆分成base,incr,history三个部分
拆分出来的文件将存放在aof目录下,这个目录和rdb文件在同一级目录中
同时我们可以通过配置文件修改aof文件目录名以及保存路径
aof的优缺点
优点
性能高,可做紧急修复,更好地保护数据不丢失
缺点
文件大,恢复速度慢于rdb,运行效率慢于rdb,每秒同步策略效率较好,不同步时效率和rdb相同
aof重写机制
当aof文件达到一定大小时就会触发redis的重写机制,将aof压缩成可以恢复数据的最小指令集
举个例子:
set k1 v1
set k1 v2
set k1 v3...
当文件达到一定大小时,文件只会保留最后一条有用的指令set k1 v3,其他无用指令统统删除
重写机制分为自动触发和手动触发
自动触发
当满足上面两个条件时系统将会自动重写aof文件,且重写过程是由子进程进行的,重写完成后aof文件的序号将会改变,base存储最小的指令集,incr文件继续记录每一条指令,manifest不会改变
这里的旧aof可以理解为incr1,新aof可以理解为incr2
手动触发
执行命令 bgrewriteaof
rdb-aof混合持久化
当磁盘中同时存在rdb和aof文件,系统会优先读取aof文件来恢复数据
rdb适合用来备份数据库
一旦使用了混合模式,重启服务时将从rdb和aof两部分来恢复数据:rdb快照+aof记录的快照后产生的数据
纯缓存模式
同时关闭rdb和aof
在配置文件中设置save "" 和 appendonly no