單 MySQL 實例受限於單進程多線程模型,無法充分利用多核 CPU;寫入吞吐受限於單主架構;存儲容量受限於單機磁盤。當 QPS、存儲、併發突破單機上限,**水平擴展**成為唯一出路。
核心決策:分區鍵選擇 —— 直接決定負載均勻度、查詢路由複雜度、跨分區事務難度。
shard_id = user_id % N。優點:簡單、負載均勻。缺點:擴容需遷移數據、跨分區查詢需聚合。shard_id = hash(username) % N。優點:字符串鍵也能均勻。缺點:同樣面臨擴容遷移。0-1000萬 → shard1, 1000萬-2000萬 → shard2。優點:擴容只需新增分區、範圍查詢高效。缺點:熱點數據集中(新用戶集中在最新分區)。避坑指南:
不同域採用不同存儲引擎、不同高可用策略、不同備份策略,互不干擾。
┌─────────────┐
寫入 ────▶│ Master │
└──────┬──────┘
│ Binlog 異步/半同步複製
┌─────────┼─────────┐
▼ ▼ ▼
Slave1 Slave2 Slave3
(讀) (讀) (讀)
用戶發帖 → 寫 Master → 立即讀 Slave → **可能讀不到剛發的帖**。
| 方案 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 關鍵讀走 Master | 寫入後相關查詢強制路由 Master | 強一致、簡單 | Master 壓力大、失去讀寫分離意義 | 用戶中心、訂單詳情等核心路徑 |
| 延遲讀 | 寫入後 N 秒內讀 Master,之後讀 Slave | 實現簡單 | N 秒內不一致、難以精確控制 | 非核心業務、報表查詢 |
| 版本號/時間戳檢查 | 讀前比對版本號,舊則重試或走 Master | 應用層可控 | 增加 RTT、代碼複雜 | 高一致要求業務 |
| 半同步複製 + MASTER_POS_WAIT() | 寫入後調用 MASTER_POS_WAIT(pos, timeout) 等待從庫追上 | 數據庫層面保證 | 增加寫入延遲、超時處理複雜 | 金融轉賬等強一致場景 |
| GTID + 從庫狀態檢查 | 讀前檢查 Slave_Executed_Gtid_Set 包含寫入 GTID | 精確可控 | 需 MySQL 5.6+、增加一次查詢 | 現代架構推薦 |
| 方案 | 特點 | 成熟度 | 備註 |
|---|---|---|---|
| 應用層自主路由 | 最靈活、零依賴、性能最好 | ⭐⭐⭐⭐⭐ | 需開發投入,推薦成熟團隊 |
| MySQL Router (官方) | 輕量、支援讀寫分離、自動故障轉移 | ⭐⭐⭐⭐ | InnoDB Cluster 配套組件 |
| ProxySQL | 功能豐富:查詢重寫、緩存、熔斷、鏡像、分片路由 | ⭐⭐⭐⭐⭐ | 生產廣泛使用,學習曲線中等 |
| Vitess | YouTube 開源、大規模分片管理、兼容 MySQL 協議 | ⭐⭐⭐⭐ | 架構複雜、運維門檻高 |
| ShardingSphere (Java) | 分片、讀寫分離、影子庫、加密、SQL 審計 | ⭐⭐⭐⭐ | Java 生態首選 |
| MyCat | 國產老牌、功能全、社區活躍 | ⭐⭐⭐ | 穩定性較 ProxySQL 稍弱 |
硬件負載均衡(F5、A10)僅做 4 層轉發,**不感知 MySQL 協議狀態**(如從庫掛掉、複製延遲、只讀狀態)。軟件方案更優:
MySQL 擴展無標準答案,**「業務驅動架構,簡單優於複雜」**。優先用好單機,再讀寫分離,再功能分區,最後才水平分片。每一步都要有明確的性能指標觸發線、回滾預案、監控儀表盤。切忌為分片而分片,過度設計是架構最大的債。