一、GTID介绍
1.1 什么是GTID
GTID(Global Transaction Identifiers) :全局事务标识, 是对于一个已提交事务的编号,并且是一个全局唯一的编号。 用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。
1.2 GTID工作原理
- master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
- slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
- sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
- 如果有记录,说明该GTID的事务已经执行,slave会忽略。
- 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
二、部署主从复制
2.1 架构
2.2 部署
本次为一次简单的测试和验证,所以仅用一主一从的架构来演示。首先准备两台装有MySQL数据库的机器(一台作为master,另一台作为slave),而且要保证两台机器的环境必须一致,同时两台机器的时间也要保持一致。
(1)两台机器均关闭防火墙及SELINUX
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 --临时关闭selinux
vim /etc/sysconfig/selinux --修改配置文件永久关闭selinux(操作略...)
(2)两台机器均开启mysqld服务
systemctl start mysqld
systemctl enable mysqld
在master端操作
(3)开启GTID及log-bin日志
vim /etc/my.cnf --在[mysqld]下添加如下内容
=========================================================================================
server-id=1 --定义server id(在实际生产中可写为IP后四位数)
log-bin = mylog --开启binlog日志(不定义路径的话默认在/var/lib/mysql/下)
gtid_mode = ON --开启gtid
enforce_gtid_consistency=1 --强制gtid
(4)重启mysqld服务
systemctl restart mysqld
(5)master服务上创建账户
mysql> grant replication slave,reload,super on *.* to 'slave'@'%' identified by 'ZRSanqy@123';
mysql> flush privileges;
=========================================================================================
【参数】:
replication slave权限:拥有此权限可以查看从服务器,从主服务器读取二进制日志。
super权限:允许用户使用修改全局变量的SET语句以及CHANGE(属于MASTER语句)
reload权限:必须拥有reload权限,才可以执行flush [tables | logs | privileges]
【注意】:在真实生产环境中需采用高级别的密码,同时将'%'换成slave对应的IP
在slave端操作
(6)开启GTID
vim /etc/my.cnf --在[mysqld]下添加如下内容
========================================================================================
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
(7)重启mysqld服务
systemctl restart mysqld
(8)两台机器分别做本地解析
(9)slave端登录数据库连接master
mysql> \e
change master to
master_host='master', --主ip 地址(最好用域名)
master_user='授权用户', --主服务上面创建的用户
master_password='授权密码',
master_auto_position=1; --master起始位置
-> ;
(10)启动slave并查看查看slave状态
mysql> start slave; --启动slave角色
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G --查看状态,验证sql和IO是不是yes,如果均为yes,说明主从同步完成。
2.3 测试
(1)在主库master上创建数据
mysql> create database test; --创建数test据库
mysql> create table test.t1(id int); --在数据库test中创建t1表
mysql> insert into test.t1 values(1); --在t1表中添加记录
mysql> select * from test.t1; --查看表的信息
(2)在从库slave上查看
三、拓展
mysql做主从同步时,master宕机,如何进行切换?
(1)在salve执行执行:
mysql> stop slave;
mysql> reset master;
(2)查看是否只读模式:
mysql> show variables like 'read_only';
=========================================================================================
如果为只读模式,则需要修改my.cnf文件,注释read-only=1,并重启mysqld服务;
或者不重启使用命令关闭只读,但下次重启后失效:set global read_only=off。
(3)查看slave状态:
show slave status \G
(4)最后在程序中将原来主库IP地址改为现在的从库IP地址,测试应用连接是否正常。
四、总结
- 基于GTID复制的优点:
- 一个事务对应一个唯一ID,一个GTID在一个服务器上只会执行一次 ;
- 操作简单、与普通复制模式不同的是,GTID在做主从复制时不需要指定二进制文件名和位置 ;
- 当主库master宕机时,可进行故障转移,记录master最后事务的GTID值。 slave不会丢失master的任何修改 。
- 基于GTID复制的缺点:
- GTID 模式实例和非GTID模式实例是不能进行复制;
- 不支持非事务引擎;
- 故障处理比较复杂 。