记一次redis主从同步失败

Posted 三体

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次redis主从同步失败相关的知识,希望对你有一定的参考价值。

zabbix告警突然从某个时间点开始提示CPU使用高,网卡流量也一直居高不下。

首先查看redis日志,发现告警时间点redis主节点被重启了,发生了主备切换,并且在日志中发现这么一段

[3081] 06 Dec 02:33:28.090 # Client addr=****:35810 fd=122 name= age=88 idle=88 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16299 oll=3041 omem=79211304 events=rw cmd=psync scheduled to be closed ASAP for overcoming of output buffer limits.
[3081] 06 Dec 02:33:28.090 # Connection with slave *****:6379 lost.

scheduled to be closed ASAP for overcoming of output buffer limits意思是:psync的命令超过了output-buffer-limits,master主动关闭了slave的连接。然后slave被断开了和master的连接,然后slave又重新找master请求同步,然后就陷入了恶性循环,slave找master做全同步的过程是一个很消耗cpu消耗io消耗带宽的过程,所以会一直持续的告警。

output-buffer-limits这个参数的作用是:当客户端来获取数据的时候,数据会被保存在output-buffer中,等信息传输完后output-buffer中的数据会被清理掉,redis对output-buffer做了限制。

这个时候问题根源已经找到,就是主备切换以后要同步的数据过大,超出了output-buffer-limits这个参数设置的值,所以数据同步一直失败。

解决办法:

在master节点执行redis-cli config set client-output-buffer-limit slave ‘2147483648 1073741824 300‘,放大这个限制,当然这个参数里面的3个数字需要根据自己的系统实际情况来定。

redis-cli  config rewrite -这个命令是将变更的配置落地到配置文件的,即使redis再次重启,这个变更也不会失效。这部可执行可不执行。

2147483648 -是一个硬性限制,当output-buffer的大小大于2147483648之后就会断开连接

1073741824 300 -是一个软限制,当output-buffer的大小大于1073741824并且超过了300秒的时候就会断开连接

注意:执行完这个命令机器的cpu和内存都会有一定的上涨。

以上是关于记一次redis主从同步失败的主要内容,如果未能解决你的问题,请参考以下文章

记一次重构经历(未完)

记一次chrony同步失败问题排查

记一次Redis错误排查经历(redis cluster 节点重启后无限同步问题)

记一次Redis错误排查经历(redis cluster 节点重启后无限同步问题)

百度QA金BUG集锦之《Redis主从同步失败案例的步步深入》

记一次MYSQL主从sql线程not_running故障处理