一、GTID同步的概念
GTID即全局事务ID (global transaction identifier), 其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID。GTID最初由google实现,官方MySQL在5.6才加入该功能。mysql主从结构在一主一从情况下对于GTID来说就没有优势了,而对于2台主以上的结构优势异常明显,可以在数据不丢失的情况下切换新主。使用GTID需要注意: 在构建主从复制之前,在一台将成为主的实例上进行一些操作(如数据清理等),通过GTID复制,这些在主从成立之前的操作也会被复制到从服务器上,引起复制失败。也就是说通过GTID复制都是从最先开始的事务日志开始,即使这些操作在复制之前执行。比如在server1上执行一些drop、delete的清理操作,接着在server2上执行change的操作,会使得server2也进行server1的清理操作。
GTID实际上是由UUID+TID (即transactionId)组成的。其中UUID(即server_uuid) 产生于auto.conf文件(cat /data/mysql/data/auto.cnf),是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。GTID在一组复制中,全局唯一。 下面是一个GTID的具体形式 :
该模式需要MySQL>=5.6版本。
mysql> show master status; +-----------+----------+--------------+------------------+-------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------+----------+--------------+------------------+-------------------------------------------+ | on.000003 | 187 | | | 7286f791-125d-11e9-9a9c-0050568843f8:1-362| +-----------+----------+--------------+------------------+-------------------------------------------+ 1 row in set (0.00 sec) GTID:7286f791-125d-11e9-9a9c-0050568843f8:1-362 UUID:7286f791-125d-11e9-9a9c-0050568843f8 transactionId:1-362 在整个复制架构中GTID 是不变化的,即使在多个连环主从中也不会变。 例如:ServerA --->ServerB ---->ServerC GTID从在ServerA ,ServerB,ServerC 中都是一样的。
二、GTID组成部分
GTID = server-id + transaction-id组成。server-id不是MySQL配置文件中id,而是每一个MySQL服务在启动时,都会生成一个全局随机唯一的ID。transaction-id则是事务的ID,创建事务是会自动生成一个ID。
三、GTID配置流程
1.master的配置
server_id = 1 log_bin = ON binlog_format = ROW gtid_mode = ON enforce_gtid_consistency = ON
2.slave的配置
server_id = 2 log_bin = mysql-bin binlog_format = ROW gtid_mode = ON enforce_gtid_consistency = ON log_slave_updates = ON
3.服务重启
配置好之后,一定记得重启master和salve服务。重启好之后,登录master,使用show master status;查看一下GTID。会看到如下的信息。
mysql root@127.0.0.1:(none)> show master status; +-----------+----------+--------------+------------------+------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------+----------+--------------+------------------+------------------------------------------+ | ON.000005 | 729 | | | a9cf78c4-257f-11eb-94e0-0242ac120007:1-2 | +-----------+----------+--------------+------------------+------------------------------------------+ 1 row in set Time: 0.011s
4.关系建立
slave服务建立连接关系。下面的操作都是在slave节点进行。
# 重置所有的复制关系。 mysql root@127.0.0.1:(none)> reset slave all; Query OK, 0 rows affected Time: 0.056s # 查看主从复制状态,发现没有任何信息了,则表示重置成功了。 mysql root@127.0.0.1:(none)> show slave status\G; 0 rows in set Time: 0.005s # 设置master信息。 change master to master_host='192.168.0.112',master_port=3304,master_user='slave_user',master_password='123456',master_auto_position=1; Query OK, 0 rows affected Time: 0.048s # 启动复制。 start slave; mysql root@127.0.0.1:(none)> start slave; Query OK, 0 rows affected Time: 0.007s # 查看复制状态。 mysql root@127.0.0.1:(none)> stop slave io_thread; ***************************[ 1. row ]*************************** Slave_IO_State | Waiting for master to send event Master_Host | 192.168.0.112 Master_User | slave_user Master_Port | 3304 Connect_Retry | 60 Master_Log_File | ON.000005 Read_Master_Log_Pos | 729 Relay_Log_File | aa7863c59748-relay-bin.000002 Relay_Log_Pos | 928 Relay_Master_Log_File | ON.000005 Slave_IO_Running | Yes Slave_SQL_Running | Yes Replicate_Do_DB | ..........
需要测试结果,可以直接在master插入数据,看slave数据是否已经发生变化。