zoukankan      html  css  js  c++  java
  • 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被加载,所以相差的部分我们可以理解为主实例的过期数据。

  • 相关阅读:
    easyui struts后台实现tree返回json数据
    jquery扩展方法
    EasyUI tree扩展获取实心节点
    Hibernate之AbstractEntityPersister
    No CurrentSessionContext configured 异常解决
    Dubbo远程调用服务框架原理与示例
    mongodb高级操作及在Java企业级开发中的应用
    Java和MongoDB之Hello World
    Vmware 虚拟的Linux系统如何与宿主主机共享上网
    VM VirtualBox 上安装 CentOs6.4(详细)
  • 原文地址:https://www.cnblogs.com/lwhctv/p/10437582.html
Copyright © 2011-2022 走看看