Redis04-AOF_AOF数据恢复
AOF AOF数据恢复
AOF介绍
1.所有的写入命令会追加到aof_buf(缓冲区)中。
2.AOF缓冲区根据对应的策略向硬盘做同步操作。
3.随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
4.当Redis服务重启时,可以加载AOF文件进行数据恢复。了解AOF工作流程之后,下面针对每个步骤做详细介绍。
AOF重写过程可以手动触发和自动触发:
手动触发:直接调用bgrewriteaof命令
自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机
auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB
auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)相比上一次重写后AOF文件空间(aof_base_size)扩大倍数的百分比
自动触发时机
同时满足触发
aof_current_size>auto-aof-rewrite-min-size
(aof_current_size-aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage
其中aof_current_size和aof_base_size可以再info Persistence统计信息中查看
AOF的工作流程操作:命令写入(append)、文件同步(sync)、文件重写(rewrite)、重启加载(load)
命令写入
1.AOF命令写入的内容直接是文本格式,文本格式具有很好的兼容性和可读性
2.命令先写入缓冲区aof_buf中,再写入AOF文件
为啥要有缓冲区
1.Redis使用单线程响应命令,如果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负载
2.还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡。
文件同步
Redis将缓冲区中的命令同步到AOF文件中,同步策略由参数appendfsync控制
always | 每次写入都要同步到aof文件,严重降低redis速度 |
---|---|
no | 由操作系统决定同步时间,由于同步周期和数据量不可控不建议使用 |
everysec | 每秒执行一次同步,建议的同步策略,也是默认配置,兼顾性能和数据安全,理论上只有在系统突然宕机的情况下丢失1s的数据 |
文件重写
随着命令不断写入AOF文件,文件会越来越大。Redis采用AOF重写机制压缩文件大小
AOF文件重写是把Redis进程内的数据转化为写命令同步到新AOF文件的过程
重写后的AOF文件为什么会变小?
1.进程内已经超时的数据不会写入AOF文件
2.重写后的AOF文件是当前进程中数据转化为的写命令
3.重写可以将多条写命令合并为一个,为了防止命令写入的数据过大造成客户端缓冲区溢出,重写程序在处理list、set、hash、zset类型的键时,会检查元素个数,默认以64个元素为界拆分为多条命令执行
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重写。
重启加载
AOF持久化开启且存在AOF文件时,优先加载AOF文件
AOF关闭或AOF文件不存在时,加载RDB文件
自动同步
开启AOF功能需要设置配置:appendonly yes,默认不开启。AOF文件通过appendfilename 配置设置,默认文件名是appendonly.aof
vim /etc/redis/redis.conf
appendfilename "appendonly.aof" # 指定文件名
appendonly yes # 启用aof ,默认no
AOF文件记录写操作的方式
appendfsync always # 有新写操作立即记录,同时将数据写入硬盘中,即*.rdb中
appendfsync everysec # 每秒记录一次,同时将数据写入硬盘中,即*.rdb中
appendfsync no # 不往*.rdb中记录
aof瘦身参数
日志文件会记录不断增大,何时触发日志重写
Redis会记录上次重写时AOF文件的大小
默认配置当aof文件是上次rewrite后大小的1倍且文件大于64M时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
把文件恢复到最后一次的正确操作
redis-check-aof --fix /var/lib/redis/6379/appexdonly.aof
该命令扫描指定文件,当找到不正确的命令时会删除出错命令和之后的命令
AOF优点缺点
aof优点:
1.可以灵活的设置同步持久化appendfsync always或异步持久化appendfsync everysec
2.宕机时,仅可能丢失1秒的数据
aof的缺点:
1.AOF文件的体积通常会大于RDB文件的体积,RDB是压缩存放的
2.执行fsync策略时的速度可能会比RDB慢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)