Redis:slave flush old data造成实例不可用

一、问题描述

2019-02-22凌晨02:42分前后,收到集群中 [10.32.52.8:6500] 实例不可用告警,登陆管理界面查看此实例在正常运行状态,期间未出现机器宕机或实例直接挂掉的现象。

 

二、排查过程

1、同时排查Redis集群中这对主从实例在问题发生时间点前后的日志,从实例在02:39分开始一次全量的主从同步,02:40-02:49 从实例正在执行“Flush old data”,这个过程Redis不接收任何请求连接,导致监控告警“实例不可用”;

 

2、查看主实例[10.32.52.13:6400] 日志,在02:24分,由于从实例客户端的输出缓冲区超过了限制,主实例主动关闭了从实例的连接,造成这对主从断连,

其中client-output-buffer-limit slave 512mb 128mb 60 表示从实例客户端输出缓冲区大小超过512M或者超过128M情况下持续60s,主实例会主动关闭从实例连接,

Client List中的omem=441802576 表示从实例输出缓冲区大小为421M,触发了关闭连接操作;

 

3、主从实例被断开后,从实例再次发起连接请求,由于这个时间点业务有大量的数据写到主实例,主实例自动触发了一次aof重写操作,再次建立主从连接后,主从进行了一次全量同步。

主从全量同步流程如下:

 

三、根因分析

1、主从在进行全量同步期间,由于数据量太大,从实例清理内存数据耗时长达9分钟,这期间从实例不接受任何连接请求和访问,监控告警实例不可用。

 

四、解决方法

1、进行水平扩容,降低集群中单实例容量的大小,单实例大小保持在12G最合理,最好不超过15G,减少全量同步消耗的时间。

 

五、思考

1、集群中一对主从实例的userd_memory相差6G左右,但是实例中的对象数相同,为什么?

解答:这是因为从实例因为以上原因,均有执行过全量复制,全量复制时主实例的rdb文件中不会把过期key持久化,从实例加载主实例的rdb文件,不会有过期key被加载,所以相差的部分我们可以理解为主实例的过期数据。

posted @ 2019-02-26 15:18  蘇氏加多寶  阅读(432)  评论(0编辑  收藏  举报