雙機熱備份(Master-Master Replication)讓兩台 MySQL 伺服器互為主從,雙向同步資料,提供寫入負載分散與單點故障自動切換能力。關鍵在於避免自增 ID 衝突與處理衝突解決機制。
auto_increment_offset = 1, auto_increment_increment = 2auto_increment_offset = 2, auto_increment_increment = 2log_bin, log_slave_updates, gtid_mode=ON(MySQL 5.6+)[mysqld]
server-id=1 # Server B 設為 2
log-bin=mysql-bin
binlog-format=ROW
gtid_mode=ON
enforce-gtid-consistency=ON
log-slave-updates=ON
auto-increment-increment=2
auto-increment-offset=1 # Server B 設為 2
relay-log=relay-bin
read-only=0 # 正常雙寫設 0,故障切換時可動態調整
CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
CHANGE MASTER TO
MASTER_HOST='server_b_ip',
MASTER_USER='repl',
MASTER_PASSWORD='strong_password',
MASTER_AUTO_POSITION=1; -- 使用 GTID
START SLAVE;
| 問題 | 對策 |
|---|---|
| 雙寫衝突 (同一 PK 同時寫入) | 應用層路由寫入單一主庫;或使用應用級鎖、樂觀鎖 |
| 自增 ID 衝突 | 正確設定 offset/increment;改用 UUID 或 Snowflake ID |
| 複寫延遲導致讀取舊資料 | 關鍵查詢強制走主庫;使用半同步複寫 (rpl_semi_sync) |
| Split-brain 雙主同時掛掉 | 引入第三方仲裁節點 (如 Consul、etcd) 或僅允許單寫模式 |
Seconds_Behind_Master = 0 表示同步正常Slave_IO_Running / Slave_SQL_Running 均為 YesSHOW MASTER STATUS 與 SHOW SLAVE STATUS 的 Executed_Gtid_Set 比對MySQL 雙機熱備份能有效提升寫入可用性,但需妥善規劃 ID 分配、衝突處理與故障切換流程。建議搭配 MHA/Orchestrator 實現自動化運維,並定期演練故障切換演練。