萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 雙主同步部署實戰:三種配置方式、GTID 模式、避坑指南與監控

本文為 MySQL 雙主同步(Master-Master)部署完整指南,涵蓋三種配置方式、GTID 模式最佳實踐、auto_increment 交錯避免主鍵衝突、啟動驗證、常見衝突處理、監控告警與故障切換 SOP,可直接用於生產環境。

一、架構與前置條件

Server A (192.168.1.1)  ←→  Server B (192.168.1.2)
   Master & Slave              Master & Slave

前置條件:
- MySQL 版本一致 (建議 5.7+/8.0)
- 網路互通 3306
- server-id 唯一 (A=1, B=2)
- 啟用 binlog (ROW 格式)
- 專用同步賬號 (REPLICATION SLAVE)
- 同步前數據一致 (全量備份恢復)

二、方式一:配置文件靜態配置(舊版參考,不推薦生產)

MySQL 5.6+ 棄用 master-host 等參數,僅作歷史了解。

三、方式二:動態 CHANGE MASTER TO(標準方式)

1. 兩側建立同步賬號

-- Server A
CREATE USER 'repl'@'192.168.1.2' IDENTIFIED BY 'ReplPass#2024';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.2';
FLUSH PRIVILEGES;

-- Server B
CREATE USER 'repl'@'192.168.1.1' IDENTIFIED BY 'ReplPass#2024';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.1';
FLUSH PRIVILEGES;

2. 配置文件核心參數(雙側同樣)

[mysqld]
server-id = 1  # A=1, B=2
log-bin = mysql-bin
binlog-format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
log-slave-updates = 1
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
auto_increment_increment = 2
auto_increment_offset = 1  # A=1, B=2
relay-log = relay-bin
# replicate-do-db = business_db  # 建議全庫同步,用 ignore 過濾系統庫
replicate-wild-ignore-table = mysql.%,sys.%,performance_schema.%,information_schema.%

3. 重啟 MySQL 使配置生效

4. 獲取同步座標(非 GTID 模式需要)

SHOW MASTER STATUS;
-- 記錄 File、Position

5. 建立雙向同步

-- Server A (從 B 同步)
CHANGE MASTER TO
  MASTER_HOST='192.168.1.2',
  MASTER_USER='repl',
  MASTER_PASSWORD='ReplPass#2024',
  MASTER_AUTO_POSITION=1;  -- GTID 模式

-- Server B (從 A 同步)
CHANGE MASTER TO
  MASTER_HOST='192.168.1.1',
  MASTER_USER='repl',
  MASTER_PASSWORD='ReplPass#2024',
  MASTER_AUTO_POSITION=1;

6. 啟動並驗證

START SLAVE;
SHOW SLAVE STATUS\G

-- 關鍵指標
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Retrieved_Gtid_Set / Executed_Gtid_Set  # GTID 模式下對比

四、方式三:GTID 模式最佳實踐(MySQL 5.6+ 推薦)

開啟 gtid_mode=ON、enforce_gtid_consistency=ON 後,CHANGE MASTER TO ... MASTER_AUTO_POSITION=1 即可,**無需手動管理 File/Position**,故障切換、新增從庫極其簡單。

五、關鍵避坑指南

  1. 主鍵衝突: 必須 auto_increment_increment=2 + offset=1/2,或用 UUID/雪花 ID。
  2. 雙寫衝突: **極力避免** 兩側同時寫入同一表同一行。業務層路由(按用戶 ID 奇偶)、或採用「一寫一備」架構(單主雙從 + Orchestrator/MHA 自動切換)。
  3. binlog-do-db/replicate-do-db 陷阱: 跨庫操作、觸發器、預存程序會導致同步遺漏。**全庫同步 + replicate-wild-ignore-table=mysql.%,sys.% 過濾系統庫**。
  4. slave-skip-errors 禁用: 生產環境**嚴禁**設定,會掩蓋數據不一致。
  5. 大事務/長事務: 導致同步延遲暴增,拆分小事務、避免長鎖表。
  6. 網路抖動: MASTER_CONNECT_RETRY=60、MASTER_RETRY_COUNT=86400(一天)。

六、監控告警體系

# 核心指標 (納入 Prometheus/Grafana)
Seconds_Behind_Master > 300  -- 告警
Slave_IO_Running != Yes      -- 嚴重告警
Slave_SQL_Running != Yes     -- 嚴重告警
Relay_Log_Space > 10GB       -- 磁碟告警
Executed_Gtid_Set 落後 Retrieved_Gtid_Set  -- GTID 模式延遲

七、故障切換與災難恢復 SOP

  1. 單點故障: 一側掛掉 → 另側繼續服務 → 故障側修復後 START SLAVE 自動追趕 (GTID)。
  2. 數據衝突: 停止雙向同步 → 人工合併/以權威側為準 → 重新基線 (全量備份 + CHANGE MASTER TO)。
  3. Binlog 丟失/損壞: 從健康側重新基線建立同步。

八、總結

MySQL 雙主同步生產級部署 = **GTID + ROW + 雙1安全 + auto_increment 交錯 + log-slave-updates + 全庫同步忽略系統表 + 動態 CHANGE MASTER TO + 完整監控告警 + 定期切換演練**。**純雙主雙寫風險極高,強烈建議「一寫一備」+ 自動故障切換工具 (MHA/Orchestrator/ProxySQL)。**

copyright © 萬盛學電腦網 all rights reserved