1.基于gtid的主从复制的基础知识
GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog(MASTER_LOG_FILE)和POS点(MASTER_LOG_POS)
只需要知道master的IP、端口、账号、密码即可,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步
和基于position的主从复制的不同之处在于:它是以一整个事件为单位进行复制的
GTID复制名词释义
server-id:服务器身份id,在初始化MySQL时,会自动生成一个server-id并写到数据目录的auto.cnf文件中,官方不建议修改,并且server-id跟GTID有密切关系,
并且对于任意一个数据库节点,server-id是唯一的
GTID:全局事务标识符,使用这个功能时,内次事务提交都会在binlog里生成一个唯一的标识符,它由UUID和事务ID组成,首次提交的事务为1,第二次为2,第三次为3,以此类推。
开启GTID,无需找到binlog和POS点,直接change master to master_auto_postion=1即可,它会自动寻找同步
GTID工作流程
在master上一个事务提交,并写入binlog里。
binlog日志发送到slave,slave接收并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。例如
set @@session。gtid_next=’=fbd841f9-5590-11e8-b819-000c29e6461e’;
然后告诉slave接下来的事务必须使用GTID,并写入它自己的binlog里。
slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入自己的binlog里
由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid而是通过主从同步来获取GTID
2.实验环境
主机信息 | 主机的功能 |
---|---|
server1 | (172.25.12.1) 数据库的master节点 |
server2 | (172.25.12.2) 数据库的slave节点 |
3.实现基于gtid的主从复制过程(以一个事件为单位进行复制)
异步复制的效率高,master节点不会等待slave节点
基于gtid的主从复制不容易因为master一个事件的中断而造成数据丢失而不能复制
基于position的主从复制容易因为master一个事件的中断而造成数据丢失而不能复制
GTID即全局事务ID (global transaction identifier), 其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID。GTID最初由google实现,官方MySQL在5.6才加入该功能。mysql主从结构在一主一从情况下对于GTID来说就没有优势了,而对于2台主以上的结构优势异常明显,可以在数据不丢失的情况下切换新主。
GTID实际上是由UUID+TID (即transactionId)组成的。其中UUID(即server_uuid) 产生于auto.conf文件(cat /data/mysql/data/auto.cnf),是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。
GTID在一组复制中,全局唯一。通过GDIT保证每个主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力。
主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术。
pos和GTID都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的
(1)在server1(master)上面进行配置
vim /etc/my.cnf
加入:开启gtid的信息
gtid_mode=ON
enforce-gtid-consistency=true
mysql -uroot -pYan+123kou (Yan+123kou为mysql的密码)
use mysql;
select * from gtid_executed;发现是空的
cd /var/lib/mysql
mysqlbinlog mysql-bin.000002可以看出完成一个事件需要很多步
-
如果是基于position的主从复制:将一个事件拆开来复制,如果一个事件进行的过程中出现问题,那么复制也会出现问题
-
如果是基于gtid的主从复制:一个以事件为单位进行复制,如果一个事件进行的过程中出现问题,那么复制也不会出现问题
cat auto.cnf查看改节点的uuid
systemctl restart mysqld
(2)在server2(slave节点)上面进行配置
vim /etc/my.cnf
加入:开启gtid的信息
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
mysql -uroot -pYan+123kou
show databases;
stop slave;
change master to master_host='172.25.12.1',master_user='repl',master_password='Yan+123kou',master_auto_position=1;#从第一件事情开始跟踪
start slave;
show slave status\G;
(3)在server1上面开始写数据
show databases;
use westos
insert into usertb values ('user2','123');
insert into usertb values ('user3','123');
(4)在server2上面查看gtid的信息
show slave status\G;
(5)在server1上面查看gtid的信息
use mysql
select * from gtid_+executed;
(6)在server2上面查看复制过来的数据
use mysql
select * from mysql.gtid_executed;
发现slave完成了master的所有事件
以上就是完成基于gtid主从复制的整个过程