首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 高可用架構防止宕機資料遺失:半同步複寫、監控體系與故障轉移 (GTID/Pseudo-GTID)

     編輯:MySQL 綜合教學

MySQL 高可用架構全景:半同步複寫、ZooKeeper 監控、MHA/Orchestrator 故障轉移與 GTID 演進

MySQL 作為核心資料存儲,如何在 Master 宕機時**零資料遺失、秒級感知、自動故障轉移**?本文系統闡述 Replication 模式選擇、監控體系設計、Failover 核心邏輯 (GTID vs Pseudo-GTID)、工具鏈選型與演進路線圖。

一、複寫模式:從非同步到無損半同步

建議:生產環境**至少啟用半同步**,5.7+ 開啟 rpl_semi_sync_master_wait_point=AFTER_SYNC 達到無損。Facebook 生產驗證效能可接受。

二、監控體系:從 Keepalived 到 ZooKeeper

模式原理資料遺失風險效能影響
非同步 (預設)Master 不等 Slave 確認即提交高 (Master 宕機未傳 Binlog)最低
半同步Master 等**至少一個**半同步 Slave 收到 Binlog 並寫入 Relay Log 才提交低 (極少數 Master 崩潰發送前)微增 (網路 RTT)
無損半同步 (5.7+)Master 等 Slave **Flush Relay Log 到磁碟** 才提交 (rpl_semi_sync_master_wait_point=AFTER_SYNC)**理論零遺失**略增
Galera Cluster同步多主、認證式複寫、寫集合廣播零遺失 (Quorum 機制)高 (網路延遲敏感)

三、故障轉移核心:選主與定位 Binlog 位置

選主原則:擁有**最新 Binlog 位置**的 Slave 升級為 Master。

SHOW SLAVE STATUS;
-- 比較 Master_Log_File (檔名序號) + Read_Master_Log_Pos (位置)
-- 較大者 = 最新資料

GTID (Global Transaction ID) - MySQL 5.6+ 標準解法

  • 格式:UUID:GID (UUID=Server UUID, GID=遞增事務號)
  • 優勢:唯一標識事務,**跨實例定位精確**、CHANGE MASTER TO MASTER_AUTO_POSITION=1 自動對齊
  • 限制:需 5.6+、gtid_mode=ON、enforce_gtid_consistency=ON、log_slave_updates=ON

Pseudo-GTID - 5.5/5.6 兼容方案 (Orchestrator 採用)

原理:在每個實例建立 Event,每 10 秒寫入一個 UUID 到 View,Binlog 記錄該 UUID,形成**時間錨點**。

CREATE DATABASE IF NOT EXISTS meta;
DROP EVENT IF EXISTS meta.create_pseudo_gtid_view_event;
DELIMITER ;;
CREATE EVENT IF NOT EXISTS meta.create_pseudo_gtid_view_event
ON SCHEDULE EVERY 10 SECOND STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE ENABLE
DO BEGIN
    SET @pseudo_gtid := UUID();
    SET @_create_statement := CONCAT('CREATE OR REPLACE VIEW meta.pseudo_gtid_view AS SELECT \'', @pseudo_gtid, '\' AS pseudo_gtid_unique_val FROM dual');
    PREPARE st FROM @_create_statement; EXECUTE st; DEALLOCATE PREPARE st;
END;;
DELIMITER ;
SET GLOBAL event_scheduler = 1;
  • 定位邏輯:從舊 Slave 最後一個 Pseudo-GTID 位置,在新 Master Binlog 中搜尋對應 UUID,向後比對後續事件,確定同步起點
  • 需 log_slave_updates=ON
  • 精度:10 秒窗口,足夠多數場景

四、工具鏈演進與選型建議

  1. MHA (Master High Availability):Perl 寫成、成熟穩定、支援 Pseudo-GTID (舊版)、Facebook/Google 早期大量使用、**推薦現有 5.5/5.6 叢集**
  2. Orchestrator:Go 寫成、Web UI、支援 GTID/Pseudo-GTID、拓撲視覺化、遷移/故障轉移/備份整合、**推薦新建 5.7/8.0 叢集**
  3. MHA + 半同步 + Binlog Server (go-mysql):作者後期架構,Binlog Server 即時拉取 Binlog 減少 Slave 負載、MHA 做決策

五、遷移建議路線圖

現狀 5.5 非同步 + Keepalived
   ↓
升級 5.7/8.0 + 半同步 (AFTER_SYNC) + MHA
   ↓
全面 GTID + Orchestrator + Binlog Server 即時備份
   ↓ (極高可用需求)
Galera Cluster / Group Replication (MySQL 8.0 原生多主)
核心哲學: **資料不丟失 > 系統可用 > 效能**。先保證半同步/無損複寫,再建立秒級監控與自動故障轉移,最後優化效能。工具選擇以「團隊能駕馭、生產驗證過」為準。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案原理優點缺點
Keepalived / HeartbeatVIP 漂移、健康檢查簡單、成熟檢測粒度粗、無法感知 MySQL 邏輯故障 (如卡住但進程在)
Agent + ZooKeeper每 MySQL 實例部署 Agent,ephemeral 節點註冊 ZK,心跳失效自動刪除節點觸發 Watch秒級感知、邏輯檢查 (ping SQL)、集群級視野、協調多服務部署複雜、需 ZK 叢集、Failover 後應用端服務發現需配合
Orchestrator / MHA專用拓撲管理與故障轉移工具功能完整、Web UI、支援 GTID/Pseudo-GTID單點工具、需額外部署