redis主从复制同步数据死循环问题
redis主从复制同步数据死循环问题
发现现象:
最近有问必答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文件,见下图
2、从库的日志里面出现大量"Connection with master lost"日志,从句面意思来理解是说主库连接丢失,见下图
3、登录到主库,查看日志发现了"Connection with slave 10.20.1.4:6504 lost"和"scheduled to be closed ASAP for overcoming of output buffer limits."两条重要信息
4、登录到主库使用info命令发现"slave0:ip=10.20.1.4,port=6504,state=send_bulk,offset=0,lag=0"
问题分析:
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才强制关闭,问题解决。
在主库的日志里面看到现象如下:
在从库的日志里面看到现象如下: