主主同步(雙主複製)提供寫入高可用,但引入自增衝突、數據一致性風險。本文記錄基於 MySQL 5.1.21 的生產級雙主部署全流程,含關鍵參數解析、驗證步驟、測試用例及已知問題。
| 角色 | IP | Server ID | Replication User |
|---|---|---|---|
| Master A | 192.168.0.231 | 1 | repl1@192.168.0.232 |
| Master B | 192.168.0.232 | 2 | repl2@192.168.0.231 |
同步數據庫:test。MySQL 版本:5.1.21。
在 A 上:
GRANT REPLICATION SLAVE, FILE ON *.* TO 'repl1'@'192.168.0.232' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
在 B 上:
GRANT REPLICATION SLAVE, FILE ON *.* TO 'repl2'@'192.168.0.231' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
執行後停止兩台 MySQL 服務。
[mysqld]
user = mysql
log-bin = mysql-bin
server-id = 1
binlog-do-db = test
binlog-ignore-db = mysql
replicate-do-db = test
replicate-ignore-db = mysql
log-slave-updates = 1
slave-skip-errors = all
sync_binlog = 1
auto_increment_increment = 2
auto_increment_offset = 1
[mysqld]
user = mysql
log-bin = mysql-bin
server-id = 2
binlog-do-db = test
binlog-ignore-db = mysql
replicate-do-db = test
replicate-ignore-db = mysql
log-slave-updates = 1
slave-skip-errors = all
sync_binlog = 1
auto_increment_increment = 2
auto_increment_offset = 2
/usr/local/mysql/bin/mysqld_safe &
在 A 上:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS\G
-- 記錄 File: mysql-bin.000007, Position: 528
在 B 上:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS\G
-- 記錄 File: mysql-bin.000004, Position: 595
此時備份數據確保兩庫一致(可用 mysqldump、xtrabackup 等)。
在 A 上指向 B:
CHANGE MASTER TO
MASTER_HOST='192.168.0.232',
MASTER_USER='repl2',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=595;
START SLAVE;
在 B 上指向 A:
CHANGE MASTER TO
MASTER_HOST='192.168.0.231',
MASTER_USER='repl1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=528;
START SLAVE;
執行 SHOW PROCESSLIST\G,關鍵檢查點:
Command: Binlog Dump 線程(對方作為從庫連接我)State: Waiting for master to send event 的 system user 線程(我作為從庫的 I/O 線程)State: Has read all relay log... 的 SQL 線程(應用中繼日志)若缺少上述紅色狀態,查看 data 目錄下 .err 錯誤日志排查。
UNLOCK TABLES;
測試步驟:
t11_replicas,插入一行 → B 可見-- A 執行
CREATE TABLE t11_replicas (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, str VARCHAR(255) NOT NULL) ENGINE=MYISAM;
INSERT INTO t11_replicas(str) VALUES('This is a master to master test table');
-- B 執行
INSERT INTO t11_replicas(str) VALUES('This is a test 2');
-- 雙方 SELECT 均返回 2 行,ID 分別為 1(A) 和 2(B),無衝突!
雙主架構通過 auto_increment_increment/offset 解決主鍵衝突,log-slave-updates 實現雙向傳播,sync_binlog=1 保證持久化。但運維複雜度高,現代架構更推薦「單主多從 + 自動故障切換」或「Galera Cluster / InnoDB Cluster」等同步多主方案。若必須用雙主,請嚴格遵循本文配置,並建立完善的監控、備份、演練體系。