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

MySQL 主從復制架構設計與故障切換實戰:從配置到 PHP 自動故障轉移

     編輯:MySQL 資料庫相關知識

MySQL 3.23+ 引入的基於二進制日志的主從復制,構建高可用架構的基石。本文詳細講解雙節點主從搭建、數據一致性驗證、主庫故障時 PHP 應用層自動切換邏輯。

架構拓撲與角色定義

  • Master (A: 10.1.1.1):寫入節點,啟用 log-bin 記錄所有變更
  • Slave (B: 10.1.1.2):只讀節點,通過 I/O 線程拉取 Binlog、SQL 線程重放
  • 復制用戶:replicate@10.1.1.2 僅需 FILE 權限 (GRANT FILE ON *.* TO replicate@'10.1.1.2' IDENTIFIED BY 'pass';)

第一階段:Master 配置與快照


# 1. 啟用 Binlog
[mysqld]
log-bin=master-bin
server-id=1

# 2. 重啟 MySQL 生成 Binlog
service mysql restart

# 3. 獲取一致性快照 (停寫窗口)
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;  -- 記錄 File + Position
# 物理拷貝數據目錄 (或 mysqldump --master-data=2)
UNLOCK TABLES;

第二階段:Slave 配置與同步啟動


# 1. 恢復快照到 Slave 數據目錄,修正權限
chown -R mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql

# 2. Slave 配置
[mysqld]
server-id=2
master-host=10.1.1.1
master-user=replicate
master-password=pass
master-port=3306
master-connect-retry=60
replicate-do-db=business_db

# 3. 啟動 Slave 線程
START SLAVE;

# 4. 驗證同步狀態
SHOW SLAVE STATUS \G
# 關鍵指標:Slave_IO_Running=Yes, Slave_SQL_Running=Yes, Seconds_Behind_Master=0

第三階段:故障檢測與自動切換 (PHP 實現)


'10.1.1.1', 'user'=>'app', 'pass'=>'xxx', 'db'=>'biz'];
    $slave  = ['host'=>'10.1.1.2', 'user'=>'app', 'pass'=>'xxx', 'db'=>'biz'];
    
    // 健康檢查:嘗試連接 + 簡單查詢
    function check($cfg) {
        $link = @mysqli_connect($cfg['host'], $cfg['user'], $cfg['pass'], $cfg['db'], 3306, 2);
        if (!$link) return false;
        $res = @mysqli_query($link, "SELECT 1");
        @mysqli_close($link);
        return $res !== false;
    }
    
    if ($preferMaster && check($master)) return mysqli_connect(...$master);
    if (check($slave)) return mysqli_connect(...$slave);
    if (check($master)) return mysqli_connect(...$master); // Slave 掛了回退 Master
    
    throw new Exception("No database available");
}

// 寫操作強制 Master
function writeDb() { return getDbConnection(true); }
// 讀操作優先 Slave
function readDb() { return getDbConnection(false); }
?>

關鍵運維指標與故障處理

現代高可用架構演進

  • MHA (Master High Availability):Perl 自動故障切換管理器,秒級切換
  • Orchestrator:Go 寫的拓撲管理/自動故障切換/可視化工具
  • MySQL Group Replication / InnoDB Cluster:官方多主 Paxos 協議、自動故障切換、讀寫分離路由
  • ProxySQL / MaxScale:中間件層實現讀寫分離、故障感知、查詢路由
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指標正常值異常處理
Seconds_Behind_Master0 (或 <1s)>10s 告警,檢查網絡/長事務/Slave SQL 線程阻塞
Slave_IO_RunningYesNo → 檢查網絡連通性、Master Binlog 是否存在、replicate 用戶權限
Slave_SQL_RunningYesNo → SHOW SLAVE STATUS 看 Last_Error,修復數據衝突後 START SLAVE
Relay_Log_Space穩定持續增長 → SQL 線程慢於 IO 線程,優化 Slave 查詢/索引