首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Linux 下 MySQL 雙主(Master-Master)複制配置實戰指南

     編輯:MySQL 資料庫相關知識

架構目標

兩台 Linux 服務器互為主從,實現雙向同步,提供寫入高可用與讀取負載分發。適用於雙活數據中心、異地災備等場景。

環境準備

角色IPServer IDMySQL 版本
Master A192.168.1.665.7+
Master B192.168.1.885.7+

雙方均已編譯安裝 MySQL,數據目錄 /usr/local/mysql/var,配置文件 /etc/my.cnf。

步驟 1:初始化與設置 Root 密碼

# 兩台均執行
mysql_install_db --user=mysql
mysqladmin -u root password 'gaso123'

步驟 2:配置 /etc/my.cnf(核心差異點)

Master A (192.168.1.6)

[mysqld]
server-id = 6                    # 作為 Master 的 ID
log-bin = mysql-bin              # 啟用二進制日誌
binlog-ignore-db = mysql         # 不同步系統庫
binlog-do-db = biz_db            # 指定同步業務庫(可多行)
relay-log = /usr/local/mysql/var/relay-bin  # Relay log 路徑
log-slave-updates = 1            # 關鍵:將從庫接收的變更寫入自己的 binlog,供另一邊同步
auto-increment-increment = 2     # 自增步長
auto-increment-offset = 1        # 自增起始值(奇數)
master-host = 192.168.1.8        # 作為 Slave 指向 B
master-user = repl_user
master-password = repl_pass
master-port = 3306
master-connect-retry = 60

# 複製過濾(作為 Slave 時生效)
replicate-ignore-db = mysql
replicate-do-db = biz_db

Master B (192.168.1.8)

[mysqld]
server-id = 8
log-bin = mysql-bin
binlog-ignore-db = mysql
binlog-do-db = biz_db
relay-log = /usr/local/mysql/var/relay-bin
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 2        # 起始值(偶數),避免主鍵衝突
master-host = 192.168.1.6
master-user = repl_user
master-password = repl_pass
master-port = 3306
master-connect-retry = 60

replicate-ignore-db = mysql
replicate-do-db = biz_db

關鍵參數解讀:
log-slave-updates=1 是雙主複制的核心,確保 A 從 B 同步來的數據會寫入 A 的 binlog,B 才能再次同步回去,形成閉環。
auto_increment_increment/offset 交錯分配自增 ID,防止雙邊寫入主鍵衝突。

步驟 3:建立複制賬號並授權

# 在 A 上執行
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.8' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;

# 在 B 上執行
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.6' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;

步驟 4:啟動複制並驗證

# 兩台依次執行
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G

關鍵指標均為 Yes 表示正常:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

步驟 5:測試雙向同步

# 在 A 建表
CREATE DATABASE biz_db;
USE biz_db;
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, val VARCHAR(20));
INSERT INTO t1 VALUES (NULL, 'from_A');

# 在 B 查詢
SELECT * FROM biz_db.t1;  -- 應可見 from_A

# 在 B 插入
INSERT INTO biz_db.t1 VALUES (NULL, 'from_B');

# 在 A 查詢
SELECT * FROM biz_db.t1;  -- 應可見 from_B

常見故障排查

現象可能原因處理
Slave_IO_Running: No網路不通、授權缺失、防火牆阻擋、master-host 錯誤telnet 3306、檢查 GRANT、開放防火牆
Slave_SQL_Running: No主鍵衝突、外鍵約束失敗、SQL 模式不兼容SHOW SLAVE STATUS\G 看 Last_Error,手動修正數據後 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
Seconds_Behind_Master 偏大從庫硬體弱、大事務阻塞、單線程複制瓶頸升級到 5.7+ 開啟 MTS(多線程複制),或改用 GTID + 並行複制

生產環境加固建議

  1. 改用 GTID 模式:gtid_mode=ON, enforce_gtid_consistency=ON,故障切換自動定位位點,無需手動 CHANGE MASTER TO。
  2. 部署 Orchestrator / MHA:自動故障檢測與切換,避免雙主同時寫入導致腦裂。
  3. 監控複制延遲:Prometheus + mysqld_exporter 采集 mysql_slave_status_seconds_behind_master,告警閾值建議 > 5s。
  4. 定期校驗數據一致性:使用 pt-table-checksum + pt-table-sync 巡檢修復。

總結

MySQL 雙主複制配置核心在於 log-slave-updates、auto_increment 交錯、雙向授權與過濾規則對稱。生產環境務必配合 GTID、自動化故障切換與一致性巡檢,才能真正承擔雙活業務流量。

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