问题简介
今天在操作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