萬盛學電腦網

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

MySQL 雙主同步(Master-Master)異步備份完整部署指南

MySQL 雙主同步(Master-Master Replication)讓兩台服務器互為主從,實現寫入分流、高可用與異地災備。本文提供三種配置方法、完整參數模板、啟動驗證步驟、跳號問題解決、故障切換與監控建議,可直接用於生產環境部署。

一、架構拓撲與前置條件

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

要求:
- MySQL 版本一致(或 Slave 版本 ≥ Master)
- 網路互通 3306 端口
- server-id 唯一(A=1, B=2)
- 啟用 binlog (ROW 格式)
- 專用同步賬號,授予 REPLICATION SLAVE 權限

二、方法一:配置文件靜態配置(傳統方式,MySQL 5.6+ 棄用 master-host 等參數)

⚠️ **注意**:MySQL 5.6+ 已棄用配置文件中的 master-host、master-user 等參數,**強烈建議使用方法二(CHANGE MASTER TO 動態配置)**。此處僅作歷史參考。

Server A (my.cnf)

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = test_db
binlog-ignore-db = mysql
relay-log = relay-bin
log-slave-updates = 1
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
gtid_mode = ON
enforce_gtid_consistency = ON
auto_increment_increment = 2
auto_increment_offset = 1

Server B (my.cnf)

[mysqld]
server-id = 2
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = test_db
binlog-ignore-db = mysql
relay-log = relay-bin
log-slave-updates = 1
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
gtid_mode = ON
enforce_gtid_consistency = ON
auto_increment_increment = 2
auto_increment_offset = 2

關鍵參數解析:

  • auto_increment_increment=2, offset=1/2:雙主寫入時 ID 交錯(A 產生奇數,B 產生偶數),**避免主鍵衝突**。
  • log-slave-updates=1:從庫執行的 Relay Log 事件寫入自己的 Binlog,支援鏈式/環狀複制。
  • sync_binlog=1 + innodb_flush_log_at_trx_commit=1:雙 1 配置,最高數據安全性。
  • GTID 模式:MySQL 5.6+ 推薦,簡化故障切換與同步座標管理。

三、方法二:動態配置 CHANGE MASTER TO(推薦,支援 GTID)

1. 兩側建立同步賬號

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

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

2. 獲取初始同步座標(GTID 模式無需手動座標)

-- 非 GTID 模式需記錄
SHOW MASTER STATUS;
-- 記錄 File、Position

3. 配置雙向同步

-- Server A 配置從 B 同步
CHANGE MASTER TO
  MASTER_HOST='192.168.1.2',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='StrongPass#2024',
  MASTER_AUTO_POSITION=1;  -- GTID 模式自動定位

-- Server B 配置從 A 同步
CHANGE MASTER TO
  MASTER_HOST='192.168.1.1',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='StrongPass#2024',
  MASTER_AUTO_POSITION=1;

4. 啟動同步並驗證

-- 兩側執行
START SLAVE;
SHOW SLAVE STATUS\G

-- 關鍵指標均為 Yes 表示成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

四、方法三:GTID 型雙主同步(MySQL 5.6+ 標準,最簡潔)

開啟 GTID 後,無需手動管理 File/Position,MASTER_AUTO_POSITION=1 自動同步。配置同方法二,確保兩側 gtid_mode=ON、enforce_gtid_consistency=ON。

五、關鍵避坑指南

  1. 主鍵衝突: 必須設定 auto_increment_increment=2 + offset=1/2,或使用 UUID/雪花算法主鍵。
  2. 寫入衝突: 雙主**不建議同時寫入同一表同一行**,業務層面路由寫入(如按用戶 ID 奇偶分流),或採用「一寫一備」(單主雙從)架構。
  3. binlog-do-db / replicate-do-db **慎用**:跨庫查詢、預存程序、觸發器可能導致同步遺漏。**建議全庫同步,用 `replicate-wild-ignore-table=mysql.%,sys.%` 忽略系統庫。**
  4. 跳過錯誤: slave-skip-errors=1062,1032 僅限極特殊場景,**常規生產嚴禁**,會導致數據不一致悄悄擴大。
  5. 網路抖動: 設定 MASTER_CONNECT_RETRY=60、MASTER_RETRY_COUNT=86400(一天重試)。

六、監控與告警

-- 關鍵監控指標
SHOW SLAVE STATUS\G
-- Seconds_Behind_Master > 300 → 告警
-- Slave_IO_Running != Yes 或 Slave_SQL_Running != Yes → 嚴重告警
-- Relay_Log_Space > 1GB → 磁碟空間告警

-- 監控 SQL(納入 Prometheus/Grafana)
SELECT 
  VARIABLE_VALUE AS seconds_behind_master
FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Seconds_Behind_Master';

七、故障切換與災難恢復

  1. 單點故障: 一側掛掉,另側繼續服務。恢復時重啟 Slave 即可自動追趕(GTID 模式)。
  2. 數據衝突: 停止雙向同步,人工合併數據,重新建立同步。
  3. Binlog 損壞/丟失: 從另一側重新基線(全量備份 + CHANGE MASTER TO)。

八、總結

MySQL 雙主同步核心配置:**GTID + ROW 格式 + auto_increment 交錯 + log-slave-updates + 雙 1 安全配置**。動態 CHANGE MASTER TO 替代靜態配置文件。生產環境**強烈建議「一寫一備」或引入中間件**,純雙主雙寫極易引發衝突。部署完成後,**必須建立監控告警、定期演練故障切換、驗證數據一致性**。

copyright © 萬盛學電腦網 all rights reserved