解决Redis从机完整同步数据异常,不停的循环的问题

261人浏览 / 0人评论

1、缓冲区大小过小问题

在生产环境排查中发现,从机(slave)一直在不停的从主机(master)执行Full resync...失败,后台一直会报“I/O error trying to sync with MASTER: connection lost”。我的完整同步的rdb有3.5G左右。

查看从机redis状态发现master_link_status:长时间一直都是down状态。

通过查阅资料发现是client-output-buffer-limit slave这个参数配置不当造成的。

这里,output buffer是Redis为client分配的缓冲区(这里的"client"可能是真正的client,也可能是slave或monitor),若为某个客户端分配的output buffer超过了预留大小,Redis可能会根据配置策略关闭与该端的连接。

该配置项格式如下:

client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds> hard limit是一旦redis到达这个值后会马上关闭client连接。 soft limit是一种依赖于时间的。 比如一个soft limit被设置为64MB 60s, 那就意味着当client的output buffer超过64MB,并且持续60秒钟,那这个连接就会被断开。

在redis主节点查看当前client-output-buffer-limit设置的值

# /usr/local/redis/bin/redis-cli -p 8899  config get "client-output-buffer-limit"
1) "client-output-buffer-limit"
2) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"

可以看到当前client-output-buffer-limit slave的值是默认的256mb 64mb 60,目前用户量的增加或大量的同时连接让client分配的缓冲区满了,所以应该要增大这个参数的值。

先动态修改client-output-buffer-limit slave的值,增大到4gb 3gb 300

config set client-output-buffer-limit 'slave 4gb 3gb 300'

稍等一会,查看master_link_status的状态,已经变为up了

redis进程的运行状态也恢复正常了。

最后修改redis.conf里面client-output-buffer-limit slave的值

提供一个统一修改配置的shell命令,修改以.conf结尾的所有文件,将文件中“client-output-buffer-limit slave 256mb 64mb 60”字符串改为“client-output-buffer-limit slave 4gb 3gb 300/g”

sed -i "s/client-output-buffer-limit slave 256mb 64mb 60/client-output-buffer-limit slave 4gb 3gb 300/g" *.conf

2、从机访问主机超时问题

修改配置文件,默认repl-timeout是60并且是被关闭着的,需要打开,并且修改为180秒

repl-timeout 180

统一修改命令:

sed -i "s/# repl-timeout 60/repl-timeout 180/g" *.conf

全部评论