异常现象 在从机看到redis运行状态异常,这个监控项是通过在从机“/usr/local/redis/bin/redis-cli -p 8899 ping”来判断客户端和服务端连接是否正常,若返回P
异常现象
在从机看到redis运行状态异常,这个监控项是通过在从机“/usr/local/redis/bin/redis-cli -p 8899 ping”来判断客户端和服务端连接是否正常,若返回PONG则表示连接正常,返回其他值则表示客户端和服务器连接不正常(网络不正常或服务器未能正常运行),返回连接异常。
查看redis的日志发现“I/O error trying to sync with MASTER: connection lost”
查看从机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的值,增大到1024mb 256mb 60
稍等一会,查看master_link_status的状态,已经变为up了
redis进程的运行状态也恢复正常了。
最后修改redis.conf里面client-output-buffer-limit slave的值
参考资料:
https://redis.io/topics/clients
http://lee90.blog.51cto.com/10414478/1871638
http://blog.csdn.net/jiangguilong2000/article/details/38436941