问题现象:

集群状态 1主 2从,主没有开启bgsave,从开启bgsave。现象所有redis可以访问,进行操作。主不断开始bgsave 1从停止bgsave。

主日志报错# Connection with slave XXXX lost.

从日志报错# Timeout receiving bulk data from MASTER... If the problem persists try to set the 'repl-timeout' parameter in redis.conf to a larger value.

问题总结:

repl-backlog-size   repl-timeout 这2个参数 每次从和主可以同步的数据大小,如果进行同步的时候超过了这个限制,就到导致如上报错。

问题现象:

重启从服务器,主报错Client id=1317049445 addr=10.10.3.112:7412 fd=39 name= age=394 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=4360 omem=76118609 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.

注意到这么一句话:psync scheduled to be closed ASAP for overcoming of output buffer limits。看起来是psync因为超过output buffer limits将被close。

于是查看了一下client-output-buffer-limit。发现这是Redis的一个保护机制。配置格式是:

client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

具体参数含义如下:

  • class: 客户端种类,包括Normal,Slaves和Pub/Sub

    • Normal: 普通的客户端。默认limit 是0,也就是不限制。
    • Pub/Sub: 发布与订阅的客户端的。默认hard limit 32M,soft limit 8M/60s。
    • Slaves: 从库的复制客户端。默认hard limit 256M,soft limit 64M/60s。
  • hard limit: 缓冲区大小的硬性限制。
  • soft limit: 缓冲去大小的软性限制。
  • soft seconds: 缓冲区大小达到了(超过)soft limit值的持续时间。

client-output-buffer-limit参数限制分配的缓冲区的大小,防止内存无节制的分配,Redis将会做如下自我保护:

  1. client buffer的大小达到了soft limit并持续了soft seconds时间,将立即断开和客户端的连接
  2. client buffer的大小达到了hard limit,server也会立即断开和客户端的连接

再看看我们从库的这个配置,其实就是默认配置:

  1. # 客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,
  2.  
    # 可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
  3.  
    # 可以三种不同客户端的方式进行设置:
  4.  
    # normal -> 正常客户端
  5.  
    # slave -> slave 和 MONITOR 客户端
  6.  
    # pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端
  7.  
    # 每个 client-output-buffer-limit 语法 :
  8.  
    # client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
  9.  
    # 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
  10.  
    # 例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开
  11.  
    # 如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。
  12.  
    # 默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
  13.  
    # 只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
  14.  
    # 把硬限制和软限制都设置为 0 来禁用该特性
  15.  
    client-output-buffer-limit normal 0 0 0
  16.  
    client-output-buffer-limit slave 256mb 64mb 60
  17.  
    client-output-buffer-limit pubsub 32mb 8mb 60
     

    redis的replication buffer其实就是client buffer的一种。里面存放的数据是下面三个时间内所有的master数据更新操作:

    1. master执行rdb bgsave产生snapshot的时间
    2. master发送rdb到slave网络传输时间
    3. slave load rdb文件把数据恢复到内存的时间

    可以看到跟replication backlog是一模一样的!

    replication buffer由client-output-buffer-limit slave设置,当这个值太小会导致主从复制链接断开:

    1. 当master-slave复制连接断开,server端会释放连接相关的数据结构。replication buffer中的数据也就丢失了,此时主从之间重新开始复制过程。
    2. 还有个更严重的问题,主从复制连接断开,导致主从上出现rdb bgsave和rdb重传操作无限循环。

    看起来确实server(这里就是master)会因为缓冲区的大小问题主动关闭客户端(slave)链接。因为我们的数据变更量太大,超过了client-output-buffer-limit。导致主从同步连接被断开,然后slave要求psync,但是由于repl-backlog-size太小,导致psync失败,需要full sync,而full sync需要Discarding previously cached master state,重新load RDB文件到内存,而这个加载数据过程是阻塞式的。所以导致slave出现间歇式的不可用。而切换到master之后,master的整个同步操作都是fork一个子进程进行的,所以不影响父进程继续服务。所有的现象都能清清楚楚的解释上。

    更改配置 client-output-buffer-limit  client-output-buffer-limit slave 0 0 0 "  重启slave问题解决

     

     

