單庫單表性能觸頂時,Sharding(分片)將數據按規則分散到多個數據庫實例,實現水平擴展。本文闡述 Sharding 適用場景、與 Partition 區別、核心路由算法、中間件選型(ShardingSphere/ProxySQL/Vitess/TDDL)、分布式事務與全局唯一 ID 解決方案。
| 維度 | Sharding (分片) | Partition (分區) |
|---|---|---|
| 部署範圍 | 跨多台物理服務器/實例 | 單實例內多文件 |
| 擴展性 | 水平無限擴展(Scale Out) | 受限於單機 CPU/內存/磁盤 |
| 路由層 | 應用/中間件決定目標實例 | 優化器自動分區裁剪 |
| 事務支援 | 跨分片分布式事務複雜 | 本地事務原生支援 |
| 運維複雜度 | 高(多實例備份、監控、變更) | 低(單實例管理) |
結論:Partition 是單機優化手段;Sharding 是分布式架構手段。兩者可結合:分片間用 Partition 管理歷史數據。
0-1000萬 → shard1, 1000萬-2000萬 → shard2,範圍查詢友好,但易熱點(新範圍寫入集中)。shard_id = user_id % N,分布均勻,擴容需重分布(Consistent Hashing 緩解)。shard_map(tenant_id → shard_id),靈活支援業務變更,需緩存加速。| 中間件 | 模式 | 語言 | 特點 |
|---|---|---|---|
| ShardingSphere | JDBC/Proxy/Sidecar | Java | 功能全、社區活、支援分布式事務、讀寫分離、影子庫 |
| ProxySQL | Proxy | C++ | 高性能、Lua 腳本路由、查詢重寫、連接池、熔斷 |
| Vitess | Proxy (vtgate) | Go | YouTube 驗證、K8s 原生、支援分片遷移、在線 DDL |
| TDDL (Taobao Distributed Data Layer) | JDBC | Java | 阿里內部孵化、強一致性分布式事務、動態配置 |
Sharding 是突破單機極限的「核武器」,但帶來架構複雜度指數級上升。能不分片盡量不分片(優化 SQL、讀寫分離、分區表、緩存);必須分片時,選擇成熟中間件、建立完善治理體系(元數據管理、監控告警、演練預案),將複雜度封裝在基礎設施層,業務層保持無感。