Redis单线程架构导致无法充分利用CPU特性,通常的做法是在一台机器上部署多个实例。
当多个实例开启AOF重写后,彼此之间会产生对CPU和IO的竞争。
对于单机部署多Redis部署,如果同一时刻运作多个子进程,对当前系统影响将非常明显,因此需要采取一种措施,把子进程工作进行隔离。
Redis在info Persistence中为我们提供了监控子进程运行状况的度量指标。
我们基于以上指标,可以通过外部程序轮询控制AOF重写操作的执行,整个过程如下:
流程说明:
(1)外部程序定时轮询监控机器(machine)上所有实例。
(2)对于开启AOF的实例,查看(aof_current_size - aof_base_size)/ aof_base_size确认增长率。
(3)当增长了超过特定阀值,执行bgrewriteaof命令手动触发当前实例的AOF重写。
(4)运行期间循环检查aof_rewrite_in_progress和aof_current_rewrite_time_sec指标,直到AOF重写结束。
(5)确认实例AOF重写完成后,在检查2-4步操作,从而保证机器内每个Redis实例AOF重写串行化执行。