兩台 Linux 服務器互為主從,實現雙向同步,提供寫入高可用與讀取負載分發。適用於雙活數據中心、異地災備等場景。
| 角色 | IP | Server ID | MySQL 版本 |
|---|---|---|---|
| Master A | 192.168.1.6 | 6 | 5.7+ |
| Master B | 192.168.1.8 | 8 | 5.7+ |
雙方均已編譯安裝 MySQL,數據目錄 /usr/local/mysql/var,配置文件 /etc/my.cnf。
# 兩台均執行
mysql_install_db --user=mysql
mysqladmin -u root password 'gaso123'
[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
[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,防止雙邊寫入主鍵衝突。
# 在 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;
# 兩台依次執行
STOP SLAVE;
START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標均為 Yes 表示正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
# 在 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 + 並行複制 |
gtid_mode=ON, enforce_gtid_consistency=ON,故障切換自動定位位點,無需手動 CHANGE MASTER TO。mysqld_exporter 采集 mysql_slave_status_seconds_behind_master,告警閾值建議 > 5s。pt-table-checksum + pt-table-sync 巡檢修復。MySQL 雙主複制配置核心在於 log-slave-updates、auto_increment 交錯、雙向授權與過濾規則對稱。生產環境務必配合 GTID、自動化故障切換與一致性巡檢,才能真正承擔雙活業務流量。