0%

Redis持久化怎么玩

什么是持久化?

将数据保存到可永久保存的存储设备中,持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中、XML数据文件中等。

也可以这样理解持久化:

应用层:如果关闭( Close )你的应用,然后重新启动则先前的数据依然存在。

系统层:如果关闭( Shut Down )你的系统(电脑),然后重新启动则先前的数据依然存在。

为何要持久化?

Redis的数据是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据会丢掉,因此为了让数据能够长期保存,就要将Redis里的数据做持久化存储。

持久化有哪几种?

Redis为持久化提供了两种方式:

RDB
每隔N分钟或N次操作,从内存dump数据形成rdb文件,压缩,放在备份目录,主要是以快照的方式进行保存。

AOF
记录每次对redis的命令操作,有点类似记录操作日志,当服务器重启的时候会重新执行这些命令来恢复原始数据。

持久化配置

RDB持久化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#时间策略
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持久化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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工作原理

主要分为两步:

  1. 命令的实时写入,如果是appendfsync everysec配置,会有1s损耗
  2. 对aof文件重写

aof重写是为了减少aof文件的大小,可以手动或者自动触发。

  • 手动触发:bgrewriteof
  • 自动触发:根据配置规则触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系

持久化恢复数据

如果一台服务器上既有RDB文件,又有AOF文件,加载哪个呢?

如果想要恢复数据,只要重启Redis即可。启动时会检查AOF文件是否存在,如果不存在就尝试加载RDB。优先加载AOF的原因是AOF保存的数据更完整,我们知道AOF基本上最多丢失1s的数据。如下图所示。

redis数据恢复.png

性能优化建议

  1. 如果Redis数据并不是很重要或者可以通过其他方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其他途径补回
  2. 自定义策略定期检查Redis情况,然后可以手动触发备份、重写数据
  3. 单机如果部署多个实例,要防止多个实例同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变成串行
  4. 可以配置主从复制,利用一台从服务器进行备份处理,其他机器正常响应客户端的命令
  5. RDB持久化与AOF持久化可以同时存在,配合使用。