對於核心業務,MySQL 往往是最關鍵的資料中樞。如何在 Master 宕機時做到 資料零/極小損失、秒級故障感知、自動故障轉移,是架構師必須攻克的難題。本文結合實戰經驗,系統剖析 Replication (複寫)、Monitor (監控)、Failover (故障轉移) 三大支柱的演進與最佳實踐。
MySQL 預設採用 Asynchronous Replication:Master 提交事務後即返回客戶端,不等待 Slave 接收並應用 Binlog。網路抖動、Slave 延遲、Master 宕機瞬間,未傳輸的 Binlog 事件將永久丟失,導致資料不一致。
Semi-Synchronous Replication 機制:Master 提交事務後,阻塞等待 至少一個支援半同步的 Slave 確認 收到 Binlog 並寫入 Relay Log 後才返回。極大降低資料遺失窗口。
rpl_semi_sync_master_wait_point = AFTER_SYNC 確保事務提交前已同步到 Slave,進一步逼近「零遺失」。建議:優先採用半同步複寫 作為基線方案,配合 MASTER_RETRY_COUNT、MASTER_CONNECT_RETRY 優化重連韌性。
若業務絕對不可容忍任何資料遺失 (金融核心帳務等),可考慮多主同步複寫方案:
塊設備級同步,切換快但 Split-Brain 風險高、檔案系統層面一致性難保證,MHA 作者已明確不推薦,現代架構中已被淘汰。
Keepalived / Heartbeat + VIP:透過 VRRP 協議實現 VIP 漂移。缺點明顯:
架構:每個 MySQL 實例部署 Sidecar Agent,定期 PING 檢測存活,以 Ephemeral Node 註冊到 Zookeeper。
ChildrenChanged 事件觸發管控服務執行 Failover/告警/熔斷。挑戰:部署運維複雜度高 (ZK 集群本身需高可用)、應用端資料庫地址感知機制需配合 (Proxy/VIP/Config Center)。
若架構較簡單 (單主雙從),MHA (Master High Availability) 或 Orchestrator 往往是性價比最高的選擇:
傳統 Failover 需比較候選 Slave 的 Master_Log_File、Read_Master_Log_Pos,選擇「最新」者提升。但將其他 Slave 重新指向新主時,無法精確知道從新主的哪個 Binlog 位置開始同步,易導致資料重複或遺漏。
GTID = source_id:transaction_id (UUID:序號),全域唯一標識事務。
CHANGE MASTER TO MASTER_AUTO_POSITION=1,MySQL 內部自動根據 GTID 集合計算差集,精準同步缺失事務。GTID_MODE=ON、ENFORCE_GTID_CONSISTENCY=ON、LOG_SLAVE_UPDATES=ON。MariaDB GTID 實現不同,工具開發需雙重適配 (go-mysql 等庫已支援)。
作者從 Orchestrator** 專案獲得靈感:利用 MySQL Event Scheduler 每 10 秒向特定 View 寫入 UUID,該 DDL 會記錄進 Binlog,形成「偽 GTID 標記」。
CREATE EVENT IF NOT EXISTS meta.create_pseudo_gtid_view_event
ON SCHEDULE EVERY 10 SECOND
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;
原理:Binlog 中每 10 秒出現一個唯一 UUID 事件。Failover 時,在新主 Binlog 中定位舊從最後一個 UUID 位置,掃描後續事件對比校驗,確定精確同步起點。精度達 10 秒級,足以滿足多數業務。
前提:Slave 必須開啟 LOG_SLAVE_UPDATES (GTID 亦同)。
MySQL HA 是深水區,技術棧演進極快。建議團隊:跟隨社區主流成熟方案 (MHA/Orchestrator/InnoDB Cluster),避免重複造輪子;將精力投入業務層面的熔斷、降級、多活架構建設,才是核心價值所在。