MySQL 原生支援單向、非同步複寫。本文實作「雙主互備」架構:兩台異地伺服器互為 Master/Slave,任一節點故障時另一節點無縫接管,確保資料即時一致與服務高可用。
於 ServA 建立供 ServB 連線的帳號,反之亦然:
-- On ServA
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.149' IDENTIFIED BY '123456';
-- On ServB
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.9' IDENTIFIED BY '123456';
關鍵差異: server-id 必須唯一(ServA=1, ServB=2),master-host 指向對方 IP。
[mysqld]
default-character-set=utf8
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
server-id=1 # ServB 改為 2
master-host=10.240.136.149 # ServB 改為 10.240.136.9
master-user=tongbu
master-password=123456
master-port=3306
master-connect-retry=30
binlog-do-db=umsdb
replicate-do-db=umsdb
replicate-ignore-table=umsdb.boco_tb_menu
replicate-ignore-table=umsdb.boco_tb_connect_log
replicate-ignore-table=umsdb.boco_tb_data_stat
replicate-ignore-table=umsdb.boco_tb_log_record
replicate-ignore-table=umsdb.boco_tb_workorder_record
STOP SLAVE;
LOAD DATA FROM MASTER;
START SLAVE;
執行 SHOW SLAVE STATUS\G,重點檢查兩行關鍵指標:
Slave_IO_Running: Yes — I/O 執行緒正常接收 BinlogSlave_SQL_Running: Yes — SQL 執行緒正常重放事件若任一為 No 或 Last_Error 非空,即表示同步異常需介入處理。
拔掉 ServB 網線,ServA 寫入資料,恢復網路後 ServB Slave_IO_Running 長時間為 No。
根因: 預設 slave-net-timeout 過長(預設 3600 秒),Slave 判定連線失敗太慢。
修正: 於 my.cnf 新增 slave-net-timeout=60,重啟後問題解決。
SHOW SLAVE STATUS\G 記下 Master_Log_File 與 Read_Master_Log_PosSHOW MASTER LOGS 確認該 Binlog 檔案是否仍存在START SLAVE 即可自動追趕全量重同步步驟:
-- On Slave
STOP SLAVE;
-- On Master
STOP SLAVE;
-- On Slave
LOAD DATA FROM MASTER;
RESET MASTER;
START SLAVE;
-- On Master
RESET SLAVE;
START SLAVE;
注意: LOAD DATA FROM MASTER 僅支援 MyISAM 引擎資料表。
雙主同步雖能提升可用性,但需謹慎處理 server-id、auto_increment_offset/increment 避免主鍵衝突,並建議搭配 MHA、Orchestrator 等自動化故障轉移工具落地生產環境。