| 架構 | 寫入節點 | 同步方向 | 衝突風險 | 典型場景 |
|---|---|---|---|---|
| 主從 | 單主 | 單向 | 無 | 讀寫分離、備庫 |
| 雙主(雙向復制) | 雙主均可寫 | 雙向 | 高(自增衝突、唯一鍵衝突) | 跨機房高可用、就近寫入 |
| 組復制/InnoDB Cluster | 多主 | 多向(Paxos) | 低(內建衝突檢測) | 金融級強一致 |
server-id 全局唯一(如 10、20)。log_bin=mysql-bin、binlog_format=ROW。REPLICATION SLAVE。# 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
# 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
-- 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: (空)
# 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...
Last_SQL_Error 出現 Duplicate entry 立即告警。pt-table-checksum + pt-table-sync。MySQL 雙向復制通過**雙向 CHANGE MASTER TO** 實現雙主互為主從。**核心難點在衝突預防**,必須配合自增錯開、業務路由、唯一約束、監控告警四重保障。對於強一致性要求極高的場景,建議直接升級至 MySQL 8.0 Group Replication 或 InnoDB Cluster。