mysql5.7——基于GTID的主从复制

在上一篇博客中我们介绍了mysql5.7主从复制的原理和配置,今天我们就在上一篇博客的基础上来看看基于GTID的mysql5.7主从复制与半同步复制是什么样的

GTID

概述

GTID(Global Transaction ID)是MySQL5.6引入的功能,可以在集群全局范围标识事务,用于取代过去通过binlog文件偏移量(pos)定位复制位置的传统方式。借助GTID,在发生主备切换的情况下,MySQL的其它Slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

特点

1:更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
2:更简单的搭建主从复制。
3:比传统复制更加安全。
4:GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。

GTID的组成

根据官方文档定义,GTID由source_id加transaction_id构成。
GTID = source_id:transaction_id
上面的source_id指示发起事务的MySQL实例,值为该实例的server_uuid。server_uuid由MySQL在第一次启动时自动生成并被持久化到auto.cnf文件里,transaction_id是MySQL实例上执行的事务序号,从1开始递增。 例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1 

一组连续的事务可以用’-'连接的事务序号范围表示。例如

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5 

更一般的情况是GTID的集合。GTID集合可以包含来自多个source_id的事务,它们之间用逗号分隔;如果来自同一source_id的事务序号有多个范围区间,各组范围之间用冒号分隔,例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,
e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27 

GTID工作原理

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

配置基于GTID的主从复制

一、
1:在所有节点中编辑mysql配置文件/etc/my.cnf
添加:
gtid_mode=ON
enforce-gtid-consistency=true

gtid_mode有4中模式:
    OFF 不产生GTID, Slave只接受不带GTID的事务
    OFF_PERMISSIVE 不产生GTID, Slave即接受不带GTID的事务也接受带GTID的事务
    ON_PERMISSIVE 产生GTID, Slave即接受不带GTID的事务也接受带GTID的事务
    ON 产生GTID, Slave只接受带GTID的事务

2:重启mysql
/etc/init.d/mysqld restart
二、在slave(server2)中:
进入mysql
1:stop slave;
2:change master to master_host=‘172.25.66.1’,master_user=‘repl’,master_password=‘Guodong+0306’,master_auto_position=1;
3:start slave;
在这里插入图片描述
4:查看状态 (IO线程和 sql线程已经正常开启 )
在这里插入图片描述
三、在master的mysql中修改数据
1:use user;
向usertb表中添加一组数据
insert into user.usertb value(‘user1’,‘123’);
在这里插入图片描述
2:在slave中查看是否同步
在这里插入图片描述
3:可以看到数据成功同步,现在我们就可以在master与slave中查看已经执行过的事务的GTID
在master中:show master status;
在这里插入图片描述
在slave中:show slave status\G;
在这里插入图片描述
四、因为在上一篇博客中我们做的是一个链式的mysql5.7主从复制,即server1是server2的master,server2是server3的master,所以我们在做好上面的操作后,直接打开slave(server3)中的mysql,show slave status\G;可以直接查看到执行过的事务的GTID,并且数据也已经同步
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gd0306/article/details/84779010