丹调生活 发表于 2018-11-4 11:05:22

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
  ------------------------------------------
  host: 10.20.1.4
  port: 6504
  idc: KDDI
  role: redis_s
  item: r_connection
  current: 0
  last: 1 minutes.
  info: failed
  send at
  问题现象:
  1、登录到从库所在服务器,奇怪的发现了,从库周期性的在产生temp-rewriteaof-xxx.aof文件,见下图
http://note.youdao.com/yws/res/1605/55197CC156B149BF80D4D849B8C7A266
  2、从库的日志里面出现大量“Connection with master lost”日志,从句面意思来理解是说主库连接丢失,见下图
http://note.youdao.com/yws/res/1608/3241BD998273456AAA3B9D1FDF869C98
  3、登录到主库,查看日志发现了"Connection with slave 10.20.1.4:6504 lost"和“scheduled to be closed ASAP for overcoming of output buffer limits.”两条重要信息
http://note.youdao.com/yws/res/1604/514C7ADC7A974F3AA2642BC3B896761F
  4、登录到主库使用info命令发现“slave0:ip=10.20.1.4,port=6504,state=send_bulk,offset=0,lag=0”
http://note.youdao.com/yws/res/1609/8929D2F977AF4950A134A8DB676A7574
  问题分析:
  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才强制关闭,问题解决。
  在主库的日志里面看到现象如下:
http://note.youdao.com/yws/res/1607/70E85796C13945CFAC880CAA7C7D28BE
  在从库的日志里面看到现象如下:
http://note.youdao.com/yws/res/1606/F588126FF0A74DFFBA1FDE9C2395518F

页: [1]
查看完整版本: redis主从复制同步数据死循环问题