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、master-user 等參數,**強烈建議使用方法二(CHANGE MASTER TO 動態配置)**。此處僅作歷史參考。
[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
[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+ 推薦,簡化故障切換與同步座標管理。-- 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;
-- 非 GTID 模式需記錄
SHOW MASTER STATUS;
-- 記錄 File、Position
-- 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;
-- 兩側執行
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標均為 Yes 表示成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
開啟 GTID 後,無需手動管理 File/Position,MASTER_AUTO_POSITION=1 自動同步。配置同方法二,確保兩側 gtid_mode=ON、enforce_gtid_consistency=ON。
auto_increment_increment=2 + offset=1/2,或使用 UUID/雪花算法主鍵。binlog-do-db / replicate-do-db **慎用**:跨庫查詢、預存程序、觸發器可能導致同步遺漏。**建議全庫同步,用 `replicate-wild-ignore-table=mysql.%,sys.%` 忽略系統庫。**slave-skip-errors=1062,1032 僅限極特殊場景,**常規生產嚴禁**,會導致數據不一致悄悄擴大。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';
MySQL 雙主同步核心配置:**GTID + ROW 格式 + auto_increment 交錯 + log-slave-updates + 雙 1 安全配置**。動態 CHANGE MASTER TO 替代靜態配置文件。生產環境**強烈建議「一寫一備」或引入中間件**,純雙主雙寫極易引發衝突。部署完成後,**必須建立監控告警、定期演練故障切換、驗證數據一致性**。