首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Windows MySQL 雙主熱備 (Master-Master) 搭建全流程與參數深度解析

     編輯:MySQL 綜合教學

Windows MySQL 雙主熱備 (Master-Master) 搭建全流程與參數深度解析

MySQL 雙主互備架構通過兩台服務器互為主從,實現寫入高可用與零停機維護。本文詳細記錄 Windows 環境下 MySQL 5.1 雙主熱備的完整搭建流程、核心參數解析、衝突避免策略與運維最佳實踐。

架構拓撲與適用場景

┌─────────────┐                    ┌─────────────┐
│  Server A   │◀──── Binlog ──────▶│  Server B   │
│  192.168.0.2│   雙向復制通道      │  192.168.0.3│
│             │                    │             │
│ Master +    │                    │ Master +    │
│ Slave       │                    │ Slave       │
└─────────────┘                    └─────────────┘

關鍵特性:
- 任一節點寫入,自動同步到另一節點
- 單節點故障,另一節點秒級接管寫入
- 維護窗口:停止一節點維護,另一節點無感服務
- 避免單點故障,但需解決雙主衝突問題

適用場景

  • 兩地機房雙活:同城雙活、異地容災 (延遲 < 5ms)
  • 零停機維護:輪流升級、參數調整、硬件更換
  • 寫入分流:按業務/表分片寫入不同主庫 (需應用路由支持)

環境準備

項目Server AServer B
IP192.168.0.2192.168.0.3
MySQL 版本5.1.x (必須一致)5.1.x
Server ID12
網絡雙向 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...

步驟三:配置 my.ini (核心參數深度解析)

Server A 配置

[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 B 配置 (差異點)

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_formatROW/STATEMENT/MIXEDROW 避免 NOW()/UUID() 等導致數據不一致ROW
sync_binlog提交時刷盤頻率1=最安全(零丟失),0=最快(風險自負)1 (核心業務)
auto_increment_increment自增步長雙主避免 ID 衝突核心:步長 = 節點數2 (雙主)
auto_increment_offset自增起始偏移節點產生互不重疊 ID 序列1, 2 (雙主)
log-slave-updatesSlave 執行的 SQL 寫入自身 Binlog雙主/級聯必開,否則另一節點收不到變更1
slave_skip_errors復制遇到錯誤是否跳過雙主衝突時防止復制中斷,但可能導致數據偏移1062,1032

步驟四:重啟服務生效配置

# 兩台服務器分別執行
mysql> SHOW MASTER STATUS\G;
# 記錄: File (如 backuplog.000001), Position (如 154)

Server A 配置從屬關係 (指向 Server B)

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;

Server B 配置從屬關係 (指向 Server A)

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 → 數據不一致!

三層防衝突策略

  1. 架構層:寫入分流 (最徹底)
    auto_increment_increment = 2
       auto_increment_offset = 1  # A: 1,3,5...
       auto_increment_offset = 2  # B: 2,4,6...
  2. 應用層:冪等設計 + 衝突檢測
    # 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. 驗證同步正常後切回流量

    非計劃故障自動切換 (需外部工具)

    • MHA (Master High Availability):監控 Master 健康,秒級故障轉移
    • Orchestrator:拓撲管理、自動故障轉移、手動遷移
    • Keepalived + VIP:虛擬 IP 漂移,應用無感切換

    監控告警體系

    
    

    總結

    Windows MySQL 雙主熱備的核心成功要素:

    1. 版本一致、網絡互通、Server ID 唯一:基礎前提
    2. ROW 格式 + auto_increment 隔離 + log-slave-updates:核心配置三件套
    3. 寫入分流策略:架構層面規避衝突,優於配置層補救
    4. 監控告警閉環:Seconds_Behind_Master、IO/SQL Running 三大黃金指標
    5. 避免 slave_skip_errors=all:生產環境僅跳過 1062/1032,防止數據偏移不可控

    雙主熱備不是銀彈,但配合「業務分流 + 自增隔離 + 外部故障轉移工具」,能構建極具性價比的寫入高可用架構。Windows 環境下部署簡單、運維熟悉,是中小規模核心業務的優選方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved