MySQL Replication 是讀寫分離、災備、多活架構的基石。本文基於 **GTID 模式 (Global Transaction Identifier)** 給出生產級 **單向主從、雙主 (Master-Master)、延遲從庫** 搭建全流程,涵蓋配置模板、權限最小化、備份建立、同步驗證、監控指標、故障切換 SOP,拒絕舊式 File/Position 模式痛點。
| 模式 | 定位方式 | 痛點 | GTID 優勢 |
|---|---|---|---|
| File/Position (傳統) | MASTER_LOG_FILE + MASTER_LOG_POS |
從庫重搭需精確位點、多級復制易斷、故障切換需手動計算位點 | 全局唯一事務 ID,**自動定位**、支援多源復制、故障切換零位點運維 |
| GTID (5.6+ 推薦) | GTID_SET (UUID:1-100) |
需 5.6+、主從版本一致性要求高 | **生產標準**,簡化運維 90% |
[mysqld]
# === 基礎 ===
server-id = 10 # 集群唯一,建議 IP 末段擴展
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
# === 復制相關 ===
log_slave_updates = ON # 關鍵:鏈式復制/雙主必開
binlog_rows_query_log_events = ON # ROW 格式記錄原 SQL
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON # 從庫崩潰自動修復 Relay Log
# === 安全/效能 ===
max_connections = 2000
skip-name-resolve = 1 # 禁用 DNS 反解,加速連接
[mysqld]
server-id = 20
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = /var/log/mysql/mysql-bin # 從庫也開 Binlog (支援級聯/升主)
log_slave_updates = ON
binlog_format = ROW
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
relay_log = /var/log/mysql/relay-bin
relay_log_recovery = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
read_only = ON # 關鍵:防止誤寫入
super_read_only = ON # 8.0+ 僅 super 權限可寫
skip-name-resolve = 1
mysql> CREATE USER 'repl_user'@'10.0.1.%' IDENTIFIED BY 'StrongReplPass@123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'10.0.1.%';
mysql> FLUSH PRIVILEGES;
# 熱備份 (推薦 xtrabackup)
xtrabackup --backup --target-dir=/backup/full_$(date +%F) \
--user=root --password='***' --host=10.0.1.10 \
--slave-info --safe-slave-backup
# 或邏輯備份 (小數據量)
mysqldump --single-transaction --master-data=2 --flush-logs \
--all-databases --routines --triggers --events \
--set-gtid-purged=ON \
-u root -p > /backup/full_$(date +%F).sql
✅ 關鍵:--master-data=2 將 `CHANGE MASTER TO` 註釋寫入文件;--set-gtid-purged=ON 導出 GTID 集合。
# 邏輯備份恢復
mysql -u root -p < /backup/full_20240115.sql
# 物理備份恢復 (xtrabackup)
xtrabackup --prepare --target-dir=/backup/full_20240115
systemctl stop mysqld
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/full_20240115
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
mysql> CHANGE MASTER TO
MASTER_HOST = '10.0.1.10',
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'StrongReplPass@123',
MASTER_PORT = 3306,
MASTER_AUTO_POSITION = 1; -- 核心:啟用 GTID 自動定位,無需 File/Position
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Retrieved_Gtid_Set: xxxxxxxx:1-100
Executed_Gtid_Set: xxxxxxxx:1-100
-- 兩個 GTID_SET 一致且 Running=Yes 即同步正常
適用於**同城雙活、跨 AZ 熱備**,雙向寫入需業務層保證無主鍵衝突 (自增步長/偏移量)。
# Node A (10.0.1.10)
auto_increment_increment = 2
auto_increment_offset = 1
# Node B (10.0.1.20)
auto_increment_increment = 2
auto_increment_offset = 2
# 互為主從
# Node A 上
CHANGE MASTER TO MASTER_HOST='10.0.1.20', MASTER_AUTO_POSITION=1 ...; START SLAVE;
# Node B 上
CHANGE MASTER TO MASTER_HOST='10.0.1.10', MASTER_AUTO_POSITION=1 ...; START SLAVE;
| 指標 | 告警閾值 | 採集方式 |
|---|---|---|
| Slave_IO_Running / Slave_SQL_Running | != Yes | Exporter / Shell 腳本 |
| Seconds_Behind_Master | > 300 秒 (5 分鐘) | SHOW SLAVE STATUS |
| Relay_Log_Space | > 10GB | SHOW SLAVE STATUS |
| GTID 差集 (Executed - Retrieved) | 非空集合 | 自定義 SQL 對比 |
| 主庫 Binlog 磁盤佔用 | > 磁盤 70% | Node Exporter |
| 從庫 Relay Log 磁盤佔用 | > 磁盤 70% | Node Exporter |
# 1. 確認主庫不可用 (網絡/進程/硬件)
# 2. 選定最新從庫 (Seconds_Behind_Master=0, GTID 集合最全)
# 3. 升主操作
mysql> STOP SLAVE;
mysql> RESET SLAVE ALL; -- 清除從庫元數據 (8.0+)
# 或 5.7: RESET SLAVE;
mysql> SET GLOBAL read_only = OFF;
mysql> SET GLOBAL super_read_only = OFF;
# 4. 應用層切換寫入地址 (VIP 浮動 / DNS 修改 / ProxySQL 後端切換)
# 5. 原主庫恢復後,作為新從庫掛載
# 重新 CHANGE MASTER TO 新主庫 ... MASTER_AUTO_POSITION=1; START SLAVE;
# 工具化切換 (推薦)
# Orchestrator / MHA / ProxySQL 自動故障轉移,秒級切換,零人工干預
MySQL 主從搭建鐵律:
1. **GTID 模式 + ROW 格式 + MASTER_AUTO_POSITION=1**,簡化 90% 運維。
2. **從庫 read_only=ON + super_read_only=ON**,防誤寫。
3. **備份恢復用 xtrabackup**,大數據量唯一選擇。
4. **監控核心:IO/SQL Running、Seconds_Behind_Master、GTID 一致性**。
5. **故障切換工具化 (Orchestrator/MHA)**,拒絕手動切換。
建立「搭建 → 驗證 → 監控 → 演練 → 切換」完整生命週期管理體系,才是高可用架構的正確打開方式。