记录一下:MySQL 主从复制与 GTID 模式详解

发表于
3

引言

MySQL 主从复制是构建高可用系统的基础。传统的基于文件位置(File-Position)的复制模式在故障转移时容易出现数据不一致问题,而 GTID(Global Transaction ID)模式提供了更安全的复制机制。本文详细阐述 GTID 模式的工作原理与实际应用。

GTID 与传统复制对比

文件位置模式的问题:

  • 主库故障转移时,难以确定从库同步到哪个位置

  • 多从库转移时容易产生数据分歧

  • 需要手动计算 binlog 偏移量

GTID 模式的优势:

  • 全局唯一事务 ID,自动跟踪所有已执行的事务

  • 故障转移时无需手动指定位置,从库自动找到正确的断点

  • 支持多源复制与故障自动转移(结合 Sentinel)

GTID 的核心概念

GTID 格式: server-uuid:transaction-id

例如: 3E11FA47-71CA-11E1-9E33-C80AA9429562:23

  • server-uuid: 服务器全局唯一标识(第一次启动自动生成,存储在 auto.cnf)

  • transaction-id: 该服务器上执行的事务序列号,从 1 开始递增

GTID 集合: 表示已执行的所有 GTID

例如: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-10,3E11FA47-71CA-11E1-9E33-C80AA9429563:1-5

实战配置

主库配置 (my.cnf):

[mysqld]
server-id = 1
gtid-mode = ON
enforce-gtid-consistency = ON
log-bin = mysql-bin
binlog-format = ROW

从库配置 (my.cnf):

[mysqld]
server-id = 2
gtid-mode = ON
enforce-gtid-consistency = ON
relay-log = mysql-relay-bin
skip-slave-start = ON

建立复制关系 (从库执行):

CHANGE MASTER TO
  MASTER_HOST = '192.168.1.10',
  MASTER_USER = 'repl_user',
  MASTER_PASSWORD = 'password',
  MASTER_AUTO_POSITION = 1;

START SLAVE;
SHOW SLAVE STATUS\G

常见问题排查

1. 从库延迟过高

  • 检查从库的 Seconds_Behind_Master

  • 考虑在从库启用并行复制: slave-parallel-workers = 4

  • 优化从库硬件(特别是磁盘 IO)

2. 复制中断

  • 查看 Last_Error 字段

  • 常见原因:表结构差异、主键冲突、存储空间不足

  • 通过 SHOW SLAVE STATUS 获取详细错误信息

3. GTID 不一致

  • 执行 RESET MASTER; RESET SLAVE ALL; 后重新初始化

  • 使用 mysqldump 进行逻辑备份,确保主从数据一致

总结

GTID 模式大幅简化了 MySQL 主从复制的管理,特别是在故障转移和多源复制场景。建议生产环境优先采用 GTID 模式,并配合 Sentinel 实现自动故障转移。


上一篇 记录一下:从零搭建Kubernetes集群踩坑记录