iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL配置了双主,是如何避免出现数据回环冲突的
  • 442
分享到

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

MySQL配置双主python数据回环冲突 2022-05-14 15:05:07 442人浏览 泡泡鱼
摘要

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

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

如果主库触发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 避免数据回环冲突的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

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

本文链接: https://www.lsjlt.com/news/10139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql拒绝访问怎么办
    mysql 出现拒绝访问的原因和解决方法:权限问题:授予用户适当的数据库或表访问权限。防火墙或安全组:允许对 mysql 端口(3306)的入站连接。密码错误:重置 mysql 密码或使...
    99+
    2024-05-20
    mysql
  • mysql怎么比较日期大小
    mysql 中比较日期大小的方法包括:直接比较两个日期,使用 、= 运算符。使用 date_format() 函数将日期转换为字符串,然后比较字符串大小。使用 str_to_date()...
    99+
    2024-05-20
    mysql
  • mysql怎么加锁
    mysql中加锁是一种确保数据并发访问一致性的机制。加锁方式有:表级锁(对整个表加锁)和行级锁(对特定行加锁)。加锁类型有共享锁(允许读取但禁止修改)、排他锁(禁止读取和修改)和意向锁(...
    99+
    2024-05-20
    mysql 并发访问
  • mysql误删数据怎么恢复
    mysql误删数据可通过以下步骤恢复:停止数据库服务,防止数据覆盖。若开启binlog日志,可从中提取删除语句,再重新执行后将数据恢复。使用恢复工具修复表文件或恢复事务。从备份中恢复数据...
    99+
    2024-05-20
    mysql
  • 怎么判断mysql安装成功
    成功安装 mysql 的方法:检查命令行界面版本号;连接到 mysql 服务器,输入 "mysql -u root -p";创建数据库,输入 "create database test;...
    99+
    2024-05-20
    mysql linux macos 防火墙配置
  • mysql怎么修改表名
    如何修改 mysql 表名:检查当前表名:show tables;运行 rename table 语句:rename table 旧表名 to 新表名;验证更改:show tables;...
    99+
    2024-05-20
    mysql
  • mysql删除的表怎么恢复
    mysql 中已删除表的恢复方法主要涉及以下步骤:检查 binlog 日志以获取删除事务信息;使用数据恢复工具扫描数据库文件;从备份还原表数据;或联系 mysql 支持寻求帮助。 My...
    99+
    2024-05-20
    mysql 数据丢失
  • mysql复合主键怎么写
    在 mysql 中编写复合主键:在 create table 语句中使用 primary key 约束并列出字段名称。复合主键的好处包括提高查询效率、保证数据完整性和强制数据顺序。注意选...
    99+
    2024-05-20
    mysql
  • 怎么查看mysql数据库版本
    如何查看 mysql 数据库版本?连接到数据库并执行查询:select version();检查命令行或 mysql workbench 中的服务器属性。 如何查看 MySQL 数据库...
    99+
    2024-05-20
    mysql linux
  • 怎么检测mysql安装成功
    要验证 mysql 安装是否成功,请执行以下步骤:检查系统服务是否正在运行。使用 mysql 命令行工具连接到服务器。创建一个测试数据库并使用它。在数据库中创建一个测试表。插入测试数据并...
    99+
    2024-05-20
    mysql linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作