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

MySQL 雙主(Master-Master)同步搭建全流程:高可用架構落地實戰

     編輯:MySQL 綜合教學

架構目標:雙活寫入、自動故障切換、零資料丟失

雙主同步(Circular Replication)讓兩個節點互為主從,實現讀寫分離與高可用。本文基於 MySQL 5.6.27 實戰記錄完整搭建流程、關鍵參數解析與驗證方法。

環境規劃

角色IPServer IDAuto Increment Offset
Master110.8.1.1111
Master210.8.1.1222

核心設計:auto_increment_increment=2 配合 offset=1/2,確保雙節點自增 ID 互不衝突(奇/偶數分離)。

關鍵配置文件(my.cnf)深度解析

# ========== 兩節點通用關鍵配置 ==========
[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 小時心跳導致的故障感知延遲。

分步搭建操作手冊

階段一:Master1 初始化與備份

  1. 修改 my.cnf,重啟驗證 log_bin=ON、server_id=1。
  2. 建立同步賬號:GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY 'StrongPass#2024'; FLUSH PRIVILEGES;
  3. 全局鎖表備份:FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; 記錄 File=mysql-bin.000001, Pos=26314。
  4. 新開會話導出:mysqldump -uroot -p -A -B > /tmp/master1_full.sql(驗證檔案大小)。
  5. 解鎖:UNLOCK TABLES;。

階段二:Master2 部署與資料導入

  1. 配置 my.cnf(server_id=2、auto_increment_offset=2),重啟驗證。
  2. 導入全量備份:mysql -uroot -p < /tmp/master1_full.sql。
  3. 記錄 Master2 當前 Binlog 位置: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 → 雙主同步生效。
  • 模擬寫入衝突測試:同時向兩庫插入相同主鍵,觀察自增 ID 奇偶分離無衝突。

生產環境硬化清單(必讀)

風險點對策
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,定期清理

進階演進:從雙主到 MGR(MySQL Group Replication)

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 平滑遷移路徑。

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