Redis持久化怎么玩
什么是持久化?
将数据保存到可永久保存的存储设备中,持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中、XML数据文件中等。
也可以这样理解持久化:
应用层:如果关闭( Close )你的应用,然后重新启动则先前的数据依然存在。
系统层:如果关闭( Shut Down )你的系统(电脑),然后重新启动则先前的数据依然存在。
为何要持久化?
Redis的数据是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据会丢掉,因此为了让数据能够长期保存,就要将Redis里的数据做持久化存储。
持久化有哪几种?
Redis为持久化提供了两种方式:
RDB
每隔N分钟或N次操作,从内存dump数据形成rdb文件,压缩,放在备份目录,主要是以快照的方式进行保存。
AOF
记录每次对redis的命令操作,有点类似记录操作日志,当服务器重启的时候会重新执行这些命令来恢复原始数据。
持久化配置
RDB持久化配置
#时间策略
save 900 1 #900秒至少有一个变化,则dump
save 300 10 #300秒至少有10个变化,则dump
save 60 10000 #60秒至少有10000个变化,则dump
stop-writes-on-bgsave-error yes #如果持久化出错,主程序是否停止写入
rdbcompression yes #是否支持压缩
rdbchecksum yes #存储和加载rdb文件时是否校验
dbfilename dump.rdb #设置rdb文件名
dir /usr/local/data #rdb文件保存路径
如果想禁用RDB配置,在save的最后一行写上:save ""
AOF持久化配置
appendonly yes #是否开启aof,默认no
appendfilename "appendonly.aof" #文件名称
appendfsync everysec #同步方式
no-appendfsync-on-rewrite no #aof重写期间是否不同步
#重写触发配置
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小增长率100%时重写
auto-aof-rewrite-min-size 64mb #aof文件至少64M时重写
aof-load-truncated yes #加载aof时如果有出错的处理
aof-use-rdb-preamble yes #文件重写策略
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持久化可以同时存在,配合使用。
本文作者: vic
同步个人博客: http://geekvic.top/post/758625c3.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!