雙主熱備 = 互為主從,雙向異步復制。適用於:雙活讀寫分離、跨機房災備、單點故障切換。核心風險:雙向寫入衝突(自增 ID 衝突、唯一鍵衝突),需應用層路由或 auto_increment_offset/increment 區分。
| 參數 | ≤ 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 |
asymtrepl_user/ReplPass#123# 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
-- 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';
# 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;
# 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;
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
-- Last_IO_Error / Last_SQL_Error: 空
# 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 slave | server_id 未生效或為 0 | SET 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 |
rpl_semi_sync_master=ON,至少一個從庫收到 Binlog 才提交,降低數據丟失風險。Seconds_Behind_Master > 300、Slave_IO_Running != Yes、Slave_SQL_Running != Yes 立即告警。pt-table-checksum + pt-table-sync 修復不一致。