问题简介

今天在操作codis集群进行主从同步的时候,发现key加载到快完成的时候,就停下来了,不继续加载key到内存了,等一下又在重新全量同步了。排查日志看到如下内容:

打开网易新闻 查看精彩图片

主节点日志:

[12168] 14 Jun 23:47:45.015 # Client id=2527238 addr=X.X.X.X:18890 fd=7 name= age=219 idle=219 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16347 oll=4151 omem=95590296 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.

从节点日志:

Connection with master lost

原因分析

主从复制一般涉及到两个变量:

1、codis-server/redis默认配置中repl-timeout的时间为60s,当复制数据的时间超过60s时,codis-server/redis master就会认为连接超时主动断开连接,也就是Connection with master lost报错。

2、复制数据占用服务器资源的大小client-output-buffer-limit参数就决定了客户端输出缓冲区内存使用量,默认client-output-buffer-limit slave 256mb 64mb 60

从上面的日志可以看到scheduled to be closed ASAP for overcoming of output buffer limits. 这个应该是第二个参数影响的。

打开网易新闻 查看精彩图片

解决

先查看一下当前变量的

127.0.0.1:7001> config get client-output-buffer-limit

1) "client-output-buffer-limit"

2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

查看:

127.0.0.1:7001> config get client-output-buffer-limit

动态修改:

127.0.0.1:7001> config set client-output-buffer-limit "slave 536870912 134217728 120"

默认:

127.0.0.1:7001> config get client-output-buffer-limit "slave 268435456 67108864 60"

注意:当数据同步完成后最好将配置修改为原配置,避免占用服务器资源过高引起其他问题

如果是要永久生效在配置文件添加以下内容

client-output-buffer-limit slave 268435456 67108864 60

打开网易新闻 查看精彩图片