Redis 2.6.16 rotate.aof 功能说明

  • A+
所属分类:Redis
又拍云upyun

万恶的 AOF Rewrite

AOF rewrite 缺陷说明

auto rewrite功能的引入,主要是为了解决aof文件不断增长减少重复键读写操作的日志, 通过定时触发,重新根据实际内存键值情况写入新的aof文件, 再进新旧替换文件,实现aof文件最小化。

然而通过测试,系统在大压力下进行auto rewrite操作【maxmomery 40gb】,导致redis服务会有6-10s的延时。 该延时与设置的 maxmomery 设置值相关。maxmomery 越大延时越严重。

同时auto rewrite的使用设置的 maxmomery 值越大, 还会导致COPY ON WRITE内存的分配。 这就是为什么作者在安装建议中提出,需预留1倍的内存出来。在极限情况下, 一个redis的实例会用去 maxmomery * 2 内存。

AOF rewrite 缺陷实测数据

版本 2.6.16 中 文件的flush磁盘操作与 close操作 均已经放入 background 线程操作。 但是auto rewrite操作仍然出现较长延时, 对文件操作加入debug日志发现, 以下日志 设置redis maxmomery 40gb:

从日志中发现, 文件的rename操作用去了近4s, 相当与redis 4s 没有响应,通过 tcprstat 实时监控, redis无响应时间在8s左右.如果应用对实时响应要求很高,10s无响应肯定是无法接受的。

AOF rotate

目的

将AOF在线实时Rewrite的功能,切换到线下操作。提升了redis性能的同时提升内存的利用率。

功能说明

rotate其实是参照日志程序的功能,当aof文件达到最大值阀值时,切换aof文件,将老的aof文件重命名添加[.数字]的后缀,后续操作命令写入到新的空的aof文件中。如此循环。

同时,rotate设置最大切换文件的数目,一旦超过该总数,后缀再次重0开始计数。防止硬盘写满出现异常。 运维时必须尽量保证rotate不会自动重0开始计数,因为一旦从0开始循环,相当与早期的操作命令被冲掉。

功能配置

redis.conf 增加两项配置:

AOF rotate启用条件

AOF rotate功能不是设置就会生效,必须满足以下两个条件:

实测数据

根据写入debug日志,发现每次发生AOF rotate切换文件的速度是 < 45us ,基本上可以忽略不计。redis实例整体不会出现 长时间的延迟。

线下运维

引入AOF rotate模式后,必然导致一个新的问题,这些切分aof文件如何合并。

该版本提供一个线下合并aof文件的redis-offline服务实例工具,系统管理人员必须通过启动线下实例进行aof合并, 因为在 redis-offline 实例模式下提供了 新的 mergeaof 的合并命令。

mergeaof 命令语法:

mergeaof 实现说明:

例如:

redis实例工作目录下,出现以下切分aof文件:

一旦实例发生当机或者任何突发事件,需要恢复以上数据,可以通过 【mergeaof 命令】 进行恢复

启动一个线下实例,主要用于合并aof重写新的aof

合并切分文件

线下合并后执行bgrewrite操作

实例目录下,生成新的 appendonly.aof 则为以上切分文件合并后的aof数据。

参考:https://github.com/liujianping/redis-2.6.16-rotate-aof/blob/master/README.md

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:6   其中:访客  6   博主  0

    • alan 9

      我没有发现有这个rotate模式呢?我用的3.0

      • 啊哈 9

        redis服务器内存小而数据大,将会是个坑,会长时间的load data in memory,然后就不断的swap

          • TTLSA 9

            @啊哈 so,数据达到一定的量,增加服务器