雙主模式下兩節點互為主從,均可讀寫。核心挑戰:自增主鍵衝突、循環複製、衝突解決。生產環境極力建議單寫入點 (VIP/Proxy 路由所有寫入到一節點),另一節點作熱備,僅讀取流量分攤;若必須雙寫,需應用層保證業務邏輯無衝突 (如分片路由)。
| 參數 | Node A (192.168.1.134) | Node B (192.168.1.138) | 作用 |
|---|---|---|---|
| server-id | 1 | 2 | 全域唯一 |
| auto_increment_offset | 1 | 2 | 自增起始值錯開 |
| auto_increment_increment | 2 | 2 | 自增步長 = 節點數 |
| log-slave-updates | ON | ON | 將 Relay Log 重寫入 Binlog,形成閉環 |
| sync_binlog | 1 | 1 | 事務提交即刷盤,保證不丟失 |
| replicate-do-db | business_db | business_db | 只同步業務庫 |
| replicate-ignore-db | mysql,sys,... | mysql,sys,... | 忽略系統庫 |
my.cnf (參考上表),重啟 MySQL。CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'Passw0rd!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';CHANGE MASTER TO MASTER_HOST='192.168.1.138', MASTER_USER='repl', MASTER_PASSWORD='Passw0rd!', MASTER_AUTO_POSITION=1;
START SLAVE;CHANGE MASTER TO MASTER_HOST='192.168.1.134', MASTER_USER='repl', MASTER_PASSWORD='Passw0rd!', MASTER_AUTO_POSITION=1;
START SLAVE;SHOW SLAVE STATUS\G 確認 Slave_IO_Running=Yes, Slave_SQL_Running=Yes。| 風險 | 影響 | 緩解方案 |
|---|---|---|
| 雙寫唯一鍵衝突 | SQL 線程報錯停止同步 | 應用層分片路由;或改用單寫入點 (MHA/Orchestrator/ProxySQL 自動切換) |
| 循環複製無限增長 | Binlog 膨脹、效能下降 | log-slave-updates=ON + gtid-mode=ON 自動去重;監控 Binlog 大小 |
| 分裂腦 | 網路分區導致雙主各自接受寫入 | 引入仲裁機制 (MHA/VIP/Keepalived) 確保單活躍主 |
| DDL 鎖衝突 | 雙邊同時 DDL 導致死鎖/停頓 | 統一由單節點執行 DDL,或用 pt-online-schema-change |
Seconds_Behind_Master 雙向監控,設定告警閾值 (如 > 30s)。SHOW MASTER STATUS Binlog 位點/GTID 推進速度。Last_IO_Error、Last_SQL_Error 即時告警。SHOW TABLE STATUS LIKE 't'\G 觀察 Auto_increment 接近上限預警。雙主架構複雜度高、風險大,**強烈建議生產採用「一主一從 + 自動故障切換 (MHA/Orchestrator/ProxySQL/Galera Cluster)」**。僅在雙活資料中心、極低寫入衝突業務、且團隊具備深度運維能力時考慮雙主。