選型需求與候選方案
核心需求:高可用(自動故障切換)、可擴展(分片/擴展節點)、負載均衡(讀寫分離/指定路由)。評測三大方案:
- MySQL Cluster (NDB):官方原生集群,自動分片、內存存儲、99.999% 可用性
- MySQL Fabric:Oracle 2014 推出,Python 腳本管理分片+高可用組
- Galera Cluster (Percona XtraDB Cluster):同步多主複製、無分片、InnoDB 原生支援
方案一:MySQL Cluster (NDB) 深度剖析
架構三角色
- Management Node (ndb_mgmd):集群配置、節點啟停、監控
- Data Node (ndbd/ndbmtd):數據存儲,主內存,支援磁盤數據
- SQL Node (mysqld --ndbcluster):對外服務入口,引擎為 NDB
核心限制與痛點
| 限制項 | 影響 |
| 事務隔離級別僅支援 Read Committed | 無 Repeatable Read,應用層需處理不可重複讀 |
| 外鍵效能極差 | 跨分片檢查開銷大,官方建議移除外鍵 |
| Data Node 強依賴大內存 | 數據盡量放內存,硬體成本高 |
| 表需改引擎為 NDB | 遷移成本高,InnoDB 特性不可用 |
方案二:MySQL Fabric 實測紀錄
高可用組 (HA Group) 架構
一主多從,Fabric Connector (JDBC/Python 驅動) 感知主從切換。異步複製預設,備庫同步延遲 1-2 分鐘。
分片限制
- 自增主鍵不能作為分片鍵
- 事務與查詢不能跨分片,嚴重限制業務建模
實測故障切換
- 主庫掛掉 → Fabric 自動提升從庫為主,**切換秒級完成**
- 進行中事務**會報錯丟失**,應用需重試機制
- 主庫恢復後**需手動降級為從**
方案三:Galera Cluster (PXC) 完勝實測
核心優勢
- 真正多主同步複製:wsrep API 保證事務在所有節點原子提交或全員回滾
- 零延遲同步:寫入任一節點,毫秒級同步至所有節點
- InnoDB 原生支援:無需改引擎,保留所有 InnoDB 特性 (RR 隔離、外鍵、全文索引)
- 自動節點加入:新節點啟動自動 SST (State Snapshot Transfer) 同步現有數據,百萬行 ~20 秒
- 應用透明:標準 JDBC/連接池,無需換驅動
實測數據同步驗證
- 節點 A 建表 → 節點 B **立即可見**
- 節點 A 插入 100 條 → 節點 B **立即可查**
- 節點停機插入 100 萬行 → 重啟節點 **20 秒自動同步完成**
限制與注意
- 同步複製網絡開銷:寫入延遲 = 最慢節點 RTT,跨機房慎用
- 熱點行並發更新易觸發樂觀鎖衝突回滾 (Deadlock/Brute force abort),應用需重試
- 不支援
LOCK TABLES、GET_LOCK()、XA 事務
- 大事務 (大批量 DELETE/UPDATE) 會阻塞整個集群流控,需拆分小事務
綜合對比總結
| 維度 | MySQL Fabric | Galera Cluster (PXC) | MySQL Cluster (NDB) |
| 成熟度/案例 | 2014 年推出,大廠案例少 | 極高,2000+ 企業 | 早期方案,特定場景用 |
| 同步模式 | 異步 (延遲分鐘級) | 同步 (毫秒級) | 同步 (內存) |
| 數據分布 | 分片 | 全量冗余 | 自動分片 |
| 擴展性 | 手工複製數據後加入 | 自動 SST 极快 | 需重新分片 |
| 高可用切換 | Fabric Connector 自動 | HAProxy/ProxySQL 自動 | 自動 |
| 事務隔離 | 依賴底層引擎 | Repeatable Read | 僅 Read Committed |
| 應用改造 | 需換 Fabric JDBC 驅動 | 零改造 | 需改 NDB 引擎 |
| 寫入效能 (100 條測試) | ~2000ms | ~600ms (接近原生) | 視分片分布 |
最終選型建議
首選:Percona XtraDB Cluster (Galera) —— 成熟度高、InnoDB 原生、零改造、同步強一致、擴展極簡。
架構部署參考:
- 2 節點:雙主 + HAProxy (VIP/Keepalived),任一掛掉另一接管
- 3+ 節點:標準 Galera 集群,任 2 故障仍可服務,Quorum 機制防腦裂
- 跨機房:同城雙活 <5ms 延遲可用;異地建議異步複製 + 手工切換
避坑提醒: 生產必配 wsrep_slave_threads (並行應用)、gcs.fc_limit (流控閾值)、監控 wsrep_local_send_queue / wsrep_flow_control_paused 指標,預防流控風暴。