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
...