MySQL集群部署(基于GTID方式)

GTID概念

GTID 是什么

GTID 指的是全局事务 ID,全程是 Global Transaction Identifier ,在整个事务流程中每一个事务 ID 是全局唯一的,且在整个主从复制架构中该 ID 都不会相同。

GTID 主从复制方式

基于 GTID 的主从复制方式的出现,主要是用于替换传统的日志点 复制方式。通过GTID 可以保证每个主库提交的事务在集群中都有 唯一 的一个事务 ID。强化了数据库主从的一致性和故障恢复数据的容错能力,在主库 宕机发生主从切换 的情况下,GTID 方式可以让其他从库自动找到新主库复制的位置。而且 GTID 可以忽略已经执行过的事务,减少了数据发生错误的概率。

GTID 的组成

GTID 由server_uuid +tid 组成,其中:

  • server_uuid: server_uuid 是在 Mysql 首次启动过程中自动生成的一个uuid(128位) 随机值,生成后会将该值存储到数据目录的auto.cnf 中。因为是随机值,所以不同服务器的 Mysql 的server_uuid 都是不相同的。
  • tid: 代表了该实例上已经提交的事务数量,是一个整数,初始值是 1 ,每次提交事务的时候分配给这个事务并加1 。

其组成样式如下:

fb90fba5-60cf-11eb-b5fa-000c295fbc5f:21

GTID 复制工作原理

假设从库开启了 binlog,那么执行流程如下:

  • ① 主节点执行事务提交前会产生一个 GTID ,其会随着事务一起记录到 binlog 日志中。
  • ② 从节点 I/O Thread 会读取主节点的 binlog 日志文件并存储在从节点的 relaylog 日志中。从节点将主节点的 GTID 这个值配置到 gtid_next 中,即下一个要读取的 GTID 值。
  • ③ 从节点读取 gtid_next 中的值,然后查找自己的 binlog 日志中是否有这个 GTID 。
  • ④ 如果有这个记录,说明这个 GTID 的事务已经执行过了,就忽略掉。
  • ⑤ 如果没有这个记录,从节点就会执行该 GTID 事务,并记录到自己的 binlog 日志中。在读取执行事务前会先检查其他session 中是否持有该 GTID ,确保不被重复执行。
  • ⑥ 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

你可能感兴趣的:(mysql,集群部署,主从复制)