萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 雙主熱備(M-M)配置實戰:版本差異、參數詳解、故障排查總結

架構定位

雙主熱備 = 互為主從,雙向異步復制。適用於:雙活讀寫分離、跨機房災備、單點故障切換。核心風險:雙向寫入衝突(自增 ID 衝突、唯一鍵衝突),需應用層路由或 auto_increment_offset/increment 區分。

版本分水嶺:5.1.7 參數大變動

參數≤ 5.1.6 (舊)>= 5.1.7 (新,含 5.5/5.6/5.7/8.0)
指定主庫連接信息my.cnf 中 master-host/user/password/port廢棄,改用 CHANGE MASTER TO 動態配置
指定復制庫my.cnf replicate-do-db仍支援,但推薦 CHANGE REPLICATION FILTER
啟動復制配置後重啟自動需手動 START SLAVE

新版(≥5.1.7)標準配置流程

環境定義

  • Node A: 192.168.100.100, server-id=1
  • Node B: 192.168.100.200, server-id=2
  • 同步庫:asymt
  • 復制用戶:repl_user/ReplPass#123

步驟 1:雙邊配置 my.cnf

# Node A /etc/my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = asymt
binlog-ignore-db = mysql
log-slave-updates = 1          # 關鍵:從庫執行的事務也寫入自己的 Binlog,傳遞給對端
relay-log = relay-bin
relay-log-index = relay-bin.index
gtid_mode = ON                 # 5.6+ 強烈建議開啟 GTID
enforce-gtid-consistency = ON

# Node B 同理,server-id = 2

步驟 2:創建復制用戶(雙邊執行)

-- Node A
CREATE USER 'repl_user'@'192.168.100.200' IDENTIFIED BY 'ReplPass#123';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.100.200';

-- Node B
CREATE USER 'repl_user'@'192.168.100.100' IDENTIFIED BY 'ReplPass#123';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.100.100';

步驟 3:基線數據同步(冷備份 + Binlog 位點)

# Node A:鎖表、備份、記錄位點
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS\G
-- 記錄 File: mysql-bin.000002, Position: 1556
# 打包 /data/mysql 目錄傳給 Node B 解壓
mysql> UNLOCK TABLES;

步驟 4:配置雙向復制(動態,無需重啟)

# Node A 指向 Node B
CHANGE MASTER TO
  MASTER_HOST='192.168.100.200',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='ReplPass#123',
  MASTER_LOG_FILE='mysql-bin.000003',  -- Node B 的當前 Binlog 文件
  MASTER_LOG_POS=73;                   -- Node B 的當前 Position
-- GTID 模式下可簡化為
-- CHANGE MASTER TO MASTER_HOST='192.168.100.200', MASTER_USER='repl_user', MASTER_PASSWORD='ReplPass#123', MASTER_AUTO_POSITION=1;

# Node B 指向 Node A
CHANGE MASTER TO
  MASTER_HOST='192.168.100.100',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='ReplPass#123',
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=1556;

步驟 5:啟動並驗證

START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
-- Last_IO_Error / Last_SQL_Error: 空

自增 ID 衝突預防(雙主寫入必配)

# Node A
auto_increment_offset = 1
auto_increment_increment = 2

# Node B
auto_increment_offset = 2
auto_increment_increment = 2

生成 ID 序列:A→1,3,5... B→2,4,6... 彻底避免主鍵衝突。

常見故障排查總結

現象/報錯原因解決
ERROR 1201 (HY000): Could not initialize master!舊 relay-log/info 殘留STOP SLAVE; RESET SLAVE ALL; (8.0) / RESET SLAVE; (5.7) 後重新 CHANGE MASTER
ERROR 1200 (HY000): The server is not configured as slaveserver_id 未生效或為 0SET GLOBAL server_id=2; 並持久化到 my.cnf,重啟
IO 線程報錯 error reconnecting to master網絡不通/防火牆/用戶 Host 不匹配/密碼錯檢查連通性、授權 Host、密碼、SSL 要求
SQL 線程報錯 Duplicate entry雙向寫入衝突、自增未配置配置 auto_increment_offset/increment、應用層路由分庫、或改用 Galera Cluster
/etc/my.cnf 不生效啟動腳本未讀取默認路徑mysqld_safe --defaults-file=/etc/my.cnf 或檢查 !includedir
JAVA_HOME 未設置 (Cobar/中間件)環境變量缺失/etc/profile 設置 JAVA_HOME/JRE_HOME/CLASSPATH/PATH,source /etc/profile

生產級增強建議

  1. GTID 模式:簡化故障切換、自動定位位點、支援多源復制。
  2. 半同步復制:rpl_semi_sync_master=ON,至少一個從庫收到 Binlog 才提交,降低數據丟失風險。
  3. 監控告警:Seconds_Behind_Master > 300、Slave_IO_Running != Yes、Slave_SQL_Running != Yes 立即告警。
  4. 定期校驗:pt-table-checksum + pt-table-sync 修復不一致。
  5. 考慮 MGR (MySQL Group Replication) / Galera Cluster:原生多主同步、自動故障轉移、強一致性,替代傳統雙主異步架構。
copyright © 萬盛學電腦網 all rights reserved