| 節點 | 角色 | IP | Server ID | 同步賬號 |
|---|---|---|---|---|
| A | Master/Slave | 192.168.1.101 | 1 | yw@192.168.1.102 |
| B | Master/Slave | 192.168.1.102 | 2 | yw@192.168.1.101 |
雙向同步 = 兩組單向主從互為備份。核心難點:自增主鍵衝突、雙寫衝突、IP 變更後的重新配置。
-- Node A 執行
GRANT REPLICATION SLAVE ON *.* TO 'yw'@'192.168.1.102' IDENTIFIED BY 'ym';
FLUSH PRIVILEGES;
-- Node B 執行
GRANT REPLICATION SLAVE ON *.* TO 'yw'@'192.168.1.101' IDENTIFIED BY 'ym';
FLUSH PRIVILEGES;
net stop mysql
log-bin = mysql-bin
binlog-do-db = ikey_db
binlog-do-db = ikey_log
server-id = 1
master-host = 192.168.1.102
master-user = ym
master-password = ym
master-port = 3306
master-connect-retry = 60
replicate-do-db = ikey_db
replicate-do-db = ikey_log
log-bin = mysql-bin
binlog-do-db = ikey_db
binlog-do-db = ikey_log
server-id = 2
master-host = 192.168.1.101
master-user = ym
master-password = ym
master-port = 3306
master-connect-retry = 60
replicate-do-db = ikey_db
replicate-do-db = ikey_log
log-slave-updates:未顯式配置,但雙向同步建議顯式開啟(=1),確保從庫接收的事件寫入自身 Binlog,支持鏈式傳播auto_increment_increment/offset:文中未配置,極高風險! 雙向寫入必須設置,如 A: increment=2 offset=1,B: increment=2 offset=2net start mysql
SHOW MASTER STATUS;
+------------------+----------+------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+------------------+------------------+
| mysql-bin.000001 | 98 | ikey_db,ikey_log | |
+------------------+----------+------------------+------------------+
SHOW SLAVE STATUS\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: ym
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: ikey_db,ikey_log
-- 兩節點均執行
STOP SLAVE;
-- Node A (新 IP 103)
SHOW MASTER STATUS; -- 記錄 File, Pos (如 mysql-bin.000002, 118)
-- Node B
SHOW MASTER STATUS; -- 記錄 File, Pos (如 mysql-bin.000003, 98)
-- 刪除舊賬號
DROP USER 'ym'@'192.168.1.101';
FLUSH PRIVILEGES;
-- 創建新賬號
GRANT REPLICATION SLAVE ON *.* TO 'ym'@'192.168.1.103' IDENTIFIED BY 'ym';
FLUSH PRIVILEGES;
-- 動態修改同步源 (無需改 my.cnf 重啟)
CHANGE MASTER TO
MASTER_HOST='192.168.1.103',
MASTER_USER='ym',
MASTER_PASSWORD='ym',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=118;
-- 更新 my.cnf 持久化
master-host = 192.168.1.103
CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=98;
-- 兩節點
START SLAVE;
SHOW SLAVE STATUS\G;
-- 確認雙向均為 Yes
| 項目 | 建議配置 | 原因 |
|---|---|---|
| 自增衝突防範 | A: auto_increment_increment=2, auto_increment_offset=1 B: auto_increment_increment=2, auto_increment_offset=2 | 雙主寫入 ID 不衝突 |
| 寫入路由 | 應用層指定單一「主寫節點」,另一節點 read_only=1 | 避免雙寫衝突、死鎖 |
| Binlog 格式 | binlog_format=ROW | 語句級復制易導致不一致 |
| GTID 模式 | gtid_mode=ON, enforce_gtid_consistency=ON | 簡化故障切換、位點管理 |
| 監控告警 | 雙向 Seconds_Behind_Master、IO/SQL 線程狀態 | 及時發現同步延遲/中斷 |
Windows MySQL 雙向同步配置核心路徑:
雙向賬號 → 雙向 my.cnf (server-id/log-bin/master-host) → 啟動驗證 → IP 變更時 STOP SLAVE → 記錄位點 → 重建賬號 → CHANGE MASTER TO 動態修正 → START SLAVE。
生產環境紅線:未配置 auto_increment_increment/offset 絕不雙寫;未上 GTID/ROW 格式不上雙向。將維護操作腳本化、文檔化,納入變更管理流程。