当前位置: 首页 > news >正文

MySQL双主模式下是如何避免数据回环冲突的

这是学习笔记的第 2157 篇文章


640?wx_fmt=gif

   不知道大家想过这个问题没有?如果配置了双主,是如何避免出现数据回环冲突的,因为在数据双活的设计方案中,这可以算是方案的核心设计思想之一。

如果主库触发SQL语句:insert into test_data(name) values(‘aa’);

那么Master1生成binlog,推送数据变化到Master2,在Master2上面生成relay log,然后交由sql thread进行变更重放,反之也是类似的流程,整个流程可以这样描述。

640?wx_fmt=png

如果Master2消费了relay的数据,然后会产生binlog(log_slave_updates默认开启),这个时候产生的binlog会继续推送到Master1消费,然后来来回回推送,一套insert语句就无穷无尽了,显然这种设计是不合理的,MySQL也肯定不会这么做。

那么问题的关键的部分就是:Master2是否推送了先前的binlog到Master1?

a) 如果推送了,Master1是如何过滤,避免后续无限循环

b) 如果没有推送,Master2是如何过滤的

如果要理解这个过程,我们就需要模拟测试,查看数据流转过程中的binlog情况,可以参考这个流程。

1) Master1的binlog

2) Master2的 relay log

3) Master的binlog

很快就部署好了一套主从环境,然后添加change master to 就快速搭建好了一套测试的双主环境。

为了尽可能看到完整的binlog事件信息,我们开启参数binlog_rows_query_log_events

在Master1触发语句:insert into test_data(name) values(‘gg’);

得到的binlog事件如下,可以清楚的看到相关的SQL语句。

640?wx_fmt=png

在Master2端,我们查看binlog的情况,在开启binlog_rows_query_log_events的前提下会看到明显少了事件:Rows_query.

640?wx_fmt=png

此时需要思考的是,在这个过程中偏移量是否发生了变化,从Master1产生的binlog到Master的relay log,如果通过mysqlbinlog去解析,得到的偏移量情况都是一模一样,而在Master2消费后,产生了相关的binlog信息。 

问题的关键就在这里,在Maser2里面是通过Server_id来标注了数据的源头,所以在这里就称为整个数据流转的终点了,也就意味着数据复制的时候是按照server_id来进行U过滤的,每个Master端只会传送自己相关的binlog信息。

如果从这个角度来说,MySQL对于复制中的server_id如此重要的一个原因就是基于此。

而如果换一个角度,看待基于偏移量的异步复制,其实也可以得到类似的信息。 

这是Master1触发insert语句后的binlog细节。

640?wx_fmt=png

这是Master2接受实时数据后的binlog细节。

640?wx_fmt=png

其实看到这里,还存在一个问题,那就是在偏移量模式下,如果需要一个数据变更操作在Master2丢失了,那么是没有办法进行回溯的。 

而基于GTID模式可以唯一性标识全局事务,那么哪怕对这个操作进行了重复应用,哪怕是DDL语句,操作的影响行数也是0. 

我们对一个已经执行的操作进行再次应用,看看MySQL是否会自动舍弃该类操作。

mysql> SET @@SESSION.GTID_NEXT= '6fb744dd-05dd-11ea-ada7-52540043a8b5:6';

Query OK, 0 rows affected (0.00 sec)

mysql> use `test`; create table test_data (id int primary key auto_increment,name varchar(30));

Database changed

Query OK, 0 rows affected (0.00 sec)

查看show binlog events发现这个过程不会产生额外的binlog。

所以基于此,我们也基本明确了数据回环解决方法的一个设计思想,那就是如何让MySQL能够识别出那些已经应用的事务数据,我想GTID是一个答案,而且分布式ID不用,这是MySQL内部的处理机制,而且是MySQL能够识别的方式。

近期热文:

转载热文:

相关文章:

  • MySQL中的SQL优化建议那么多,该如何有的放矢
  • dbaplus广州站归来
  • 梳理这件事情做不好,很多努力都是白费
  • 怎么证明根号2是无理数,我们来推导和计算,还有逼格极高的算法
  • 行锁:InnoDB 替代 MyISAM 的重要原因
  • 数据双向复制中的6个数据冲突场景和解决思路
  • MySQL多活数据消费服务设计方案
  • 数学有趣地超乎你的想象
  • MySQL中10多张表关联要做优化,怎么理解逻辑幂等
  • 回答:我不小心把公司的数据库给删了,该不该离职?
  • 医院门诊透视的生活万花筒
  • 图数据库Neo4j学习笔记系列
  • MySQL的主键命名挺任性,就这么定了
  • 运维开发和测试中常见的8个问题
  • MySQL数据清理有技巧,这么破
  • C++类中的特殊成员函数
  • Gradle 5.0 正式版发布
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • jquery cookie
  • Phpstorm怎样批量删除空行?
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue.js框架原理浅析
  • 初识 webpack
  • 回流、重绘及其优化
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 精彩代码 vue.js
  • 前端设计模式
  • 全栈开发——Linux
  • 手机端车牌号码键盘的vue组件
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我建了一个叫Hello World的项目
  • 一个完整Java Web项目背后的密码
  • 说说我为什么看好Spring Cloud Alibaba
  • 我们雇佣了一只大猴子...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (k8s中)docker netty OOM问题记录
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (五)Python 垃圾回收机制
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net Signalr 使用笔记
  • .net 提取注释生成API文档 帮助文档
  • :not(:first-child)和:not(:last-child)的用法
  • @angular/cli项目构建--Dynamic.Form
  • @SuppressWarnings注解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [Avalon] Avalon中的Conditional Formatting.
  • [CC-FNCS]Chef and Churu
  • [CISCN2019 华东北赛区]Web2