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.一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次
2.GTID是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置
3.减少手工干预和降低服务故障时间,当主机挂了之后通过软件从众多的备机中提升一台备机为主机
GTID的主从异步复制实现:
在上一个基于二进制的主从异步服务的基础上实现,保证主从数据库的数据一致
主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术。
异步复制的效率高,master节点不会等待slave节点
基于gtid的主从复制不容易因为master一个事件的中断而造成数据丢失而不能复制
基于position的主从复制容易因为master一个事件的中断而造成数据丢失而不能复制
pos和GTID都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的
主库修改配置文件,开启gtid
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=true
==systemctl restart mysqld ==
select * from gtid_executed;发现是空的
cd /var/lib/mysql
mysqlbinlog mysql-bin.000002可以看出完成一个事件需要很多步
如果是基于position的主从复制:将一个事件拆开来复制,如果一个事件进行的过程中出现问题,那么复制也会出现问题
如果是基于gtid的主从复制:一个以事件为单位进行复制,如果一个事件进行的过程中出现问题,那么复制也不会出现问题
server2同样修改配置文件
server-id=2
gtid_mode=ON
enforce-gtid-consistency=true
==systemctl restart mysqld ==
关闭从节点,更改复制策略
mysql> stop slave;
Query OK, 0 rows affected (0.04 sec)
mysql> change master to master_host=‘172.25.15.1’,master_user=‘repl’,master_password=‘Yty123+ld’,master_auto_position=1; Auto_Position: 1 从第一个事物开始复制
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> start slave;
Query OK, 0 rows affected (0.06 sec)
mysql> show slave status\G
主节点操作:插入数据
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.07 sec)
mysql> insert into usertb values(‘user3’,‘123’);
Query OK, 1 row affected (0.08 sec)
查看从节点状态,与执行事务的信息
show slave status\G
Retrieved_Gtid_Set: 0659d1cc-dec0-11e9-a9d0-525400aa6fcc:1-2
Executed_Gtid_Set: 0659d1cc-dec0-11e9-a9d0-525400aa6fcc:1-2
select * from mysql.gtid_executed; 查看执行的事务
以上就是基于gtid主从复制的整个过程