多文件 AOF 的轮转机制
Redis 7.0 起 AOF 不再是一个大文件:appendonlydir 目录下由 manifest 描述一组有效文件,包括 base 基线文件与 incr 增量文件。写入先追加到当前 incr,重写在子进程里生成新的 base 与新的 incr,切换完成后旧文件被清理。因此「目录里有几个文件」和历史重写次数有关,跟当前数据量没有直接关系。
基本信息
| 适用版本 | Redis 7.0 及以上(多文件 AOF) |
|---|---|
| 目录位置 | dir 下的 appendonlydir(由 appenddirname 决定) |
| 有效集合 | 由 appendonly.aof.manifest 描述 |
| base 格式 | 由 aof-use-rdb-preamble 控制,开启时为 RDB 格式 |
典型使用场景
- 核对实例究竟会加载哪些文件:数据比预期少时先看 manifest,而不是只看文件名
- 备份前确认目录内容与 manifest 一致,避免只拷到半套文件
- 重写完成后确认旧 incr 已被清理、磁盘水位是否回落
- 手工迁移 AOF 目录时保证 base 与 incr 一起搬,manifest 同步随行
- 排查磁盘被吃满:先看 incr 是否长期没有重写而在持续膨胀
查看轮转结果
查看轮转结果
ls -l /data/redis/appendonlydir/ # 看到 base 与 incr 两类文件
cat /data/redis/appendonlydir/appendonly.aof.manifest # manifest 是权威清单
redis-cli INFO persistence | grep -E 'aof_base_size|aof_current_size' # 基线与增量大小
redis-cli BGREWRITEAOF # 手工触发一次重写,观察轮转
redis-cli INFO persistence | grep -E 'aof_last_bgrewrite_status' # 确认重写结果base 与 incr 的区别
| 文件 | 内容 | 何时产生 |
|---|---|---|
| base(.base.rdb 或 .base.aof) | 一次重写时的全量基线 | 每次重写生成新的 base |
| incr(.incr.aof) | 重写之后追加的写命令 | 重写切换后开启新的 incr |
| manifest | 记录上述文件的文件名与序号 | 每次重写时更新 |
manifest 里每个文件都带序号与类型标记:序号在每次重写后递增,类型区分基线(base)与增量(incr);不在清单里的旧文件和中断产生的临时文件都属残留,不参与加载。
自动重写由 auto-aof-rewrite-percentage 与 auto-aof-rewrite-min-size 触发,只针对当前增量相对基线的增长比例;写入量小的实例可能长期不重写,需要人工安排 BGREWRITEAOF。
备份必须是「整目录加 manifest」一起拷:只拷 incr 恢复不出完整数据,只拷 base 会丢掉最近写入;用手工挑选的文件替换整个目录,则可能直接启动失败。