Redis Psync scheduled to be closed ASAP for overcoming of output buffer limits.

作者:Rui 发布时间:December 23, 2016 分类:Redis 浏览:1,816

在做Redis HA的时候,会遇到一直同步失败的问题。并且在server的log中,发现如下异常信息

[12:54:10.7788397] [960] 09 Dec 12:54:10.783 # Client id=5252201 addr=10.207.180.15:42489 fd=119 
name= age=16 idle=0 flags=SP db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=198 oll=113
omem=274319752 ow=0 owmem=0 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.

这是因为在主从同步过程中,master向slave发送数据时,写入缓冲区的数据超出了限制,导致连接中断。

Redis Replication

首先,我们先了解下redis的同步过程。 当slave初次连接到master时,master会将生成RDB文件,然后将全部数据同步给slave,在发送的同时,也会将后续的命令记录到backlog,类似于mysql,当全部数据同步完成后,slave会继续请求同步增量数据。master会依据同步的offset,从backlog中将增量数据发送给slave,当master和slave连接断开重连后,在redis2.8之后,slave在重新连接后依然可以进行增量同步,但是2.8版本之前的redis,在连接断开重连后只能进行全部同步。

更多详细细节,请参考官方说明:
https://redis.io/topics/replication

Redis output buffer限制

Redis会为每一个连接设置一个output buffer,这样有利于处理和传输较大的数据。
但是如果以很快的速度想redis发送大量的可以产生很多输出的命令,或者因为网络或者客户端的问题导致无法快速的消费掉output buffer的内容。就会造成output buffer占据的内存越来越大,如果这时超过redis的设置的限制,redis server就会自动将连接断开,释放该连接的output buffer占用的资源。

Redis output buffer 有两种限制:

  1. hard limit 强制限制,设置固定值,当超出该值后,就会自动断开连接
  2. soft limit 基于时间的限制,例如:每10秒钟32M的数据,这意味着当output buffer中的数据连续10秒大于32M,就会自动断开连接

不同类型的客户端,有不同的限制:

  1. 普通连接,默认不限制output buffer大小,我们大多数情况下,是期望复用连接的,所以是不希望连接断开的。
  2. Pub/Sub连接,默认设置了32M的hard limit,和每分钟8M的soft limit。
  3. slave 连接, 默认设置了256M的hard limit,和每分钟64M的soft limit。

所以回过头来,看我们之前的错误信息,发现omem=274319752已经超出的slave的默认限制。master就主动关闭了slave的连接,当slave重新连接上来同步增量数据时,如果output buffer又超出274319752的情况就会有被master主动关闭连接。所以出现endless replication loop的问题

前面也提到了,一般引起这种问题的原因,有两种:

  1. 客户端快速的向redis发送了大量的命令, 并产生了大量的输出,占据了output buffer
  2. 网络带宽或者客户端性能导致,拉取master数据过慢,导致数据积压在output buffer

我们遇到的问题是同步的数据过大,而带宽不够,导致数据积压在output buffer

解决方案

快速的解决办法就是修改output buffer的大小,例如将buffer的大小设置为512Mb

> config set client-output-buffer-limit "slave 536870912 536870912 0"

修改该参数需要注意,

  1. 在修改buffer限制之前,请确保你的机器有足够的内存。
  2. out buffer占用的内存的大小,不会计算在用户使用的内存内

https://redis.io/topics/clients#output-buffers-limits
https://redislabs.com/blog/top-redis-headaches-for-devops-replication-buffer#.WGEKo1V94VA
https://groups.google.com/forum/#!topic/redis-db/-1ge4cnzPhg

标签: redis, tsg, ha

仅有一条评论 »

  1. [...]原文地址: http://arui.me/index.php/archives/206/[...]

添加新评论 »