MySQL 作為核心資料存儲,高可用(HA)是必答題。本文從復制機制、監控體系、故障轉移決策、GTID 與 Pseudo-GTID 定位技術、演進路線圖五大維度,系統闡述生產級 MySQL HA 方案設計思路。
| 模式 | 原理 | 數據安全 | 效能影響 | 推薦度 |
|---|---|---|---|---|
| 異步複制 | Master 提交不等 Slave,單向發送 Binlog | 低:Master 故障未同步 Binlog 丟失 | 最小 | 非核心業務 |
| 半同步複制 | Master 等待至少 1 個半同步 Slave 收到 Binlog 並寫入 Relay Log 才提交返回 | 高:極大降低丟數據概率,Facebook 生產驗證 | 極小(網路 RTT) | **生產首選** |
| 無損半同步 | 5.7+ rpl_semi_sync_master_wait_point=AFTER_SYNC,等待 Slave 落盤確認 | 極高:理論零丟失 | 微增 | 核心金融/交易 |
| Galera Cluster | 多主同步複制,認證機制保證一致性,寫入需多數派 | 最高:同步複制 | 較大(網路往返+認證) | 極高一致性需求、願意接受侵入性改造 |
| DRBD | 塊級別複製,主備共享存儲 | 高 | 中等 | 較少用,運維複雜 |
建議:優先半同步複制(效能/安全平衡),極高一致性需求評估 Galera,避免純異步作為核心業務。
| 方案 | 原理 | 優勢 | 劣勢 |
|---|---|---|---|
| Keepalived / Heartbeat | VRRP 虛擬 IP 漂移,雙機熱備 | 簡單、成熟、無外部依賴 | 僅雙機、檢測粒度粗、無法感知 MySQL 邏輯故障(如卡死但進程在) |
| Zookeeper + Agent | 每實例部署 Agent,Ephemeral 節點註冊,心跳檢測,Children Changed 事件驅動 | 叢集級感知、邏輯故障檢測、事件驅動協調多服務 | 部署複雜、需維護 ZK 叢集、應用端發現新 Master 需額外機制 |
| Orchestrator / MHA | 專用 HA 工具,拓撲管理、故障檢測、自動/半自動 Failover | 專注 MySQL、支援 GTID/Pseudo-GTID、Web UI 可視化 | 單點工具需 HA、MHA 為 Perl 代碼維護門檻高 |
演進路線:簡單業務 → Keepalived;中大型 → Orchestrator + 半同步;極高可用 → Galera 或 MHA + 專用監控。
核心原則:擁有**最新 Binlog 位置**的 Slave 升級為 Master。
SHOW SLAVE STATUS\G
-- 關鍵欄位:
Master_Log_File: mysql-bin.000123
Read_Master_Log_Pos: 456789
Relay_Master_Log_File: mysql-bin.000123
Exec_Master_Log_Pos: 456789
Master_Log_File(Binlog 文件編號)與 Read_Master_Log_Pos(讀取位置)。UUID:GID(UUID=Server UUID,GID=遞增事務號)。CHANGE MASTER TO MASTER_AUTO_POSITION=1 自動對齊,無需手動計算 File+Pos。gtid_mode=ON、enforce_gtid_consistency=ON、log_slave_updates=ON)。原理:在 Master 建立 Event,每 10 秒寫入一個 UUID 到 View,Binlog 記錄該 View 變更,形成「時間錨點」。
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;
log_slave_updates。Domain-ID:Server-ID:Sequence,與 MySQL 不兼容。Seconds_Behind_Master=0 判斷同步完成(僅代表 Relay Log 應用完,不代表數據落盤)。Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Relay_Log_Space、半同步狀態。