Redis的aof rewrite机制在如下两种情况下会启用:
- 用户给Redis发BGREWRITEAOF命令
- aof文件的大小增长超过一定比例,且aof文件实际大小超过一定值
条件一对应触发aof rewrite代码:
/* Start a scheduled AOF rewrite if this was requested by the user while * a BGSAVE was in progress. */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_scheduled) { rewriteAppendOnlyFileBackground(); }
条件二对应触发aof rewrite代码:
/* Trigger an AOF rewrite if needed */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_perc && server.aof_current_size > server.aof_rewrite_min_size) { long long base = server.aof_rewrite_base_size ? server.aof_rewrite_base_size : 1; long long growth = (server.aof_current_size*100/base) - 100; if (growth >= server.aof_rewrite_perc) { redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth); rewriteAppendOnlyFileBackground(); } }
实际运营的过程中, 通过条件二自动触发aof rewrite,从而达到数据持久化的目的。 但是,也会有极端情况发生: 被触发的aof rewrite最终失败了, 由于条件二一直满足, aof rewrite会不断发生, 不断失败, 生成大量的aof 临时文件,可能把磁盘塞满, 导致服务故障。 (aof rewrite成功后, aof_rewrite_base_size会被重置, 使growth小于server.aof_rewrite_perc, 就没有这个问题)。
所以, 一旦发现线上aof rewrite 的进程影响了线上服务, 且kill不掉的时候,可以先通过config set调整
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
这两个配置,将auto-aof-rewrite-percentage调大,或者auto-aof-rewrite-min-size调大, 然后kill掉bg-aof-rewrite进程,必要的时候,可以通过config set appendonly no停掉aof rewrite。