| 方案 | 原理 | 優點 | 缺點 |
| Keepalived / Heartbeat | VIP 漂移、健康檢查 | 簡單、成熟 | 檢測粒度粗、無法感知 MySQL 邏輯故障 (如卡住但進程在) |
| Agent + ZooKeeper | 每 MySQL 實例部署 Agent,ephemeral 節點註冊 ZK,心跳失效自動刪除節點觸發 Watch | 秒級感知、邏輯檢查 (ping SQL)、集群級視野、協調多服務 | 部署複雜、需 ZK 叢集、Failover 後應用端服務發現需配合 |
| Orchestrator / MHA | 專用拓撲管理與故障轉移工具 | 功能完整、Web UI、支援 GTID/Pseudo-GTID | 單點工具、需額外部署 |
三、故障轉移核心:選主與定位 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 秒窗口,足夠多數場景
四、工具鏈演進與選型建議
- MHA (Master High Availability):Perl 寫成、成熟穩定、支援 Pseudo-GTID (舊版)、Facebook/Google 早期大量使用、**推薦現有 5.5/5.6 叢集**
- Orchestrator:Go 寫成、Web UI、支援 GTID/Pseudo-GTID、拓撲視覺化、遷移/故障轉移/備份整合、**推薦新建 5.7/8.0 叢集**
- 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 原生多主)
核心哲學: **資料不丟失 > 系統可用 > 效能**。先保證半同步/無損複寫,再建立秒級監控與自動故障轉移,最後優化效能。工具選擇以「團隊能駕馭、生產驗證過」為準。
- 上一篇文章: Linux 安裝 CMake 與 MySQL 從原始碼編譯完整踩坑記錄:wget、rz/sz、i-node 刪除亂碼檔
- 下一篇文章: 防止伺服器宕機導致 MySQL 資料遺失的三大方案:複寫、監控與故障轉移深度解析
Copyright ©
程式碼之家 All Rights Reserved