主从替换之后的复制风暴

一 现象

一套MySQL主-备-备-备数据库,其中的备库升级到主库之后,系统监控报警 Seconds_Behind_Master 瞬间为0,瞬间为数十万秒。第一感觉是遇到了复制风暴--不同于主备server_id 的log event在主备库之间无限循环复制。升级的逻辑图如下:

二 分析 在双向复制结构中,主库中有数据更新,会将更新记录含有server_id_1的log event发送到备库,然后备库更新数据,将含有server_id_1的log event 发送给主库,因此最初主库上的log event 更新事件又传了回来,这时候MySQL就要对复制事件的server_id进行判断,发现复制事件的server_id和自己的server_id相同时,放弃执行,如果不同 则执行该log event 并记录到binlog 里面继续发送给备库。 如果该event的server_id和主备的server_id都不相同,该log event 则在主备库中无限循环执行,也就是通常所说的复制风暴。 那为什么slave lag 为时大时小呢?首先我们要了解MySQL 对于slave lag 的计算方式(sql/slave.cc )

  1. bool show_master_info(THD* thd, Master_info* mi)
  2. {
  3. /*省略*/
  4. /*
  5. Seconds_Behind_Master: if SQL thread is running and I/O thread is
  6. connected, we can compute it otherwise show NULL (i.e. unknown).
  7. */
  8. if ((mi->slave_running == MYSQL_SLAVE_RUN_CONNECT) &&
  9. mi->rli.slave_running)
  10. {
  11. long time_diff= ((long)(time(0) - mi->rli.last_master_timestamp)
  12. - mi->clock_diff_with_master);
  13. /*
  14. Apparently on some systems time_diff can be <0. Here are possible
  15. reasons related to MySQL:
  16. - the master is itself a slave of another master whose time is ahead.
  17. - somebody used an explicit SET TIMESTAMP on the master.
  18. Possible reason related to granularity-to-second of time functions
  19. (nothing to do with MySQL), which can explain a value of -1:
  20. assume the master's and slave's time are perfectly synchronized, and
  21. that at slave's connection time, when the master's timestamp is read,
  22. it is at the very end of second 1, and (a very short time later) when
  23. the slave's timestamp is read it is at the very beginning of second
  24. 2. Then the recorded value for master is 1 and the recorded value for
  25. slave is 2. At SHOW SLAVE STATUS time, assume that the difference
  26. between timestamp of slave and rli->last_master_timestamp is 0
  27. (i.e. they are in the same second), then we get 0-(2-1)=-1 as a result.
  28. This confuses users, so we don't go below 0: hence the max().
  29. last_master_timestamp == 0 (an "impossible" timestamp 1970) is a
  30. special marker to say "consider we have caught up".
  31. */
  32. protocol->store((longlong)(mi->rli.last_master_timestamp ?
  33. max(0, time_diff) : 0));
  34. }
  35. else
  36. {
  37. protocol->store_null();
  38. }
  39. /*省略*/
  40. }

解释如下: long_time_diff就是seconds_behind_master seconds_behind_master=slave系统时间 - master执行创建event的timestamp - ( slave系统时间 - master系统时间 ) (slave系统时间-master执行最新event的timestamp):得到最新event到slave执行还要多久。 (slave系统时间-master系统时间):可能存在主备系统时间差别,所以计算seconds_behind_master要减去,但实际情况,slave和master系统时间基本一致,得到结果应该接近0。 所以seconds_behind_master的值是由于slave系统时间-master执行最新event的timestamp 决定的,当导致循环复制的log event创建时间越久远,slave lag 会越大,执行完 这个event,会执行真正主库执行的log event ,此时slave lag 就会变成0 。 三 解决 查看新主库的server_id

查看新备库的server_id

主库上冲突的事务的server_id

备库上冲突事务的server_id

老的主库的server_id

解决方法 在新的备库更改server_id为冲突数据的server_id,等数据耗完毕,server_id改为原库的server_id。 读者朋友可以思考一下为什么在备库上执行更改server_id的操作?

对于MySQL 本身,可以加上一层判断,在复制结构中检查 log envent的server_id是否属于 复制结构中数据库的server_id,如果不是,则判断该事物属于复制风暴事物,予以抛弃 。

四 参考资料 [1] 通过源码解析MySQL Seconds_Behind_Master [2] MySQL复制事件在主备之间来回传输检测 [3] 主备备的两个备机转为双master时出现的诡异slave lag问题

原文发表时间:2018-02-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

google C++编程风格指南之头文件的包含顺序

(1)为了加强可读性和避免隐含依赖,应使用下面的顺序:C标准库、C++标准库、其它库的头文件、你自己工程的头文件。不过这里最先包含的是首选的头文件,即例如a.c...

11910
来自专栏锦小年的博客

pycharm使用笔记2-远程连接

随着科技的发展,远程办公已经是一种趋势,远程开发能力对于每一个程序员来说都是必不可少的。有时候就算在公司,在进行开发的时候有许多的数据都是储存在服务器上的,所以...

411100
来自专栏JAVA高级架构

高并发解决方案--负载均衡

29020
来自专栏散尽浮华

nginx+php负载均衡集群环境中的session共享方案梳理

在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登...

84770
来自专栏北京马哥教育

小白也能看懂的简单明了kafka原理解析

? 介绍 ? 分布式消息系统kafka的提供了一个生产者、缓冲区、消费者的模型 ? broker:中间的kafka cluster,存储消息,是由多个se...

44360
来自专栏JetpropelledSnake

Python Web学习笔记之Python多线程和多进程、协程入门

进程和线程究竟是什么?如何使用进程和线程?什么场景下需要使用进程和线程?协程又是什么?协程和线程的关系和区别有哪些? 程序切换-CPU时间的分配 首先,我们的任...

40050
来自专栏信安之路

轻松理解 X-XSS-Protection

首先我们来理解一下什么是“X-XSS-Protection”,从字面意思上看,就是浏览器内置的一种 XSS 防范措施。

15000
来自专栏云计算教程系列

如何在Ubuntu 14.04上配置Apache以使用自定义错误页面

Apache是世界上最受欢迎的Web服务器。它功能强大,功能丰富且灵活。在设计网页时,有助于自定义那些客户将看的所有内容,当然这些内容也包括他们请求不可用内容时...

11700
来自专栏程序猿DD

使用Consul做服务发现的若干姿势

来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hms...

91540
来自专栏smy

webapp开发调试环境--weinre配置

    用谷歌调试工具中的手机模拟器模拟手机进行webapp的开发,与真机上的效果还是有些偏差,opera手机模拟器的效果亦不佳。有时在pc上开发出来的web...

451110

扫码关注云+社区

领取腾讯云代金券