环境:
Mysql5.7 binlog复制环境
主库:192.168.153.128
备库:192.168.153.231
版本:mysql5.7
说明:
承接上一篇基于Mysql5.7 binlog复制环境,目前很多企业在用gtid复制。
相比binlog方式有更多的优势,下面会提到。配置好binlog主备后,
简单配置一下gtid做个记录
正文:
GTID(global transaction identifiers)复制是完全基于事务的复制,即每个在主库上执
行的事务都会被分配一个唯一的全局ID并记录和应用在从库上
这种复制方式简化了建立slave和master/slave之间切换的工作,因为其完全不需要找当
前执行的bin log和log中的位置完成切换
一个GTID是master上执行的任何commit事务所分配的全局唯一ID标示,其由两部分组成:
GTID = source_id:transaction_id
Source_id代表主库的server_uuid,transaction_id代表事务按顺序提交的ID,比如第
一个提交则是1,第十个提交的事务就是10
GTID集合代表一组GTID
GTID复制的优势:
1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。
2、更简单的搭建主从复制。
3、比传统binlog复制更加安全。
4、GTID是连续的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。
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、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
log_slave_updates参数:
① 当一个事务在主库提交时,该事务就被赋予了一个GTID,并记录在主库的binary log
② 主库的binary log会被传输到从库的relay log中,从库读取此GTID并生成gtid_next系
统参数
③ 从库验证此GTID并没有在自己的binary log中使用,则应用此事务在从库上
MySQL5.6的GTID复制模式,slave必须开启bin-log和log_slave_updates参数,否则启
动就报错,因为需要在binlog找到同步复制的信息(UUID:事务号)
(注:开启log_slave_updates参数,是把relay-log里的日志内容再记录到slave本地的
binlog里。)
但在MySQL5.7里,官方做了调整,用一张gtid_executed系统表记录同步复制的信息
(UUID:事务号),这样就可以不用开启log_slave_updates参数,减少了从库的压力
从MySQL5.7.4版本开始,GTID会存放在mysql系统库的gtid_executed表中
CREATE TABLE gtid_executed ( source_uuid CHAR(36) NOT NULL, interval_start
BIGINT(20) NOT NULL, interval_end BIGINT(20) NOT NULL, PRIMARY KEY
(source_uuid, interval_start) )。
基础环境:Mysql5.7 binlog复制环境
1.主备库开启gtid参数
将主库和从库都设置为read only,确保两者之间的数据都完全同步
mysql> SET @@global.read_only = ON;
关闭主库和从库
设置主备库GTID后启动 并暂时关闭slave进程
备库关闭slave进程:
stop slave;
主备库关闭服务:
service mysqld stop
主备设置gtid参数:
vim /etc/my.cnf
gtid-mode=on
enforce-gtid-consistency=on
skip-slave-start=1
#Enforce-gtid-consistency参数是确保只有对gtid复制机制安全的语句才会被log
2.重新配置主备关系:
MASTER_HOST='192.168.153.128',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='mysql',
MASTER_AUTO_POSITION=1;
3.备库开启同步
备库开启slave进程
reset slave all;
start slave;
4.主库关闭只读read only模式:
mysql> SET @@global.read_only = OFF;
5.验证
Master上执行:
mysql> insert into temp values(3,'c');
Query OK, 1 row affected (0.00 sec)
Slave上执行:
mysql> select * from temp;
+------+------+
| id | name |
+------+------+
| 1 | a |
| 2 | b |
| 3 | c |
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.153.128
Master_User: repl
Master_Port: 3308
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 414
Relay_Log_File: vmware1-relay-bin.000002
Relay_Log_Pos: 627
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Retrieved_Gtid_Set: 9eae8f34-47b6-11e7-8087-000c298d7ee3:1-----gtid怎么来的?主库过来的!主库执行:show master status;查看主库当前gtid
Executed_Gtid_Set: 9eae8f34-47b6-11e7-8087-000c298d7ee3:1
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:

本文介绍MySQL5.7中GTID复制的配置及原理。GTID复制简化了搭建主从复制的过程,并提升了切换主从的安全性。文章详细解释了GTID的组成及其在主从库间的传递流程。

2028

被折叠的 条评论
为什么被折叠?



