本文共 3027 字,大约阅读时间需要 10 分钟。
1)什么是GTID
GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标 识,保存在mysql数据目录下的auto.cnf文件里。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。下面是一个GTID的具 体形式:3E11FA47-71CA-11E1-9E33-C80AA9429562:23。
2)GTID的作用根据GTID可以知道事务最初是在哪个实例上提交的
GTID的存在方便了Replication的Failover
3)GTID比传统复制的优势更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
更简单的搭建主从复制。
比传统复制更加安全。
GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
4)GTID的工作原理:master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
slave端的i/o线程将变更的binlog,写入到本地的relay log中。
sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
如果有记录,说明该GTID的事务已经执行,slave会忽略。
如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
实验环境:rhel6.5server7 masterserver8 slave[root@server7 ~]# mysql -p基于mysql主从复制实验
[root@server7 ~]# vim /etc/my.cnfserver-id=1log-bin=mysql-bingtid_mode=ON
enforce-gtid-consistency=true #添加GTID[root@server7 ~]# /etc/init.d/mysqld restart [root@server7 ~]# mysql #添加数据[root@server7 ~]# mysql -p[root@server8 ~]# vim /etc/my.cnfserver-id=2gtid_mode=ON
enforce-gtid-consistency=true #添加GTID[root@server8 ~]# /etc/init.d/mysqld restart [root@server8 ~]# mysql -pmysql> stop slave;mysql> change master to master_host='172.25.135.7',master_user='repl',master_password='Caonimei@478',MASTER_AUTO_POSITION = 1;mysql> start slave;mysql> show slave status\G;mysql> use mysql;mysql> show tables;mysql> select * from gtid_executed;mysql> show slave status\G;半同步复制:开启slave半同步[root@server8 ~]# vim /etc/my.cnfserver-id=2gtid_mode=ON
enforce-gtid-consistency=trueslave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON[root@server8 ~]# /etc/init.d/mysqld restart [root@server7 ~]# mysql -pmysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';Query OK, 0 rows affected (0.02 sec)mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)mysql> set global rpl_semi_sync_master_enabled=ON;
Query OK, 0 rows affected (0.00 sec)mysql> show status like '%rpl%';
mysql> show variables like '%rpl%';[root@server8 ~]# mysql -pmysql> show processlist;mysql> use mysql;mysql> select * from slave_master_info;mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;mysql> stop slave io_thread;mysql> start slave io_thread;mysql> show status like '%rpl%';+----------------------------+-------+| Variable_name | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON |+----------------------------+-------+1 row in set (0.00 sec)master上server7插入数据mysql> use westos;mysql> insert into usertb values ('user4','333');mysql> show variables like '%rpl%';mysql> insert into usertb values ('user5','333');slave server8关掉io同步mysql> stop slave io_thread;master server7掺入数据就有10秒延迟。mysql> insert into usertb values ('user6','333');转载于:https://blog.51cto.com/13810716/2306950