GTID (Global Transaction ID) 是 MySQL 5.6+ 引入的復制里程碑特性:用「事務唯一標識」替代傳統「文件+位點」,實現自動定位、故障自動切換、多線程並行復制。本文記錄基於 GTID 的生產級主從部署、參數調優、驗證、故障演練全流程。
一、GTID 核心概念
GTID = source_id:transaction_id
source_id = server_uuid (每實例唯一)
transaction_id = 該實例上執行的第 N 個事務 (從 1 遞增)
示例: 971d7245-c3f8-11e5-8b6b-000c2999e5a5:1-100
表示: server_uuid 為 971d... 的實例執行了第 1 到 100 號事務
優勢對比
| 特性 | 傳統位點 | GTID |
| 從庫定位 | 手動指定 File+Pos | MASTER_AUTO_POSITION=1 自動 |
| 故障切換 | 需計算新位點 | 新主自動計算差集 |
| 多線程復制 | 難以並行 (衝突檢測難) | slave_parallel_type=LOGICAL_CLOCK 高效並行 |
| 數據一致性 | 難以驗證 | GTID 集合直接對比 |
二、環境規劃
| 角色 | 主機名 | IP | Server ID | MySQL 版本 |
| Master | masterdb.example.com | 172.16.88.203 | 1 | 5.7.30 |
| Slave | slavedb.example.com | 172.16.88.205 | 205 | 5.7.30 |
三、Master 配置 /etc/my.cnf
[mysqld]
server-id=1
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=/data/mysqlLog/logs/mysql-bin
binlog-format=ROW
log-slave-updates=1
sync_binlog=1
innodb_flush_log_at_trx_commit=1
expire_logs_days=7
max_binlog_size=1G
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log-events=1
transaction-isolation=READ-COMMITTED
四、Slave 配置 /etc/my.cnf
[mysqld]
server-id=205
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=/data/mysqlLog/logs/mysql-bin
binlog-format=ROW
log-slave-updates=1
sync_binlog=1
innodb_flush_log_at_trx_commit=1
skip-slave-start
relay-log=relay-bin
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=4
slave-parallel-type=LOGICAL_CLOCK
relay-log-recovery=1
slave-sql-verify-checksum=1
transaction-isolation=READ-COMMITTED
read-only=1
五、部署步驟
- 雙節點分別安裝 MySQL、配置 my.cnf、啟動服務
- Master 創建復制用戶:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.88.205' IDENTIFIED BY 'StrongReplPass';
- Master 熱備份基線:
mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > full.sql
- Slave 導入基線:
mysql < full.sql
- Slave 配置 GTID 復制:
CHANGE MASTER TO MASTER_HOST='masterdb.example.com', MASTER_USER='repl', MASTER_PASSWORD='StrongReplPass', MASTER_AUTO_POSITION=1;
- 啟動復制:
START SLAVE;
六、驗證復制狀態
SHOW SLAVE STATUS\G
# 關鍵指標
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Retrieved_Gtid_Set: 971d7245-c3f8-11e5-8b6b-000c2999e5a5:1-6
Executed_Gtid_Set: 89e78301-c3f4-11e5-8b51-00505624d26a:1-3, 971d7245-c3f8-11e5-8b6b-000c2999e5a5:1-6
Auto_Position: 1
七、測試驗證
-- Master
CREATE DATABASE log_statics;
USE log_statics;
CREATE TABLE t (id INT PRIMARY KEY);
INSERT INTO t VALUES (1);
-- Slave
SHOW DATABASES LIKE 'log_statics'; -- 存在 ✅
SELECT * FROM log_statics.t; -- 返回 1 ✅
八、故障切換演練 (Master 掛掉 → Slave 升主)
- 確認 Slave 同步無延遲 (
Seconds_Behind_Master=0)
- Slave 執行:
STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only=OFF;
- 應用端修改連接地址指向新主
- 原 Master 恢復後作為新 Slave 接入:
CHANGE MASTER TO MASTER_HOST='新主IP', MASTER_AUTO_POSITION=1; START SLAVE;
九、多線程復制深度調優
# Slave 端
slave_parallel_workers=8 # CPU 核心數 1-2 倍
slave_parallel_type=LOGICAL_CLOCK # 基於組提交並行
slave_preserve_commit_order=1 # 保證提交順序一致性
slave_checkpoint_group=512 # 減少檢查點頻率
slave_checkpoint_period=2 # 秒
relay_log_recovery=ON # 崩潰安全恢復
十、監控指標體系
| 指標 | 來源 | 告警閾值 |
| Slave_IO_Running | SHOW SLAVE STATUS | ≠ Yes 立即告警 |
| Slave_SQL_Running | SHOW SLAVE STATUS | ≠ Yes 立即告警 |
| Seconds_Behind_Master | SHOW SLAVE STATUS | > 30s 警告, > 300s 嚴重 |
| Executed_Gtid_Set 差集 | 對比 Master/Slave | 非空即不一致 |
| Relay_Log_Space | SHOW SLAVE STATUS | > 10G 檢查積壓 |
| Slave_Rows_Applied | performance_schema | 突降檢查阻塞 |