AOF 重写是什么
AOF 会随着写入不断膨胀,需要重写来压缩:BGREWRITEAOF 手动触发,由后台子进程根据当前数据集生成一份最小的新 AOF;自动重写则由两个阈值共同控制——相对上次重写后的增长率与最小文件体积。重写期间会 fork 子进程,内存与磁盘 IO 都会上升,因此关注点应当是重写频率,而不只是重写是否成功。
基本信息
| 手动触发 | BGREWRITEAOF |
|---|---|
| 自动触发 | auto-aof-rewrite-percentage 与 auto-aof-rewrite-min-size 同时满足 |
| 默认值 | 增长比例 100,最小体积 64mb |
| 观察方式 | INFO persistence 中的重写状态与基准体积 |
| 实现机制 | fork 子进程配合写时复制 |
典型使用场景
- AOF 文件持续膨胀后手工压缩一次
- 调整自动重写阈值,减少频繁重写
- 重写期间出现延迟抖动时的排查
- 备份之前确认 AOF 处于一致状态
- 评估现有磁盘 IO 能否承受重写压力
操作与观察
操作与观察
BGREWRITEAOF # 手动触发重写
INFO persistence | grep aof_rewrite_in_progress
INFO persistence | grep aof_base_size
INFO persistence | grep aof_pending_rewrite
INFO persistence | grep aof_last_bgrewrite_status
CONFIG GET auto-aof-rewrite-percentage
CONFIG GET auto-aof-rewrite-min-size指标与参数读法
| 指标或参数 | 含义 | 判读方式 |
|---|---|---|
| BGREWRITEAOF | 手动触发重写 | 返回状态立刻可知 |
| auto-aof-rewrite-percentage | 相对上次重写后的增长比例 | 默认 100,即体积翻倍才触发 |
| auto-aof-rewrite-min-size | 触发重写的最小体积 | 默认 64mb,小实例尤其要看 |
| aof_rewrite_in_progress | 是否正在重写 | 长期为 1 说明盘慢或数据集过大 |
| aof_base_size | 上次重写后的基准体积 | 用于计算当前增长比例 |
重写同样走 fork 加写时复制:写入压力大时内存占用与磁盘 IO 会同时上升,如果观察到 aof_rewrite_in_progress 长时间为 1,就要怀疑磁盘性能跟不上。
重写期间做备份只拷贝增量文件是不安全的:此时基准文件尚未合并完成,拷出来的 AOF 集合并不一致,恢复时必然缺数据。
频繁自动重写会让吞吐出现周期性抖动:先检查增长率与最小体积这两个阈值是不是设得太小,再评估磁盘性能是否够用。如果每次重写都远超预期耗时,通常说明磁盘随机写能力不足,而不是参数没调好。