MySQL配置了双主,是如何避免出现数据回环冲突的

 更新时间:2021年01月28日 11:50:53   作者:jeanron100  
这篇文章主要介绍了MySQL配置了双主,是如何避免出现数据回环冲突的,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下

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

如果主库触发SQL语句:

insert into test_data(name) values(‘aa');

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

如果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语句。

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

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

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

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

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

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

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

其实看到这里,还存在一个问题,那就是在偏移量模式下,如果需要一个数据变更操作在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配置了双主,是如何避免出现数据回环冲突的的详细内容,更多关于MySQL 避免数据回环冲突的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL数据表损坏的正确修复方案

    MySQL数据表损坏的正确修复方案

    修复以损坏的MySQL数据表的实际操作在实际中是我们经常用到的,以下的文章主要是介绍正确修复以损坏的MySQL数据表的实际操作步骤,以下就是正文的介绍,希望会给你带来一些帮助在此方面。
    2011-01-01
  • 解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION问题

    解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.*

    这篇文章主要介绍了解决mysql的赋权操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION问题,本文给大家分享两种情况分析分享解决方案,感兴趣的朋友一起看看吧
    2022-11-11
  • 详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题

    详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题

    这篇文章主要介绍了DBeaver连接MySQL8以上版本以及解决可能遇到的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mysql 5.7.14 安装配置简单教程

    mysql 5.7.14 安装配置简单教程

    这篇文章主要为大家分享了mysql 5.7.14安装配置方法图文教程,一看就会的mysql 5.7.14安装教程,感兴趣的朋友可以参考一下
    2016-08-08
  • Mysql事务索引知识汇总

    Mysql事务索引知识汇总

    这篇文章主要介绍了Mysql事务索引知识汇总,mysql事务是用于处理操作量大、复杂性高的数据,索引能加快数据库的查询速度并高效获取指定的数据,下文相关详细内容,需要的小伙伴可以参考一下
    2022-03-03
  • MySQL清理数据并释放磁盘空间的实现示例

    MySQL清理数据并释放磁盘空间的实现示例

    本文主要介绍了MySQL如何清理数据并释放磁盘空间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • CentOS安装mysql5.7 及简单配置教程详解

    CentOS安装mysql5.7 及简单配置教程详解

    这篇文章主要介绍了CentOS安装mysql5.7 及简单配置教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • 开发人员为什么必须要了解数据库锁详解

    开发人员为什么必须要了解数据库锁详解

    这篇文章主要给大家介绍了关于开发人员为什么必须要了解数据库锁的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用数据库具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • MySQL定时全库备份数据库

    MySQL定时全库备份数据库

    数据备份真的很重要, 因为可能有一天数据会被莫名其妙的删掉了,本文主要介绍了MySQL定时备份数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • MySQL虚拟列的使用示例

    MySQL虚拟列的使用示例

    虚拟列是MySQL中的一种特殊列,它不存储在表中,而是在查询时动态计算生成,虚拟列可以提高查询效率、减少存储需求、确保数据一致性、简化查询和保护敏感数据,感兴趣的可以了解一下
    2024-11-11

最新评论