redis主从复制同步数据死循环问题

redis主从复制同步数据死循环问题

成都创新互联于2013年成立,是专业互联网技术服务公司,拥有项目成都网站制作、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元攀枝花做网站,已为上家服务,为攀枝花各地企业和个人服务,联系电话:028-86922220

发现现象:

最近有问必答codis一个从库端口6504一直时不时,主从延时和从库连接不上的报警,开始怀疑是redis备份导致,没有深入去找原因,后面发现白天也在报警,故深入排查了一下原因。

host: 10.20.1.4

port: 6504

idc: KDDI

role: redis_s

item: r_replication

current: 32767

last: 1 minutes.

info: 

send at [2015-11-27 09:17:49]

------------------------------------------

host: 10.20.1.4

port: 6504

idc: KDDI

role: redis_s

item: r_connection

current: 0

last: 1 minutes.

info: failed

send at [2015-11-27 08:13:46]

问题现象:

1、登录到从库所在服务器,奇怪的发现了,从库周期性的在产生temp-rewriteaof-xxx.aof文件,见下图

redis主从复制同步数据死循环问题

2、从库的日志里面出现大量“Connection with master lost”日志,从句面意思来理解是说主库连接丢失,见下图

redis主从复制同步数据死循环问题

3、登录到主库,查看日志发现了"Connection with slave 10.20.1.4:6504 lost"和“scheduled to be closed ASAP for overcoming of output buffer limits.”两条重要信息

redis主从复制同步数据死循环问题

4、登录到主库使用info命令发现“slave0:ip=10.20.1.4,port=6504,state=send_bulk,offset=0,lag=0”

redis主从复制同步数据死循环问题

问题分析:

1、通过从库周期性的生成aof文件以及日志里面看到周期性的连接主库lost现象,初步怀疑是复制层面的问题,并查看其他几个从库的日志没有发现这种情况,先排除网络问题

2、在主库也发现了连接从库lost现象,确定是6504端口redis内部的问题,并且看到“overcoming of output buffer limits”,提示buffer限制了

3、以上信息基本上可以确认问题的原因,先回想一下redis主从复制原理:当在从库执行slaveof ip port命令之后,主库会使用bgsave生成一个rdb快照文件,生成文件之后通过网络将这个文件传到从库,同时主库上会将生成rdb快照那一刻起的新数据写的一个buffer缓冲区,另一方面,从库接受主库刚刚生成那个rdb文件之后,开始加载这个rdb文件,加载需要一定时间,如果这个时间越长,其主库的写入量越大,那么刚刚主库产生的buffer也会越大(当然不能无限大),在主库client-output-buffer-limit参数 slave 268435456 67108864 60设置了其大小,意思说如果buffer大小超过256Mb或者连续60秒钟产生的buffer大小大于64Mb,则buffer会强制关闭

解决办法:

1、调整主库client-output-buffer-limit默认参数,CONFIG SET client-output-buffer-limit "slave 1073741824 268435456 300",将其限制设置为1G,连续300秒超过256Mb才强制关闭,问题解决。

在主库的日志里面看到现象如下:

redis主从复制同步数据死循环问题

在从库的日志里面看到现象如下:

redis主从复制同步数据死循环问题

 


当前文章:redis主从复制同步数据死循环问题
本文URL:http://myzitong.com/article/goipso.html