什么是持久化?
将数据保存到可永久保存的存储设备中,持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中、XML数据文件中等。
也可以这样理解持久化:
应用层:如果关闭( Close )你的应用,然后重新启动则先前的数据依然存在。
系统层:如果关闭( Shut Down )你的系统(电脑),然后重新启动则先前的数据依然存在。
为何要持久化?
Redis的数据是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据会丢掉,因此为了让数据能够长期保存,就要将Redis里的数据做持久化存储。
持久化有哪几种?
Redis为持久化提供了两种方式:
RDB
每隔N分钟或N次操作,从内存dump数据形成rdb文件,压缩,放在备份目录,主要是以快照的方式进行保存。
AOF
记录每次对redis的命令操作,有点类似记录操作日志,当服务器重启的时候会重新执行这些命令来恢复原始数据。
持久化配置
RDB持久化配置
1 | #时间策略 |
如果想禁用RDB配置,在save的最后一行写上:save “”
AOF持久化配置
1 | appendonly yes #是否开启aof,默认no |
appendfsync有三种模式:
always:每一个命令都同步到aof,安全,速度慢。
no: 由操作系统判断缓冲区大小,统一写入到aof,同步频率低,速度快。
everysec:折中方案,每秒写一次,最多丢一秒。
aof-load-truncated yes 如果配置启用,在加载时如果发现aof尾部不正确时,会向客户端写入一个log,但是会继续执行,如果设置为no,发现错误就会停止,必须修复后才能重新加载。
持久化工作原理
RDB工作原理
RDB持久化触发分为两种:自己手动触发与Redis定时触发。
手动触发
- save:会阻塞当前redis服务器,直到持久化完成,线上应该禁止使用。
- bgsave:该触发方式会fork一个子进程,由于进程负责持久化过程,因此阻塞只会发生在fork子进程的时候
自动触发
- 根据 save m n配置规则自动触发
- 从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发bgsave
- 执行 debug reload时;
- 执行shutdown时,如果没有开启aof,也会触发
AOF工作原理
主要分为两步:
- 命令的实时写入,如果是appendfsync everysec配置,会有1s损耗
- 对aof文件重写
aof重写是为了减少aof文件的大小,可以手动或者自动触发。
- 手动触发:bgrewriteof
- 自动触发:根据配置规则触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系
持久化恢复数据
如果一台服务器上既有RDB文件,又有AOF文件,加载哪个呢?
如果想要恢复数据,只要重启Redis即可。启动时会检查AOF文件是否存在,如果不存在就尝试加载RDB。优先加载AOF的原因是AOF保存的数据更完整,我们知道AOF基本上最多丢失1s的数据。如下图所示。
性能优化建议
- 如果Redis数据并不是很重要或者可以通过其他方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其他途径补回
- 自定义策略定期检查Redis情况,然后可以手动触发备份、重写数据
- 单机如果部署多个实例,要防止多个实例同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变成串行
- 可以配置主从复制,利用一台从服务器进行备份处理,其他机器正常响应客户端的命令
- RDB持久化与AOF持久化可以同时存在,配合使用。