【20181204】 MySQL 双主复制是如何避免回环复制的

问题原因

想要了解这个问题的原因在于有一次面试的时候,面试官问我一个问题,就是MySQL的双主复制的时候是如何避免回环复制这个问题的,说老实话在基于GTID复制的时候我还是比较了解的,因为GTID复制是MySQL本身是不会执行已经执行过的GTID事务,即使MySQL本身并不会执行已经执行过的GTID事务,但是还是会形成一个回环复制。那么MySQL到底是如何解决回环复制的呢?

猜想

  1. 在我们搭建主从的时候我们可以清楚的知道,要想成功的搭建主从,那么主从的server_id必须不能一模一样的,所以猜想可能是因为server_id的原因。
  2. 在MySQL 5.5以及一切,我们搭建一主多从的时候,假如slave使用了相同的server_id就会发现在master和slave上面发现slave会经常的断开重连,这个是因为slave在注册的时候会去比对server_id,假如server_id存在的话则会有一个删除操作,但是MySQL 5.6的版本以后引入了uuid,它会优先去比对uuid,假如不存在的话则会去比对server_id。所以在MySQL5.6以及以后是因为uuid的原因呢。

实验

A. 搭建双主。非gtid模式(具体过程不在描述)
master 1

........
........
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 2175
               Relay_Log_File: rep_relay_log.000004
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
........

master 2

                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 3385
               Relay_Log_File: rep_relay_log.000004
                Relay_Log_Pos: 1235
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

B . master 1 上面执行创建表语句

mysql> show create table test \G
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `class_num` int(11) NOT NULL AUTO_INCREMENT,
  `class_name` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`class_num`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

C. master 1和2上面分别插入部分数据进行验证。

+-----------+------------+
| class_num | class_name |
+-----------+------------+
|         4 | 物理       |
|         5 | 化学       |
|         6 | 生物       |
|         7 | 体育       |
|         8 | 123        |
+-----------+------------+

D. master 1 上面执行

mysql> stop slave;
mysql> set global server_id=3306;
mysql> start slave;

E. master 2上面执行

mysql> stop slave;
mysql> set global server_id=3307;
mysql> start slave;

F. master 1 上面执行

mysql> insert into test(class_name) values(‘321‘);

G. master 1上面观察

mysql > show slave status;
   ......
     Last_SQL_Error: Error ‘Duplicate entry ‘9‘ for key ‘PRIMARY‘‘ on query. Default database: ‘test‘. Query: ‘insert into test(class_name) values(‘321‘)‘
     Replicate_Ignore_Server_Ids:
     ......

H. master 1上面执行下面命令,你会发现还是会有这个错误。

mysql> delete from test where class_num=9;
mysql> start slave;
mysql> show slave status;
   ......
     Last_SQL_Error: Error ‘Duplicate entry ‘9‘ for key ‘PRIMARY‘‘ on query. Default database: ‘test‘. Query: ‘insert into test(class_name) values(‘321‘)‘
   ......

I. 解析binlog日志信息:

#181204 16:15:00 server id 3306  end_log_pos 2762 CRC32 0xad6f9e83  Intvar
SET INSERT_ID=9/*!*/;
#181204 16:15:00 server id 3306  end_log_pos 2878 CRC32 0x5cf6d5f2  Query   thread
_id=54  exec_time=124   error_code=0
SET TIMESTAMP=1543911300/*!*/;
insert into test(class_name) values(‘321‘)
/*!*/;
# at 2878
#181204 16:15:00 server id 3306  end_log_pos 2909 CRC32 0x9ccd43ee  Xid = 139
COMMIT/*!*/;
# at 2909
#181204 16:30:52 server id 52213306  end_log_pos 2988 CRC32 0xc9831ff7  Query   thread
_id=54  exec_time=0 error_code=0
SET TIMESTAMP=1543912252/*!*/;
BEGIN
/*!*/;
# at 2988
#181204 16:30:52 server id 52213306  end_log_pos 3096 CRC32 0x37f9c65e  Query   thread
_id=54  exec_time=0 error_code=0
SET TIMESTAMP=1543912252/*!*/;
delete from test where class_num=9
/*!*/;
# at 3096
#181204 16:30:52 server id 52213306  end_log_pos 3127 CRC32 0xc68f6eae  Xid = 151
COMMIT/*!*/;
# at 3127
#181204 16:15:00 server id 3306  end_log_pos 3206 CRC32 0xd5fc40b3  Query   thread
_id=54  exec_time=959   error_code=0
SET TIMESTAMP=1543911300/*!*/;
BEGIN
/*!*/;
# at 3206
# at 3238
#181204 16:15:00 server id 3306  end_log_pos 3238 CRC32 0x52663932  Intvar
SET INSERT_ID=9/*!*/;
#181204 16:15:00 server id 3306  end_log_pos 3354 CRC32 0xc642ad10  Query   thread
_id=54  exec_time=959   error_code=0
SET TIMESTAMP=1543911300/*!*/;
insert into test(class_name) values(‘321‘)
/*!*/;
# at 3354
#181204 16:15:00 server id 3306  end_log_pos 3385 CRC32 0xd5e2ad2a  Xid = 155
COMMIT/*!*/;
DELIMITER ;
# End of log file

