隨著業務增長,單一 MySQL 實例終將觸及硬體上限。本文系統梳理 MySQL 水平擴展三大核心模式——**多實例部署、資料分區分庫、負載均衡**——的架構原理、技術選型、中間件對比與落地避坑指南,助你構建可線性擴展的資料庫集群。
# 實例 1: 核心業務 (port 3306)
--datadir=/data/mysql_3306 --port=3306 --socket=/tmp/mysql_3306.sock
# 實例 2: 報表/備份 (port 3307)
--datadir=/data/mysql_3307 --port=3307 --socket=/tmp/mysql_3307.sock
# 資源隔離建議
-- innodb_buffer_pool_size: 各實例分配物理內存 60-70% 總和
-- innodb_io_capacity: 根據磁碟 IOPS 分配
-- CPU 綁核: taskset / cgroups 限制各實例核心數
-- 分區鍵選擇原則
-- 用戶業務: user_id / 手機號 hash
-- 訂單業務: user_id (保證同用戶訂單同庫) 或 order_id
-- 時間序列: 年月日 (配合分區表原生支援)
-- 分片算法
-- 取模: user_id % N (擴容需重分片)
-- 一致性哈希: 輕量級擴容
-- 範圍分片: 連續 ID 區間 (熱點風險)
| 方案 | 類型 | 優點 | 缺點 | 適用階段 |
|---|---|---|---|---|
| 應用層硬編碼 | SDK/DAO | 完全可控、零依賴、效能最高 | 業務耦合重、擴容改造大、分散邏輯難維護 | 早期、簡單場景 |
| ProxySQL | L7 代理 | 規則式路由、讀寫分離、快取、熔斷、動態配置、無單點 | 學習曲線陡、Lua 腳本複雜、單機吞吐上限 ~5 萬 QPS | 中大型、核心路徑 |
| MySQL Router | 官方代理 | InnoDB Cluster 原生整合、輕量、自動故障轉移 | 功能較簡單、路由規則靈活度低 | InnoDB Cluster 體系 |
| ShardingSphere | JDBC/Proxy | 分片算法豐富、分散式事務 (XA/BASE)、影子表測試、多語言 | Java 生態綁定、Proxy 模式效能損耗 | Java 微服務、複雜分片 |
| Vitess | K8s 原生 | YouTube 千萬 QPS 驗證、原生 K8s、連線池、查詢重寫、備份整合 | 架構複雜、運維門檻高、Go 生態 | 雲原生、超大規模 |
| 算法 | 原理 | 適用場景 |
|---|---|---|
| 隨機 / 輪詢 | 均勻分發 | 從庫規格一致、負載均勻 |
| 最少連接 | 導向最閒實例 | 查詢耗時差異大、規格不一 |
| 響應速度 / 加權 | 實時探活調整權重 | 混合負載、自適應最優 |
網絡層面均衡,缺乏資料庫語義感知 (如讀寫分離、事務邊界),通常作為前端入口,後接軟體代理層。
單機優化 → 讀寫分離 (主從) → 單機多實例 → 垂直分庫 → 水平分片 (Sharding)
↓
負載均衡 (LVS/HAProxy/ProxySQL)
↓
中間件統一入口 (ProxySQL/ShardingSphere/Vitess)
↓
雲原生資料庫 (PolarDB/TiDB/Aurora/RDS Proxy)
沒有銀彈,只有「業務增長階段 × 技術複雜度 × 團隊能力」的動態平衡。選擇能**未來 12-18 個月支撐業務**且**團隊能駕馭**的方案,持續演進,才是正道。