雙主同步(Circular Replication)讓兩個節點互為主從,實現讀寫分離與高可用。本文基於 MySQL 5.6.27 實戰記錄完整搭建流程、關鍵參數解析與驗證方法。
| 角色 | IP | Server ID | Auto Increment Offset |
|---|---|---|---|
| Master1 | 10.8.1.11 | 1 | 1 |
| Master2 | 10.8.1.12 | 2 | 2 |
核心設計:auto_increment_increment=2 配合 offset=1/2,確保雙節點自增 ID 互不衝突(奇/偶數分離)。
# ========== 兩節點通用關鍵配置 ==========
[mysqld]
server-id = 1/2 # 必須唯一
datadir = /var/lib/mysql
log_bin = /var/lib/mysql/bin-log # 啟用 Binlog
binlog_format = MIXED # 混合模式,兼顧效能與一致性
sync_binlog = 1 # 每次提交刷盤,極大降低資料丟失風險
log_slave_updates = ON # 從庫收到的變更寫入自身 Binlog,支撐鏈式同步
slave_net_timeout = 60 # 縮短心跳檢測,防「雙 YES 假象」
slave_skip_errors = all # ⚠️ 生產環境慎用!僅演示用,會掩蓋數據不一致
skip_name_resolve = ON # 禁用 DNS 反解,加速連接
auto_increment_increment = 2
auto_increment_offset = 1/2 # Master1=1, Master2=2
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
紅色標註參數:sync_binlog=1 + log_slave_updates 是雙主「零丟失」的基石;slave_net_timeout=60 解決默認 1 小時心跳導致的故障感知延遲。
my.cnf,重啟驗證 log_bin=ON、server_id=1。GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY 'StrongPass#2024'; FLUSH PRIVILEGES;FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 記錄 File=mysql-bin.000001, Pos=26314。mysqldump -uroot -p -A -B > /tmp/master1_full.sql(驗證檔案大小)。UNLOCK TABLES;。my.cnf(server_id=2、auto_increment_offset=2),重啟驗證。mysql -uroot -p < /tmp/master1_full.sql。SHOW MASTER STATUS; 得到 File=mysql-bin.000003, Pos=2328055(供 Master1 反向同步用)。Master2 → 同步 Master1(正向)
CHANGE MASTER TO
MASTER_HOST='10.8.1.11', MASTER_PORT=3306,
MASTER_USER='replication', MASTER_PASSWORD='StrongPass#2024',
MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=26314,
MASTER_CONNECT_RETRY=10;
START SLAVE;
SHOW SLAVE STATUS\G;
# 驗證:Slave_IO_Running=Yes, Slave_SQL_Running=Yes, Seconds_Behind_Master=0
Master1 → 同步 Master2(反向)
CHANGE MASTER TO
MASTER_HOST='10.8.1.12', MASTER_PORT=3306,
MASTER_USER='replication', MASTER_PASSWORD='StrongPass#2024',
MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2328055,
MASTER_CONNECT_RETRY=10;
START SLAVE;
SHOW SLAVE STATUS\G;
# 驗證雙向同步狀態均為 Yes
Master1: CREATE DATABASE test01; Master2: CREATE DATABASE test02;SHOW DATABASES; 均顯示 test01、test02 → 雙主同步生效。| 風險點 | 對策 |
|---|---|
slave_skip_errors=all 掩蓋數據不一致 | **生產嚴禁**!改用 pt-table-checksum 定期校驗 + pt-table-sync 修復 |
| 雙寫導致業務邏輯衝突(如唯一鍵、外鍵) | 應用層路由:寫入固定節點,或引入 Proxy(ProxySQL/MaxScale)做讀寫分離 |
| 網絡分區導致「雙主雙寫」腦裂 | 部署 Orchestrator/MHA 自動故障切換,配合 sync_binlog=1、半同步復制(rpl_semi_sync_master=ON) |
| DDL 鎖表阻塞同步 | 使用 pt-online-schema-change 在線變更,避免長鎖表 |
| Binlog 磁盤佔用失控 | 設置 expire_logs_days=7、max_binlog_size=1G,定期清理 |
MySQL 5.7.17+ 引入 **Group Replication (MGR)**,基於 Paxos 協議實現強一致性多主,原生支持自動故障切換、多主寫入衝突檢測,**強烈建議新架構直接採用 MGR 或 InnoDB Cluster**,傳統雙主僅作為歷史系統維護或簡單雙活場景過渡方案。
雙主同步搭建核心在於:唯一 Server ID、自增 ID 錯開、Binlog 全鏈路持久化(sync_binlog=1 + log_slave_updates)、靈敏心跳檢測、雙向 CHANGE MASTER 精確定位。生產落地必須拒絕 slave_skip_errors,建立「監控告警 → 校驗修復 → 自動切換」閉環,並規劃向 MGR 平滑遷移路徑。