可以明显得看得到 insert into test(class_name) values(‘321‘); 这条SQL执行了好多次,这个时候明显可以验证在非GTID复制得情况下面是由于server_id才避免了回环复制。

结论

在进行修改uuid得时候发现这是一个只读参数,不能在修改。并且uuid是MySQL初始化得时候先去auto.cnf文件里面查找,若不存在则会随机生成一串随机码,所以可以直接去除这个。再上面得实验中可以获取得到MySQL再非GTID下面是由server_id得原因才避免了回环复制的,但是GTID环境下面会不会也是因为server_id的原因呢,暂时就没有去验证了。不过我还是认为gtid下面也是因为GTID的原因。

原文地址:http://blog.51cto.com/11819159/2326030

时间: 2024-09-30 21:47:06

【20181204】 MySQL 双主复制是如何避免回环复制的的相关文章

keepalived+mysql双主复制高可用方案

MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了双主对外的统一接口以及自动检查.失败切换机制.联合使用,可以实现MySQL数据库的高可用方案. 实验环境:OS:centos 6.x x86_64系统MySQL版本: :mysql 5.6.22   64 位A: master :192.168.79.3 3306B: slave :192.168.

MySQL双主复制

原文发表于cu:2017-06-12 本文简单介绍MySQL双主复制原理及1个简单是双主复制验证. MySQL双主复制原理 双主复制原理 master-master复制的两台服务器,既是master,又是另一台服务器的slave,本质上互为主从. 验证环境 操作系统 CentOS-6.7-x86_64 MySQL版本 MySQL版本是5.6.36: https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.36.tar.gz 拓扑图 采用VMwar

MySQL双主环境复制延时故障处理

故障现象生产中的一组MySQL双主(主库A和主库B)+Keepalived高可用单写(主库A),出现B库高延时问题.检查B库复制状态如下图1:(B库的复制状态-图1)问题分析1.和开发人员确认,这组MySQL双主每天有批量的数据导入操作,业务是网站展示前一天股票大盘指数,数据是由脚本批量导入,从而产生了复制延时.2.通过对导数据脚本分析,导数据是对一个表先进行delete后进行insert操作:股指大盘展示数据只保留一天数据,因此确认不需要保留前一天数据,修改脚本先truncate表后inser

MySQL双主(主主)架构方案

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mysql入口,增加高可用.不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题. 主从同步复制原理 在开始之前,我们先来了解主从同步复制原理. 复制分成三步: 1. master将改变记录到二进制日志(binary

keepalived+mysql双主

       mysql高可用keepalived+mysql双主 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC. 本节主要介绍了利用 keepalived 实现 MySQL 数据库的高可用. Keepalived+mysql双主来实现MySQL-HA,我们必须保证两台MySQL数据库的数据完全一样,基本思路是两台MySQL互为主从关系,通过Keepalived配

MySQL双主互备模式架构

MySql双主互备架构模式 操作系统 CentOS 6.3 MySql版本 mysql-5.0.56 keepalived keepalived-1.1.19.tar.gz Master DB1配置文件 修改MySql 配置文件  /etc/my.cnf 增加以下段落 [mysqld] server-id=1    节点标示 log-bin=mysql-bin   开启mysql的binlog日志功能 relay-log = mysql-relay-bin  用来定义日志文件命名格式 repli

通过KeepAlived搭建MySQL双主模式的高可用集群系统

企业级MySQL集群具备高可用.可扩展.易管理.低成本的特点.下面将介绍企业环境中经常应用的一个解决方案,即MySQL的双主互备架构,主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制.这样就实现了高可用构架中的数据同步功能,同时,将采用KeepAlived来实现Mysql的自动failover.在这个构架中,虽然两台MySQL Server互为主从,但同一时刻只有一个MySQL Ser

mysql双主同步

在实际项目中,两台分布于异地的主机上安装有MYSQL数据库,两台服务器互为主备,客户要求当其中一台机器出现故障时,另外一台能够接管服务器上的应用,这就需要两台数据库的数据要实时保持一致,在这里使用MYSQL的同步功能实现双机的同步复制. 1.数据库同步设置 主机操作系统:centos 数据库版本:mysql Ver 14.12 Distrib 5.0.22 前提:MYSQL数据库正常启动 假设两台主机地址分别为: ServA:192.168.0.101 ServB:192.168.0.203 I

新版keeplived + MySQL双主自动切换

### 新版keeplived + MySQL双主自动切换 ###参考网址: http://biancheng.dnbcw.info/mysql/381020.html###一.网络结构  ###    VIP 10.125.141.249    mysq1m1 10.125.141.138 主1(相对而言是主库)    mysqlm2 192.168.88.131 主2(相对而言是备库)### 二.主要步骤 ###    一 mysql 主主同步    二 安装keepalived     三