首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 雙向復制(雙主)搭建完整指南:從主從到雙主遷移實戰

     編輯:MySQL 資料庫相關知識

架構對比

架構寫入節點同步方向衝突風險典型場景
主從單主單向無讀寫分離、備庫
雙主(雙向復制)雙主均可寫雙向高(自增衝突、唯一鍵衝突)跨機房高可用、就近寫入
組復制/InnoDB Cluster多主多向(Paxos)低(內建衝突檢測)金融級強一致

雙主搭建前置條件

  • 兩節點版本一致(建議 5.7+ / 8.0)。
  • server-id 全局唯一(如 10、20)。
  • 開啟 Binlog:log_bin=mysql-bin、binlog_format=ROW。
  • 網絡互通 3306,防火牆放行。
  • 同步用戶雙向授權 REPLICATION SLAVE。

步驟 1:節點 A (192.168.1.30) 作為主 → 節點 B 為從

# A 的 my.cnf [mysqld]
server-id=10
log-bin=mysql-bin
binlog_format=ROW
binlog_do_db=demo
sync_binlog=1
innodb_flush_log_at_trx_commit=1
gtid_mode=ON
enforce_gtid_consistency=ON
-- A 上創建同步用戶
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 記錄 Binlog 位置
SHOW MASTER STATUS;
-- File: mysql-bin.000015, Position: 106

步驟 2:節點 B (192.168.1.29) 配置從屬於 A

# B 的 my.cnf [mysqld]
server-id=20
log-bin=mysql-bin
binlog_format=ROW
relay_log=relay-bin
gtid_mode=ON
enforce_gtid_consistency=ON
-- B 上連接 A
CHANGE MASTER TO
  MASTER_HOST='192.168.1.30',
  MASTER_USER='repl',
  MASTER_PASSWORD='ReplPass123!',
  MASTER_LOG_FILE='mysql-bin.000015',
  MASTER_LOG_POS=106,
  MASTER_AUTO_POSITION=1;  -- GTID 模式優先

START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵:Slave_IO_Running=Yes, Slave_SQL_Running=Yes

步驟 3:反向配置——節點 B 作為主 → 節點 A 為從

-- B 創建反向同步用戶
CREATE USER 'repl_rev'@'%' IDENTIFIED BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_rev'@'%';
FLUSH PRIVILEGES;

SHOW MASTER STATUS;
-- File: mysql-bin.000013, Position: 98
-- A 連接 B
CHANGE MASTER TO
  MASTER_HOST='192.168.1.29',
  MASTER_USER='repl_rev',
  MASTER_PASSWORD='ReplPass123!',
  MASTER_LOG_FILE='mysql-bin.000013',
  MASTER_LOG_POS=98,
  MASTER_AUTO_POSITION=1;

START SLAVE;
SHOW SLAVE STATUS\G

關鍵驗證指標

SHOW SLAVE STATUS\G
-- 必須滿足:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_State: Waiting for master to send event
Seconds_Behind_Master: 0
Last_IO_Error: (空)
Last_SQL_Error: (空)

衝突預防與處理(生產必做)

  1. 自增步長錯開:
    # A: auto_increment_increment=2, auto_increment_offset=1  → 產生 1,3,5,7...
    # B: auto_increment_increment=2, auto_increment_offset=2  → 產生 2,4,6,8...
  2. 業務層路由:同一租戶/用戶固定寫入同一主,避免跨主修改同一行。
  3. 唯一約束覆蓋業務鍵:除主鍵外,業務唯一鍵(如手機號、訂單號)必須建立 UNIQUE INDEX,衝突時由應用重試或報錯。
  4. 監控衝突錯誤:Last_SQL_Error 出現 Duplicate entry 立即告警。

故障切換與運維建議

  • 引入 **MHA / Orchestrator / ProxySQL** 實現自動故障轉移與讀寫分離。
  • 定期校驗數據一致性:pt-table-checksum + pt-table-sync。
  • 備份策略:雙主各自備份,或從其中一節點掛載備份庫(避免雙主同時備份衝突)。

總結

MySQL 雙向復制通過**雙向 CHANGE MASTER TO** 實現雙主互為主從。**核心難點在衝突預防**,必須配合自增錯開、業務路由、唯一約束、監控告警四重保障。對於強一致性要求極高的場景,建議直接升級至 MySQL 8.0 Group Replication 或 InnoDB Cluster。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved