MySQL 雙主互備架構通過兩台服務器互為主從,實現寫入高可用與零停機維護。本文詳細記錄 Windows 環境下 MySQL 5.1 雙主熱備的完整搭建流程、核心參數解析、衝突避免策略與運維最佳實踐。
┌─────────────┐ ┌─────────────┐ │ Server A │◀──── Binlog ──────▶│ Server B │ │ 192.168.0.2│ 雙向復制通道 │ 192.168.0.3│ │ │ │ │ │ Master + │ │ Master + │ │ Slave │ │ Slave │ └─────────────┘ └─────────────┘ 關鍵特性: - 任一節點寫入,自動同步到另一節點 - 單節點故障,另一節點秒級接管寫入 - 維護窗口:停止一節點維護,另一節點無感服務 - 避免單點故障,但需解決雙主衝突問題
| 項目 | Server A | Server B |
|---|---|---|
| IP | 192.168.0.2 | 192.168.0.3 |
| MySQL 版本 | 5.1.x (必須一致) | 5.1.x |
| Server ID | 1 | 2 |
| 網絡 | 雙向 ping 通、3306 端口通 | 同上 |
# Server A (192.168.0.2) 執行 mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'192.168.0.3' IDENTIFIED BY 'ReplPass123!'; mysql> FLUSH PRIVILEGES; # Server B (192.168.0.3) 執行 mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'192.168.0.2' IDENTIFIED BY 'ReplPass123!'; mysql> FLUSH PRIVILEGES;
# Server A 測試連接 Server B C:\> mysql -h 192.168.0.3 -u replicate -pReplPass123! Welcome to the MySQL monitor... # Server B 測試連接 Server A C:\> mysql -h 192.168.0.2 -u replicate -pReplPass123! Welcome to the MySQL monitor...
[mysqld] # === 唯一標識 (必須不同) === server-id = 1 # === 二進制日志 (復制基石) === log-bin = backuplog binlog_format = ROW # ROW 格式避免非確定性函數問題 sync_binlog = 1 # 每次提交刷盤,最安全 (性能代價大) max_binlog_size = 512M expire_logs_days = 1 # === 自增ID 衝突避免 (雙主核心) === auto_increment_increment = 2 # 步長 auto_increment_offset = 1 # 起始偏移 (產生奇數: 1,3,5...) # === 復制過濾 (僅同步業務庫) === binlog_do_db = oa # 只記錄 oa 庫的 Binlog binlog_ignore_db = mysql,information_schema,performance_schema # 忽略系統庫 replicate_do_db = oa # Slave 端只復制 oa 庫 replicate_wild_ignore_table = oa.log # 忽略 oa.log 表 (日志表無需同步) # === 容錯配置 === slave_skip_errors = all # 謹慎!跳過所有錯誤 (僅適用讀擴展場景) # 生產建議: slave_skip_errors = 1062,1032 (只跳過主鍵衝突/找不到行) # === 從庫更新寫 Binlog (級聯/雙主必備) === log-slave-updates = 1
server-id = 2 auto_increment_offset = 2 # 產生偶數: 2,4,6... # 其餘參數與 Server A 完全一致
| 參數 | 作用 | 雙主關鍵性 | 推薦值 |
|---|---|---|---|
| server-id | 節點唯一標識,防止循環復制 | 核心:必須不同,Galera/PXC 也依賴此機制 | 1, 2, 3... |
| log-bin | 啟用 Binlog,記錄所有 DDL/DML | 復制前提,無 Binlog 無復制 | backuplog |
| binlog_format | ROW/STATEMENT/MIXED | ROW 避免 NOW()/UUID() 等導致數據不一致 | ROW |
| sync_binlog | 提交時刷盤頻率 | 1=最安全(零丟失),0=最快(風險自負) | 1 (核心業務) |
| auto_increment_increment | 自增步長 | 雙主避免 ID 衝突核心:步長 = 節點數 | 2 (雙主) |
| auto_increment_offset | 自增起始偏移 | 節點產生互不重疊 ID 序列 | 1, 2 (雙主) |
| log-slave-updates | Slave 執行的 SQL 寫入自身 Binlog | 雙主/級聯必開,否則另一節點收不到變更 | 1 |
| slave_skip_errors | 復制遇到錯誤是否跳過 | 雙主衝突時防止復制中斷,但可能導致數據偏移 | 1062,1032 |
# 兩台服務器分別執行 mysql> SHOW MASTER STATUS\G; # 記錄: File (如 backuplog.000001), Position (如 154)
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.0.3',
MASTER_USER='replicate',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='backuplog.000001',
MASTER_LOG_POS=0;
mysql> START SLAVE;
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.0.2',
MASTER_USER='replicate',
MASTER_PASSWORD='ReplPass123!',
MASTER_LOG_FILE='backuplog.000001',
MASTER_LOG_POS=0;
mysql> START SLAVE;
時間點 Server A (ID=1) Server B (ID=2) 1 UPDATE t SET v=10 WHERE id=1 2 (網絡延遲) 3 UPDATE t SET v=20 WHERE id=1 (用戶在 B 修改) 4 A 收到 B 的 Binlog, 執行 UPDATE t SET v=20 (覆蓋 10) 5 B 收到 A 的 Binlog, 執行 UPDATE t SET v=10 (覆蓋 20) 結果: A.v=20, B.v=10 → 數據不一致!
auto_increment_increment = 2 auto_increment_offset = 1 # A: 1,3,5... auto_increment_offset = 2 # B: 2,4,6...
# 1. 停止 Server A 寫入流量 (應用層切流到 B) # 2. 確認同步無延遲 mysql> SHOW SLAVE STATUS\G; # Seconds_Behind_Master = 0 # 3. 停止 Server A 服務 net stop mysql # 4. 維護完成後啟動 net start mysql # 5. 自動追趕同步 (無需重搭復制) # 6. 驗證同步正常後切回流量
總結
Windows MySQL 雙主熱備的核心成功要素:
- 版本一致、網絡互通、Server ID 唯一:基礎前提
- ROW 格式 + auto_increment 隔離 + log-slave-updates:核心配置三件套
- 寫入分流策略:架構層面規避衝突,優於配置層補救
- 監控告警閉環:Seconds_Behind_Master、IO/SQL Running 三大黃金指標
- 避免 slave_skip_errors=all:生產環境僅跳過 1062/1032,防止數據偏移不可控
雙主熱備不是銀彈,但配合「業務分流 + 自增隔離 + 外部故障轉移工具」,能構建極具性價比的寫入高可用架構。Windows 環境下部署簡單、運維熟悉,是中小規模核心業務的優選方案。