redis问题与解决思路的更多相关文章

  1. RabbitMQ消息积压的几种解决思路

    在日常工作中使用RabbitMQ偶尔会遇不可预料的情况导致的消息积压,一般出现消息积压基本上分为几种情况: 消费者消费消息的速度赶不上生产速度,这总问题主要是业务逻辑没设计好消费者和生产者之间的平衡, ...

  2. C# 高并发、抢单解决思路

    高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求.高并发相关常用的一些指标有响应时间(Respon ...

  3. Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路

    通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点.从而导致DatePicker控件在选择日期后无法 ...

  4. 最初程序员的思维“修炼”之四——Android平台开发的“强制关闭”解决思路

    我和我的朋友参加一个比赛——物联网应用技能大赛,这个大赛所要求的技能有,硬件技术,Android平台开发技术,.NET平台开发技术,所以这是一个团队合作的比赛,基本上没有人能同时掌握这三种技术(在校生 ...

  5. STM32 ucosii 串口接收数据 遇到的问题及解决思路

    写一个程序,用到了ucos ii ,串口在中断中接收数据(一包数据 8个字节 包含: 1byte包头 5byte数据 1byte校验和 1byte 包尾 ) ,数据由上位机每隔500ms发送一次,在串 ...

  6. 《分销系统-原创第一章》之“多用户角色权限访问模块问题”的解决思路( 位运算 + ActionFilterAttribute )

    此项目需求就是根据给用户分配的权限,进行相应的权限模块浏览功能,因为项目不是很大,所以权限没有去用一张表去存,我的解决思路如下,希望大家给点建议. 数据库用户表结构如下: 数据库表梳理: BankUs ...

  7. Qt新建项目No valid kits found解决思路

    Qt新建项目No valid kits found解决思路 第一次用Qt Creator创建Project时,进入Kit Selection窗口后,会提示No Valid kits found. Pl ...

  8. Unable to load native-hadoop library解决思路

    最近试着搭建Hadoop,我使用的操作系统是Centos6.5,Hadoop版本是2.6.0. 在安装过程中总是出现:WARN util.NativeCodeLoader: Unable to loa ...

  9. Windows平台下C++插件系统实现的几个关键技术问题及其解决思路

    根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题.下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路.由于我主要专注于Windows平台C++程序 ...

随机推荐

  1. Unix环境高级编程-阻塞访问原理——等待队列

    有些时候,一个系统调用可能无法马上取到或者送出数据:一个温度采集器如果没有采用中断或者轮询的策略,而是在用户发出请求时才进行采集,并在一定的时间后返回结果.如果用户程序希望调用read或write并且 ...

  2. Hierarchical softmax(分层softmax)简单描述.

    最近在做分布式模型实现时,使用到了这个函数. 可以说非常体验非常的好. 速度非常快,效果和softmax差不多. 我们知道softmax在求解的时候,它的时间复杂度和我们的词表总量V一样O(V),是性 ...

  3. --defaults-file 不能用?

    今天在测试mysql多实例时发现mysqld_safe --user --defaults-file 怎么都无法启动,后来发现是必须按顺序,先写--defaults-file才可以. mysqld_s ...

  4. 超简单的okhttp封装工具类(上)

      版权声明:转载请注明出处:http://blog.csdn.net/piaomiao8179 https://blog.csdn.net/piaomiao8179/article/details/ ...

  5. Protobuf3 序列化

    在message_lite.h中定义了SerializeToString ,SerializeToArray ,SerializeToCodedStream ,SerializeToZeroCopyS ...

  6. Win10 15063 开始运行不保存历史记录原因和解决方法

    http://www.ampc8.com/thread-23421-1-1.html 在Win10 1703的时候你也许会发现开始运行以后,再次打开就没有任何历史记录了,常规方法是桌面-右键-个性化- ...

  7. Apache与php快速部署web服务

    [本文出自天外归云的博客园] 在一台服务器上临时起个web服务,读取服务器上的cfs文件内容并显示在页面上,做一个简单的web请求处理. 首先找到apache,在conf文件夹下vi httpd.co ...

  8. [C++]“error C2712: 无法在要求对象展开的函数中使用__try”解决方案

    https://blog.csdn.net/shiqw5696/article/details/80664749 前段时间写了一篇关于C++异常捕获及异常处理的文章:c++异常捕获及异常处理try-t ...

  9. session_id()和session_regenerate_id()对原来session文件和其中数据是怎么处理的

    一.session_id()对原来session文件和里面的数据,是怎么处理的? 测验办法:<?php $sid = md5("aaad");session_id($sid) ...

  10. hdoj:2085

    核反应堆 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...