MySQL基于gtids实现主从复制

GTID的概述:
1、全局事物标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

GTID的组成部分:
前面是server_uuid:后面是一个序列号

UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。

GTID比传统复制的优势:

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

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、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

##slave在接受master的binlog时,会校验master的GTID是否已经执行过(一个服务器只能执行一次)。
##为了保证主从数据的一致性,多线程只能同时执行一个GTID。

注意:
1、开启GITDs需要在master和slave上都配置gtid-mode,log-bin,log-slave-updates,enforce-gtid-consistency(该参数在5.6.9之前是--disable-gtid-unsafe-statement)
2、其次,slave还需要增加skip-slave-start参数,目的是启动的时候,先不要把slave起来,需要做一些配置

 

总结:有了GTID大大的简化了复制的过程,降低了维护的难度

 实验步骤:

将当前的传统AB复制转换成GTID模式

master:192.168.200.111

slave:192.168.200.112

1.将master和slave服务器都设置为read-only

 MariaDB [(none)]>set @@global.read_only=ON;

Query OK, 0 rows affected (0.00 sec)

2.停掉主从服务器的mariadb

systemctl stop mariadb.service

3.修改主服务器的配置文件

[root@master ~]# vim /etc/my.cnf

将原先配置的AB复制替换掉
log-bin=mysql-bin
gtid-mode=on
log-slave-updates
enforce-gtid-consistency

  4.重启主服务器

systemctl start mariadb.service

5.配置从服务器的配置文件

[root@slave1 ~]# vim /etc/my.cnf

同样将原AB复制的内容替换掉
gtid-mode=on
log-bin
log-slave-updates
enforce-gtid-consistency
skip-slave-start

 6.重启从服务器

systemctl start mariadb.service

...

posted @ 2022-07-21 10:17  Joshua¥A¥  阅读(118)  评论(0编辑  收藏  举报