Redis持久化之AOF
1、什么是AOF
AOF,Append Only File,是指Redis将每一次写操作都以日志的形式记录到一个AOF文件中的持久化技术。当需要恢复内存数据时,将这些写操作重新执行一次,便会恢复到之前的内存数据状态。
2、AOF基础配置
2.1、AOF的开启
默认是关闭。注意当我们同时开启RDB和AOF时,redis会加载AOF文件将数据初始化到内存。
appendonly no
2.2、AOF的文件组及目录
Redis7在这里做了重大的变化,原来 只有一个appendonly.aof文件,现在有3个文件:
-
基本文件:可以是RDB格式也可以是AOF格式(默认是RDB格式)。其存放的内容是由RDB转为AOF当时内存的快照数据。这个文件可以有多个
-
增量文件:以操作日志的形式 记录 转为AOF后的写入操作。这个文件可以有多个。
-
清单文件:用于维护AOF文件的创建顺序,保障激活时的应用顺序,该文件只有一个。
AOF相关文件名的前缀
appendfilename “appendonly.aof”
AOF相关文件存储的路径
appenddirname “appendonlydir”
3、Redis协议
增量文件扩展名为.aof,采用AOF格式。AOF格式其实就是Redis通讯协议格式,AOF持久化文件本质就是基于Redis通讯协议的文本,将命令以纯文本的方式写入到文件中。
Redis协议规定,Redis文本是以行来划分,每行以\r\n行结束。每一行的有一个消息头,以表示消息类型。消息头由六种不同的符号表示,其意义如下:
-
(+)表示一个正确的状态信息
-
(-)表示一个错误消息
-
(*)表示消息体总共有多少行,不包括当前行。
-
($)表示下一行消息数据的长度,不包括换行符长度\r\n。
-
(:)表示返回一个数指
4、Rewrite机制
随着使用时间的推移,AOF文件会越来越大。为了防止AOF文件由于太大而占用大量的磁盘空间,减低性能,Redis引入了Rewrite机制来对AOF文件进行压缩。
4.1、何为rewrite
所谓rewrite其实就是对AOF文件进行重写整理。当Rewrite开启后,主进程redis-server创建出一个子进程bgrewrite,由该子进程完成rewrite过程。其首先对现有aof文件进行rewrite计算,将计算结果保存到一个临时文件,写入完毕后,再将该临时文件覆盖原来的文件。
4.2Rewrite计算
rewrite计算遵循以下策略:
-
读操作命令不写人文件
-
无效命令不写入文件
-
过期数据不写入文件
-
多条命令合并写入文件
5、AOF优化配置
我们知道,数据写操作都是存储到内存中的。AOF想要将数据持久化到磁盘文件中那么就要用到这个命令;
appendfsync everysec
appendfsync有三种模式:
-
always:每一次写操作都将数据写到磁盘,很慢,但是基本不会丢失数据。
-
everyec:每秒同步一次数据到磁盘,默认的策略。
-
no: 从不主动地同步数据到磁盘,也就是说这个权力交给操作系统,让操作系统做决定什么时候(每30s)将数据同步到磁盘。效率最高。
这个配置项默认为no,表示在进行重写操作时,不会禁用appendfsync。但是当写操作数据量很大的时候可能会造成阻塞。如果将其改为yes,那么就和上面一个配置项设置为no的效果是一样的。
no-appendfsync-on-rewrite no
当bgrewriteaof在执行过程也是先将rewrite计算的结果写入到了aof_rewrite_aof缓存中,然后当缓存中数据达到一定量后就会调用发sync()进行刷盘操作,即数据同步,将数据写入到临时文件。该属性用于控制fsync()每次刷盘的数据量最大不超过4MB。
aof-save-incremental-fsync yes
redis支持记录时间戳数据在AOF文件中,目的是为了方便用户通过时间戳去恢复数据。默认是no
aof-timestamp-enabled no
这个属性用于aof文件加载时出现文件截断,当被设置为yes时,redis加载aof文件出现截断那么redis会发出这个日志信息给用户。如果设置为no的话,redis就会抛出错误并停止运行,直到用户将aof文件修复。
aof-load-truncated yes
6、修复AOF文件
当AOF损坏时,我们可以通过redis-check-aof来进行修复。当然也可以进行检查aof文件。
检查aof文件:
redis-check-aof 待检测aof文件
修复aof文件:
redis-check-aof --fix 待修复文件
7、AOF执行过程
AOF执行过程:
- Redis接收到的写操作命令并不是直接追加到磁盘的AOF文件的,而是将每一条写命令按照redis通讯协议格式暂时添加到AOF缓冲区aof_buf。
- 根据设置的数据同步策略,当同步条件满足时,再将缓冲区中的数据一次性写入磁盘的AOF文件,以减少磁盘IO,提高性能。
- 当磁盘的AOF文件大小达到了rewrite条件时,redis-server主进程会fork出一个子进程bgrewriteaof,由该子进程完成rewrite过程。
- 子进程bgrewrite首先对该磁盘AOF文件进行rewrite计算,将计算结果写入到一个临时文件,全部写入完毕后,再覆盖原来的AOF文件。
- 如果在rewrite过程中存在写操作,那么这些数据会被暂时写入到aof_rewrite_buf缓冲区,等将全部rewrite计算结果写入到临时文件后,会先将aof_rewrite_buf中的数据写入到临时文件,然后临时文件再覆盖原来的AOF文件。