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个元素为界拆分为多条命令执行

20191225132630588.png

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

a86b93d34c7e62c455a7df426c5c3015.png

把文件恢复到最后一次的正确操作

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慢
posted @   立勋  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示