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

MySQL 雙向複制 (Master-Master) 完整部署指南:雙主同步架構實戰

     編輯:MySQL 資料庫相關知識

架構前提

  • 版本一致性:Master 版本 ≤ Slave 版本(binlog 格式相容),最佳同版本
  • 本文環境:雙邊 MySQL 5.0.27、RedHat Linux 9、basedir=/usr/local/mysql、datadir=/var/lib/mysql
  • 節點:A (192.168.0.1) ↔ B (192.168.0.2),同步資料庫 test

步驟 1:配置 A 為 Master、B 為 Slave (A→B)

A (Master) my.cnf

[mysqld]
log-bin=/var/log/mysql/updatelog
server-id = 1
binlog-do-db=test
binlog-ignore-db=mysql

重啟 → 建立同步帳號:

GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'back'@'192.168.0.2' IDENTIFIED BY 'back';
FLUSH PRIVILEGES;

B (Slave) my.cnf

[mysqld]
server-id = 2
master-host = 192.168.0.1
master-user = back
master-password = back
master-port = 3306
replicate-do-db=test
replicate-ignore-db=mysql

重啟

啟動 A→B 同步

-- On A
SHOW MASTER STATUS;
-- 記錄 File、Position,如 updatelog.000028, 313361

-- On B
SLAVE STOP;
CHANGE MASTER TO MASTER_LOG_FILE='updatelog.000028', MASTER_LOG_POS=313361;
SLAVE START;

-- 驗證
SHOW SLAVE STATUS\G;
-- Slave_IO_Running: Yes, Slave_SQL_Running: Yes 表示同步中

步驟 2:配置 B 為 Master、A 為 Slave (B→A) 實現雙向

B 新增 Master 配置

[mysqld]
log-bin=/var/log/mysql/updatelog
binlog-do-db=test
binlog-ignore-db=mysql

重啟 → 建立同步帳號:

GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'back'@'192.168.0.1' IDENTIFIED BY 'back';
FLUSH PRIVILEGES;

A 新增 Slave 配置

[mysqld]
master-host = 192.168.0.2
master-user = back
master-password = back
master-port = 3306
replicate-do-db=test
replicate-ignore-db=mysql

重啟

啟動 B→A 同步

-- On B
SHOW MASTER STATUS;  -- 記錄 File、Position

-- On A
SLAVE STOP;
CHANGE MASTER TO MASTER_LOG_FILE='updatelog.000028', MASTER_LOG_POS=13753;
SLAVE START;

關鍵注意事項

  1. 自增衝突:雙主寫入同表自增主鍵會衝突,需設定 auto_increment_increment、auto_increment_offset 錯開(如 A: 1,3,5... B: 2,4,6...)
  2. 唯一鍵衝突:業務層面避免雙邊同時寫入相同唯一鍵
  3. 循環複制:log-slave-updates 需開啟,否則 B 的寫入不會回傳給 A
  4. 故障切換:單向故障時另一向仍可服務,但需應用層感知切換

驗證雙向同步

在 A 寫入 → 檢查 B 出現;在 B 寫入 → 檢查 A 出現。雙向同步完成!

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