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

MySQL 內建復制實現高可用:主從配置、雙主互備、PHP 故障切換、Binlog 追同步全流程

     編輯:MySQL 資料庫相關知識

架構目標

  • **雙節點熱備**:A (Master) ↔ B (Slave),單點故障秒級切換
  • **數據零丟失**:同步/半同步複製,Binlog 追同步補齊
  • **應用透明**:PHP 連接層自動故障轉移,無感知

環境規劃 (文中 3.23.23 版本)

角色IPServer ID備註
Master (A)10.1.1.11主寫入
Slave (B)10.1.1.22備讀取/故障接管

步驟 1:Master 配置啟用 Binlog

[mysqld]
server-id=1
log-bin=mysql-bin
# 可選:binlog-do-db=target_db 只記錄特定庫
  1. 創建復制賬號:GRANT FILE ON *.* TO 'replicate'@'10.1.1.2' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
  2. 獲取一致性快照:FLUSH TABLES WITH READ LOCK; mysqldump --all-databases --master-data=2 > snapshot.sql; UNLOCK TABLES;
  3. 拷貝 snapshot.sql 到 Slave,導入

步驟 2:Slave 配置指向 Master

[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=target_db
  1. 導入快照後啟動 Slave:START SLAVE;
  2. 驗證:SHOW SLAVE STATUS\G → Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0

步驟 3:雙主互備 (Master-Master) — 文中步驟 3

  1. Slave (B) 也啟用 Binlog:log-bin=mysql-bin,重啟
  2. B 創建反向賬號:GRANT FILE ON *.* TO 'replicate'@'10.1.1.1' IDENTIFIED BY 'pass';
  3. Master (A) 添加反向配置:
master-host=10.1.1.2
master-user=replicate
master-password=pass
  1. 重啟 A,驗證雙向同步

**注意**:雙主**不支援雙寫** (自增衝突、數據衝突),僅作**故障切換備用**。寫入始終單點,或用 auto_increment_offset/increment 錯開 ID (但業務邏輯仍衝突)。

步驟 4:PHP 連接層故障轉移 (文中 db_connect 函數)

function db_connect() {
    $link = @mysql_connect('10.1.1.1', 'user', 'pass', true);  // 新連接
    if ($link) return $link;
    // Master 掛了,連 Slave
    $link = @mysql_connect('10.1.1.2', 'user', 'pass', true);
    if ($link) {
        error_log('MySQL Master down, switched to Slave at ' . date('Y-m-d H:i:s'));
        return $link;
    }
    die('Both MySQL servers unreachable');
}

**缺陷**:

  • 無心跳檢測,依賴連接超時 (秒級)
  • 無自動切回,Master 恢複需人工/腳本切回
  • 無事務一致性保證,切換瞬間可能丟寫入

現代化高可用架構對比

方案架構故障轉移數據一致性運維複雜度
原生雙主 + 腳本Active-Passive手動/腳本 (分鐘級)半同步/異步 (可能丟數據)低
MHA (Master High Availability)Active-Passive + Manager自動 (秒級)Binlog 補償、差異修復中
Orchestrator拓撲管理 + 故障轉移自動/手動、Web UIGTID 追同步中
InnoDB Cluster / Group ReplicationMulti-Primary / Single-Primary自動 (Paxos 共識、毫秒級)強一致 (多數派)高 (需 3+ 節點)
ProxySQL + Orchestrator讀寫分離 + 連接池 + 故障轉移透明、無感知配合 GTID/Group Replication高
云托管RDS/Aurora/Cloud SQL全托管、SLA 保障跨 AZ 同步/異步可選零運維

關鍵最佳實踐 (適用所有方案)

  1. GTID 必開:gtid_mode=ON、enforce_gtid_consistency=ON,簡化故障轉移定位
  2. 半同步複製**:rpl_semi_sync_master=ON、rpl_semi_sync_slave=ON,至少一備確認收到 Binlog 才提交,**RPO≈0**
  3. 監控告警**:Seconds_Behind_Master > 30、Slave_IO_Running != Yes、Relay_Log_Space > 1GB 即時告警
  4. 定期演練**:月度故障切換演練,驗證 RTO/RPO、應用兼容性、數據校驗
  5. 備份獨立於複製**:從庫做備份不影響主庫,但**不能替代異地備份**

結語

MySQL 內建復制是高可用的**地基**,而非成品。從文中「PHP 輪詢切換」到今日「Group Replication + ProxySQL + 雲托管」,核心演進是:**從人工腳本 → 自動化工具 → 共識協議 → 全托管服務**。無論架構如何升級,**GTID + 半同步 + 監控演練 + 異地備份** 四件套永遠是高可用的鋼筋骨架。

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