同步方式
MySQL主从复制有两种同步方式:传统方式和GTID方式,主库和从库同步方式保持一致。
- 传统方式:从库通过获取主库的binlog信息(binlog文件名和binlog中的位置)进行复制,默认采用此方式进行复制。
图1 传统复制架构
- GTID方式:MySQL版本在5.7及以上时推荐使用GTID方式。MySQL为每个事务提供一个GTID(全局事务标识,全局唯一),GTID唯一性不限于主库,在整个主从集群环境中也是唯一的。GTID由source_id和transaction_id两部分组成(例如图2中的UUID:33、UUID:34和UUID:35)。其中source_id是产生GTID服务器的UUID,保存在DARADIR/auto.cnf文件里,transaction_id是sequence_number,是每台服务器从1开始自增的顺序号。每次事务提交后会自动生成GTID,主库在当前已执行的GTID集合(即gtid_executed)中找一个大于0的且未使用的最小值作为下个事务的GTID。 从库在relay log中读取到主库的GTID,而后执行的事务采用该GTID。
GTID的复制流程:
- 主库在事务ID前面添加GTID生成新的事务ID,然后更新数据,并把新的事务ID和数据操作记录到binlog,通过dump线程通知从库有数据更新。
- 从库通过IO线程获取主库的binlog,把binlog写入relay log。
- 从库通过SQL线程在relay log中读取GTID,然后在从库binlog中查看是否有该GTID的记录,如果有记录说明该GTID的事务已经执行,从库不执行该GTID的事务,如果没有记录从库执行该GTID的事务,并把该GTID的事务和更新操作记录到binlog。
图3 GTID复制流程

适用场景
GTID复制已经是MySQL复制使用的一种通用复制方式,GTID的优势在于自动查找断点信息进行复制,不需要人为的查找binlog和pos点,更易于维护和管理。
父主题: 原理