1. 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、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
2. GTID的优点
1.一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
2.GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
3.减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机
3. GTID的主从异步复制实现
在上一个基于二进制的主从异步服务的基础上实现,保证主从数据库的数据一致
<1>主库修改配置文件,开启gtid
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
<2>server2从库同样修改配置文件
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
<3>关闭从节点,更改复制策略
mysql> stop slave;
mysql> change master to master_host='172.25.33.1',master_user='repl',master_password='Liuyan&123',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
Auto_Position: 1 从第一个事务开始复制
<4>主节点操作:插入数据
mysql> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into usertb values('user2','123');
Query OK, 1 row affected (0.08 sec)
mysql> insert into usertb values('user3','123');
Query OK, 1 row affected (0.10 sec)
<4>查看从节点状态,与执行事务的信息
mysql> show slave status\G
Retrieved_Gtid_Set: 39ed0b72-b025-11e9-bfb2-525400ca9499:1-2 接收到的事物
Executed_Gtid_Set: 39ed0b72-b025-11e9-bfb2-525400ca9499:1-2 执行的事物
mysql> select * from mysql.gtid_executed; 查看执行的事务
+--------------------------------------+----------------+--------------+
| source_uuid | interval_start | interval_end |
+--------------------------------------+----------------+--------------+
| 39ed0b72-b025-11e9-bfb2-525400ca9499 | 1 | 1 |
| 39ed0b72-b025-11e9-bfb2-525400ca9499 | 2 | 2 |
+--------------------------------------+----------------+--------------+
2 rows in set (0.00 sec)