Redis04-持久化AOF
1、什么是AOF
- AOF(Append Only File)是Redis的另一种持久化方式,通过记录所有写操作命令(以文本形式追加到文件)来实现数据持久化。与RDB快照不同,AOF更注重数据操作的完整性,适合需要高安全性的场景。
- 同时开启RDB和AOF,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整
2、AOF的持久化流程
- 所有的写入命令会追加到aof_buf(缓冲区)中。
- AOF缓冲区根据appendfsync参数的配置,将命令同步到硬盘的AOF文件中。
- 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
- 当Redis服务重启时,可以加载AOF文件进行数据恢复。
![image]()
3、AOF重写(rewrite)
AOF采用文件采用追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩
3.1、手动触发重写
直接调用bgrewriteaof命令
3.2、自动触发重写
- 两个参数同时满足会触发aof
- auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB
- auto-aof-rewrite-percentage:定义了AOF 文件大小相比上次重写后的增长比例,例如:100表示比之前大小增加了一倍
3.3、AOF重写流程

1.执行AOF重写请求。如果当前进程正在执行AOF重写,直接返回,如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成后再执行
2.父进程执行fork创建子进程
3.1主进程fork操作完成后,继续响应其他命令,所有修改命令继续写入AOF缓冲区并根据appendfsync策略同步到旧的AOF文件
3.2在fork开始到结束期间,父进程依然响应命令,Redis使用"AOF重写缓冲区"保存这部分新数据
4.子进程按照命令合并规则将内存快照的数据写入到新的AOF文件。每次写入硬盘数据量由aof-rewrite-incremental-fsync控制,默认为32MB,防止单次刷盘数据过多造成硬盘阻塞
5.1新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息
5.2父进程把AOF重写缓冲区的数据写入到新的AOF文件。
5.3使用新AOF文件替换老文件,完成AOF重写。
3.4、重写后的AOF文件为什么会变小?
1.进程内已经超时的数据不会写入AOF文件
2.重写后的AOF文件是当前进程中数据转化为的写命令
3.重写可以将多条写命令合并为一个,为了防止命令写入的数据过大造成客户端缓冲区溢出,重写程序在处理list、set、hash、zset类型的键时,会检查元素个数,默认以64个元素为界拆分为多条命令执行
4、配置文件
- 默认配置文件vim /etc/redis/redis.conf
- AOF持久化开启且存在AOF文件时,优先加载AOF文件
- AOF关闭或AOF文件不存在时,加载RDB文件
# 启用aof
appendfilename "appendonly.aof" # 指定文件名
appendonly yes # 启用aof ,默认no
# AOF文件记录写操作的方式
appendfsync always # 有新写操作立即记录,同时将数据写入硬盘中,即*.rdb中
appendfsync everysec # 每秒记录一次,同时将数据写入硬盘中,即*.rdb中
appendfsync no # 不往*.rdb中记录
# 默认配置当aof文件是上次rewrite后大小的1倍且文件大于64M时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
5、使用AOF恢复redis数据
正常恢复
- 修改默认的appendonly no,改为yes
- 将有数据的aof文件复制一份保存到对应目录(查看目录:config get dir)
- 重启redis
异常恢复
- 修改默认的appendonly no,改为yes
- 备份被写坏的AOF文件,防止修复失败
- 如遇到AOF文件损坏,通过redis-check-aof --fix appendonly.aof进行恢复,该命令扫描指定文件,丢弃无法解析的命令(仅保留完整可执行的命令)
- 重启redis
6、AOF优点缺点
aof优点
- 可以灵活的设置同步持久化appendfsync always或异步持久化appendfsync everysec
- 宕机时,仅可能丢失1秒的数据
aof的缺点
- AOF文件的体积通常会大于RDB文件的体积,RDB是压缩存放的
- 执行fsync策略时的速度可能会比RDB慢


浙公网安备 33010602011771号