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

MySQL內建復制功能實戰:雙主互備架構與PHP自動故障轉移完整實作

     編輯:MySQL 資料庫相關知識

業務場景:7×24小時音視頻直播平台的高可用需求

Soundbreak平台需全天候播放直播內容,資料庫單點故障不可接受。採用MySQL 3.23.23+內建復制,構建雙主互備架構,配合PHP連線層自動故障轉移,實現零停機維護與災難恢復。

架構拓撲:雙主互備

Server A (Master) ←────────────→ Server B (Master)
   10.1.1.1         復制連線          10.1.1.2
      ↑                                  ↑
   應用寫入/讀取                    備份/故障轉移讀取

雙向復制:任一節點寫入變更自動同步至另一節點,任一節點故障另一節點無縫接管。

四步驟完整部署流程

步驟一:配置主伺服器 A


# 1. 建立復制專用帳號 (僅需FILE權限)
GRANT FILE ON *.* TO 'replicate'@'10.1.1.2' IDENTIFIED BY 'strongpass';
FLUSH PRIVILEGES;

# 2. 啟用二進制日誌
# 編輯 my.cnf [mysqld] 區段新增:
log-bin
# 重啟 mysqld

# 3. 取得一致性資料快照
# 停止寫入 → 複製資料目錄 → 重啟 mysqld (開始產生 binlog)
# 異構環境需用 mysqldump 而非直接複製檔案

步驟二:配置從伺服器 B


# 1. 停止 mysqld,部署 A 的資料快照
# 修正檔案擁有者/權限:chown -R mysql:mysql /var/lib/mysql; chmod -R 660 data files; 770 directories

# 2. 驗證快照完整性 (僅 SELECT 測試)
# 3. 配置復制連線參數 (my.cnf [mysqld])
master-host=10.1.1.1
master-user=replicate
master-password=strongpass

# 4. 啟動 mysqld,觀察 SHOW SLAVE STATUS 確認復制運行

步驟三:建立反向復制 (B → A)


# 在 B 上啟用 binlog
log-bin
# 重啟 mysqld

# 在 B 建立反向復制帳號
GRANT FILE ON *.* TO 'replicate'@'10.1.1.1' IDENTIFIED BY 'strongpass';
FLUSH PRIVILEGES;

# 在 A 配置反向復制 (my.cnf)
master-host=10.1.1.2
master-user=replicate
master-password=strongpass
# 重啟 A 的 mysqld

⚠️ 注意:雙主模式下auto_increment衝突風險,建議設定auto_increment_offset/auto_increment_increment錯開ID空間,或僅單主寫入、雙主備援。

步驟四:PHP智慧連線層與故障轉移

基礎版:簡單嘗試連線


function db_connect() {
    $username = "replUser"; $password = "password";
    $primary = "10.1.1.1"; $backup = "10.1.1.2";
    
    if (!$link = @mysql_connect($primary, $username, $password)) {
        $link = @mysql_connect($backup, $username, $password);
    }
    return $link;
}

缺點:主機掛掉時mysql_connect無超時參數,會長時間阻塞(TCP SYN重傳)。

進階版:fsockopen預檢 + 可配置超時 ⭐


function db_connect_plus() {
    $username = "username"; $password = "password";
    $primary = "10.1.1.1"; $backup = "10.1.1.2";
    $timeout = 15; // 秒
    
    // 檢測主庫 3306 端口可達性
    if ($fp = @fsockopen($primary, 3306, $errno, $errstr, $timeout)) {
        fclose($fp);
        return @mysql_connect($primary, $username, $password);
    }
    
    // 主庫不可達,檢測備庫
    if ($fp = @fsockopen($backup, 3306, $errno, $errstr, $timeout)) {
        fclose($fp);
        return @mysql_connect($backup, $username, $password);
    }
    
    return false; // 雙雙不可達
}

優勢:

  • ✅ 可控超時(避免長時間阻塞)
  • ✅ 端口層面健康檢查(mysqld掛掉但主機存活 → 立即切換)
  • ✅ 主機完全掛掉 → 超時後切換備庫

關鍵運維建議

  1. 完整快照是基石:關機→複製→啟用binlog→啟動,順序不可錯
  2. 監控復制延遲:SHOW SLAVE STATUS中Seconds_Behind_Master應接近0
  3. 錯誤自動恢復:從庫SQL執行緒報錯會停止,需告警+人工/腳本SLAVE START恢復
  4. 負載均衡謹慎:雙主寫入易衝突,建議「單寫多讀」架構
  5. 版本一致:主從MySQL版本必須相同
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved