一、技术原理
GTID(Global Transaction ID)是MySQL中用于标识全局事务唯一性的一种机制。GTID是一个全局唯一的标识符,用于追踪数据库集群中各个节点上的事务。每个事务都有一个唯一的GTID,不同节点上相同的事务都具有相同的GTID。
GTID的结构通常由两个部分组成:GTID域标识符(GTID Domain Identifier)和GTID值。GTID域标识符用于标识特定数据库集群,而GTID值则用于唯一标识某个节点上的事务。
server_uuid 来源于 auto.cnf
通过GTID实现主从复制的原理如下:
-
启用GTID:在MySQL配置中启用GTID,确保所有参与主从复制的节点都启用了GTID。
-
生成GTID:每个节点在执行事务时都会生成一个唯一的GTID。这个GTID包括GTID域标识符和GTID值。
-
主服务器上生成GTID并传输给从服务器:当主服务器上执行一个事务时,它会生成一个GTID,并将GTID一起写入二进制日志(binlog)中。
-
从服务器读取GTID并应用到本地:从服务器会读取主服务器的binlog,并解析其中的GTID信息。然后,它会将这个GTID应用到自己的事务中,确保主从服务器上的事务具有相同的GTID。
-
跟踪复制进度:主从服务器之间的复制进程会不断地将主服务器上的事务同步到从服务器上,并通过GTID来跟踪复制的进度。如果从服务器出现故障,它可以根据GTID的信息确定下一个需要从主服务器同步的事务。
-
处理主从切换:如果需要将从服务器提升为主服务器(主从切换),GTID可以帮助确定从哪个位置开始进行同步,而无需进行手动处理。
二、与Binlog的联系
GTID(Global Transaction ID)和二进制日志(binlog)是MySQL中两个相关但不同的概念,它们在主从复制中扮演不同的角色。
区别:
-
定义:
-
GTID: 全局事务标识符,是用于唯一标识全局事务的一种机制。
-
Binlog: 二进制日志,是MySQL用于记录对数据库进行更改的一种机制,包含了所有写入和更新数据的信息。
作用:
-
GTID: 用于标识全局唯一的事务,主要用于主从复制中,方便跟踪和同步事务的状态。
-
Binlog: 用于记录数据库的变更,提供数据恢复、复制、故障恢复等功能。
唯一性:
-
GTID: 是全局唯一的标识符,不同节点上相同的事务具有相同的GTID。
-
Binlog: 对于每个节点来说,生成的二进制日志文件名和位置是唯一的。
关联:
-
GTID与Binlog: GTID通常存储在二进制日志中,确保每个事务都有一个唯一的标识符。通过GTID,可以在主从复制中更容易地确定主从服务器之间的同步状态。
联系:
-
GTID存储在Binlog中:
-
GTID信息通常会被写入二进制日志,这样从服务器在同步的时候可以通过解析binlog中的GTID信息来确定同步的位置。
主从复制中的关系:
-
主从复制的配置中通常需要配置GTID信息,确保主从服务器之间可以通过GTID进行同步。
主从切换和Failover:
-
在主从切换或Failover的情况下,GTID可以帮助从服务器确定从哪个位置开始同步,而无需依赖于传统的二进制日志文件名和位置。
GTID和binlog是紧密相关的,GTID通常存储在binlog中,而binlog则记录了数据库的所有更改。GTID的引入简化了主从复制的配置和管理,提高了系统的可维护性和可靠性。
备注:使用 GTID 主从复制仍然需要启用二进制日志(binlog)。GTID 与二进制日志一起使用,提供了更简单和可靠的主从复制机制。在配置中同时启用 GTID 和二进制日志是确保主从复制正常运行的关键步骤。
三、具体实现步骤
1、修改配置文件
在Master和Slave上都需要进行修改。
#开启GTID模式(必选)
gtid_mode=ON
#强制gtid一致性(必选)
enforce-gtid-consistency=true
2、重启服务
3、从服务器停止同步
STOP SLAVE;
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.00 sec)
4、从服务器change master
change master to
master_host='192.168.1.137',
master_port=3306,
master_user='sync',
master_password='Yl2023..',
master_auto_position = 1;
备注:如果不知道主服务器当前的GTID位置,使用master_auto_position = 1
是一种便捷的方式,MySQL会自动获取并开始复制。
5、从服务器开启同步
START SLAVE;
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
四、GTID验证与查询命令
1、验证是否启用 GTID:
SHOW VARIABLES LIKE 'gtid_mode';
mysql> SHOW VARIABLES LIKE 'gtid_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | ON |
+---------------+-------+
1 row in set (0.00 sec)
2、查看当前 MySQL 实例的 GTID 值:
SELECT @@GLOBAL.gtid_executed;
mysql> SELECT @@GLOBAL.gtid_executed;
+--------------------------------------------+
| @@GLOBAL.gtid_executed |
+--------------------------------------------+
| 4442baa3-a073-11ee-bea9-000c29b1eab0:1-371 |
+--------------------------------------------+
1 row in set (0.00 sec)
3、验证是否支持 GTID 主从复制:
SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';
mysql> SHOW VARIABLES LIKE 'gtid_mode';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'enforce_gtid_consistency';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON |
+--------------------------+-------+
1 row in set (0.00 sec)