【案例】主从替换之后的复制风暴

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一 现象   一套MySQL主-备-备-备数据库,其中的备库升级到主库之后,系统监控报警 Seconds_Behind_Master 瞬间为0,瞬间为数十万秒。第一感觉是遇到了复制风暴--不同于主备server_id 的log event在主备库之间无限循环复制。
一 现象
   一套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,如果不是,则判断该事物属于复制风暴事物,予以抛弃 。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
算法 开发工具 git
多主复制下处理写冲突(3)-收敛至一致的状态及自定义冲突解决逻辑
主从复制模型的数据更新符合顺序性原则:若同一字段有多个更新,则最后一个写操作决定该字段的终值。
143 0
|
分布式数据库 数据库
复制延迟案例(1)-最终一致性
该案例违反因果律。 想象先生和夫人之间的对话: Mr Mrs,你能看到多远未来? Mrs 通常约10s,Mr.
96 0
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
127 0
|
关系型数据库 MySQL 数据库
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
332 0
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
算法 Java Nacos
Raft采用日志复制形式同步数据|学习笔记
快速学习Raft采用日志复制形式同步数据
Raft采用日志复制形式同步数据|学习笔记
|
SQL NoSQL 关系型数据库
二十五:从库的关闭和恢复流程(笔记)
一、stop slave流程 用户线程: stop_slave -> terminate_slave_threads ->带入参数rpl_stop_slave_timeout设置,作为等待SQL线程退出的超时时间。
874 0
|
前端开发 JavaScript .NET
【自然框架】 之 主从表的添加、修改
摘要 1、 这里不是说如何做一个人员管理,这里要说的是自然框架如何处理主从表的添加、修改。人员管理只是一个例子。2、 人员管理的表的“结构”。3、 Tab标签页,通过js脚本+iframe实现的Tab效果。
1503 0
|
SQL 关系型数据库 MySQL
GTID的复制的搭建过程
1.什么是GTID? GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号; GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。
1088 0
演示大事物导致复制延时
演示大事物导致复制延时 master: #主库开始一个大事物等待结束传送到从库上: root@localhost [employees]>alter table salaries engine=innodb; Query OK, 0 rows affected (24.
601 0

热门文章

最新文章