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

MySQL 主主復制架構完整部署指南:從零構建雙向同步集群

     編輯:MySQL 綜合教學

MySQL 主主復制架構完整部署指南:從零構建雙向同步集群

MySQL 主主復制(Master-Master Replication)讓兩台伺服器互為主從,任一節點的資料變更都會自動同步至另一節點,實現雙向寫入與高可用。本文提供從環境準備、用戶授權、配置調優、資料初始化、雙向同步啟動到驗證測試的完整落地步驟,並附帶生產級配置範例與關鍵參數解析。

架構對比:主主 vs 主從

傳統主從僅支援單向同步,從庫不可寫入;主主架構雙節點均可讀寫,適合讀寫分離、負載均衡及災備切換場景。但需妥善處理自增 ID 衝突,通常透過 auto_increment_increment 與 auto_increment_offset 錯開自增步長。

環境準備

  • Server-1:192.168.0.1
  • Server-2:192.168.0.2
  • 同步資料庫:mydb

步驟一:建立跨節點複制用戶並授權

在各節點建立對方專用的 REPLICATION SLAVE 權限帳號,限制來源 IP 提升安全性。

-- Server-1 建立供 Server-2 連線的帳號
GRANT REPLICATION SLAVE ON *.* TO 'server2'@'192.168.0.2' IDENTIFIED BY 'server2';

-- Server-2 建立供 Server-1 連線的帳號
GRANT REPLICATION SLAVE ON *.* TO 'server1'@'192.168.0.1' IDENTIFIED BY 'server1';

步驟二:修改主配置檔 my.cnf

關鍵參數說明:

  • server-id:集群內唯一,建議 10/20 區分
  • log-bin:啟用二進制日誌,復制前提
  • replicate-do-db:僅同步指定庫
  • auto_increment_increment=2:自增步長設為節點總數
  • auto_increment_offset:節點 1 為 1,節點 2 為 2,避免主鍵衝突
# Server-1
[mysqld]
server-id = 10
log-bin = mysql-bin
replicate-do-db = mydb
auto-increment-increment = 2
auto-increment-offset = 1

# Server-2
[mysqld]
server-id = 20
log-bin = mysql-bin
replicate-do-db = mydb
auto-increment-increment = 2
auto-increment-offset = 2

修改後執行 service mysqld restart 生效。

步驟三:源庫鎖表、記錄 Binlog 位置、導出資料

-- Server-1 執行
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;  -- 記錄 File 與 Position,例:mysql-bin.000006, 213
mysqldump --user=root -p mydb > /tmp/mydb.sql
UNLOCK TABLES;

步驟四:目標庫建庫、導入資料、記錄 Binlog 位置

-- Server-2 執行
CREATE DATABASE mydb;
scp 192.168.0.1:/tmp/mydb.sql ./
mysql -uroot -p mydb < /tmp/mydb.sql
LOCK TABLES WITH READ LOCK;
SHOW MASTER STATUS;  -- 記錄 File 與 Position,例:mysql-bin.000001, 106
UNLOCK TABLES;

步驟五:雙向宣告 Binlog 位置並啟動復制

-- Server-1 指向 Server-2
CHANGE MASTER TO
  MASTER_HOST='192.168.0.2',
  MASTER_USER='server1',
  MASTER_PASSWORD='server1',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=106;

-- Server-2 指向 Server-1
CHANGE MASTER TO
  MASTER_HOST='192.168.0.1',
  MASTER_USER='server2',
  MASTER_PASSWORD='server2',
  MASTER_LOG_FILE='mysql-bin.000006',
  MASTER_LOG_POS=213;

-- 兩節點均執行
START SLAVE;

步驟六:驗證同步效果

任一節點建庫建表,另一節點 SHOW DATABASES 即可見同步結果。

生產級配置範例(含 3308 端口、獨立資料目錄)

# Master 1 (192.168.0.186)
[mysqld]
server_id=1
log-bin=/cifpay/mysql-bin.log
binlog-ignore-db=mysql
auto-increment-increment=2
auto-increment-offset=1

# Master 2 (192.168.0.167)
[mysqld]
server-id=2
read_only=TRUE
binlog-ignore-db=mysql
log-bin=/cifpay/mysql-bin.log
auto-increment-increment=2
auto-increment-offset=2

重啟後在各節點執行 CHANGE MASTER TO ... 指向對方最新 Binlog 位置,再 START SLAVE。檢查 SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes 且 Slave_SQL_Running: Yes。

關鍵參數深度解析

參數作用建議值
server-id節點唯一標識1~2³²-1 正整數,主從不可重複
log-bin啟用二進制日誌必開,否則無法復制
binlog-do-db / binlog-ignore-db控制主庫記錄哪些庫按業務精確指定
replicate-do-db / replicate-ignore-db控制從庫同步哪些庫與主庫策略對齊
log-slave-updates從庫更新是否寫入 Binlog鏈式復制時必開
slave-skip-errors跳過指定錯誤碼備份庫慎用,讀負載庫可考慮
sync_binlog=1每次提交強制刷盤最高安全,犧牲寫入效能
auto_increment_increment/offset主主自增衝突避免increment=節點數,offset=1..N

二進制日誌清理策略

定期清理避免磁碟耗盡,兩種方式:

  1. 手動 PURGE:PURGE MASTER LOGS TO 'binlog.000002'; 或 PURGE MASTER LOGS BEFORE '2011-05-28 1:35:00'; 或 PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
  2. 自動過期:[mysqld] expire-logs-days = 7 保留 7 天。

清理前必須確認所有從庫已讀取目標日誌以降後。

常用控制 SQL 快查表

  • 主庫:PURGE MASTER LOGS、RESET MASTER、SET SQL_LOG_BIN、SHOW MASTER LOGS/STATUS、SHOW SLAVE HOSTS
  • 從庫:CHANGE MASTER TO、START/STOP SLAVE、RESET SLAVE、SET GLOBAL SQL_SLAVE_SKIP_COUNTER、SHOW SLAVE STATUS、MASTER_POS_WAIT()

高可用架構建議

單向主從僅提供讀擴展與備份;雙向主主可雙寫負載,但需業務層保證寫入順序安全。生產環境建議搭配 MHA、Orchestrator 或 GTID 增強故障轉移能力。

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