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

MySQL 內建複寫功能測試實戰(二):雙主互備配置、相互授權、應用層連線邏輯初版

     編輯:MySQL 資料庫相關知識

承接上篇單向主從 (A→B),本篇構建**雙主互備**:B 也開啟 Binlog 並授權 A 讀取,A 配置 CHANGE MASTER TO 指向 B,實現雙向複寫。並給出應用層首版容錯連線邏輯(無超時,後續改進)。

第三步:建立雙向主從關係

  1. 在 B (10.1.1.2) 開啟 Binlog 並授權 A:
    編輯 my.cnf [mysqld] 區段加入 log-bin,重啟 MySQL。
    GRANT FILE ON *.* TO 'replicate'@'10.1.1.1' IDENTIFIED BY 'password';
    FLUSH PRIVILEGES;
  2. 在 A (10.1.1.1) 配置指向 B:
    編輯 my.cnf 加入:
    master-host=10.1.1.2
    master-user=replicate
    master-password=password
    重啟 A 的 MySQL 服務。

結果:A 寫入 → 複寫到 B;B 寫入 → 複寫到 A。**任一節點寫入均同步到另一節點**。

第四步:應用層連線邏輯初版(簡單容錯,無超時)


實測兩種故障場景差異

故障類型現象切換行為
MySQL 進程掛掉 (mysqld down,OS 存活)Port 3306 拒絕連線mysql_connect 立即返回 false,**毫秒級切換成功**
整機掛掉 / 網路不通 (OS down / 網路斷開)TCP SYN 無回應mysql_connect **無限阻塞**(預設無連線超時),PHP-FPM 進程掛起,實測 2 分鐘未返回

結論:**必須在應用層實現連線超時**,否則單點故障擴大為應用層雪崩。下一篇將給出 fsockopen 改進版。

雙主複寫的固有風險提醒

  • 寫入衝突:雙邊同時更新同一行 → 複寫報錯停止(需人工介入 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1 或重做)。
  • 自增衝突:雙邊同時 INSERT → 產生相同 auto_increment 值 → 主鍵衝突停止複寫。
  • 複寫延遲非對稱:A→B 快,B→A 慢,應用讀 Standby 可能讀到舊資料。

生產建議:**雙主僅作高可用(單寫單備)**,寫入強制導向 Active Master,由 Orchestrator/MHA 管理角色切換。

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