什么时候自动重写
AOF 是追加写入的日志,体积会随写入持续增长,需要定期重写来压缩。是否自动重写由两个参数共同决定:auto-aof-rewrite-percentage 表示当前 AOF 相对「上次重写后的大小」增长了多少百分比,auto-aof-rewrite-min-size 表示 AOF 至少要达到多大才值得重写。两个条件必须同时满足才会触发,这样小实例不会因为百分比早就被满足而频繁重写,大实例也不会因为绝对体积大就一直重写。
基本信息
| 增长阈值 | auto-aof-rewrite-percentage,默认 100 即翻倍 |
|---|---|
| 体积下限 | auto-aof-rewrite-min-size,默认 64mb |
| 触发条件 | 两个条件同时满足 |
| 与 RDB 关系 | RDB 的 save 规则不会触发 AOF 重写 |
| 观测项 | aof_current_size / aof_base_size / aof_rewrite_in_progress |
典型使用场景
- 写入量大的实例评估重写频率,避免 fork 过于密集
- 磁盘紧张时临时放宽条件,把重写推迟到业务低峰
- 排查 AOF 体积暴涨:确认重写是否被条件卡住始终触发不了
- 升级或迁移前手动 BGREWRITEAOF,先把基线体积压下来
- 容量规划:按日均写入量与增长率估算重写间隔与磁盘峰值
查看与调整
查看与调整
redis-cli CONFIG GET auto-aof-rewrite-percentage # 当前增长阈值
redis-cli CONFIG GET auto-aof-rewrite-min-size # 当前体积下限
redis-cli INFO persistence | grep -E 'aof_(current_size|base_size|rewrite_in_progress)'
redis-cli BGREWRITEAOF # 手动触发一次重写
redis-cli CONFIG SET auto-aof-rewrite-percentage 200 # 调大阈值,降低重写频率
redis-cli CONFIG REWRITE # 调整确认后落盘观测项读法
| 指标 | 含义 | 正常与异常 |
|---|---|---|
| aof_current_size | 当前 AOF 总体积 | 与 base_size 的比值接近阈值说明即将重写 |
| aof_base_size | 上次重写后的大小 | 长期不更新说明重写从未触发 |
| aof_rewrite_in_progress | 是否正在重写 | 长期为 1 说明重写卡住或耗时异常 |
| aof_pending_rewrite | 是否有排队中的重写 | 为 1 说明上一次重写没能立即执行 |
百分比是相对上次重写后的体积,而不是相对某个绝对上限;刚完成一次重写后需要先增长到阈值倍数才会再次触发。写入速率高的实例增长很快,重写间隔被压缩,需要结合磁盘与负载一起评估。