單實例垂直擴展(加 CPU/內存/SSD)存在物理上限與成本指數增長。向外擴展通過將數據/負載分散到多個獨立實例,突破單機瓶頸,實現線性擴展能力。
| 維度 | 水平分片 | 垂直拆分 |
|---|---|---|
| 定義 | 同表結構,按鍵值範圍/Hash 分散到多實例 | 不同業務域表分離到不同實例 |
| 典型場景 | 海量單表(訂單、日誌、傳感器數據) | 微服務拆分、核心/非核心業務隔離 |
| 數據分佈 | 每片數據互斥,邏輯完整 | 實例間表結構不同,業務邊界清晰 |
| 跨片查詢 | 複雜,需中間層聚合或分布式事務 | 少,主要通過服務調用或異步同步 |
| 擴展方式 | 增加分片、重平衡 | 新增業務域實例 |
UserID % N、OrderID % N。優點:寫入均勻;缺點:範圍查詢需散播全片、擴容需重分片。
// 概念代碼:分片路由器
public class ShardRouter {
private final Map shardMap; // logicShard -> DataSource
public DataSource route(String shardingKey) {
int shardId = Math.abs(shardingKey.hashCode()) % shardMap.size();
return shardMap.get("shard_" + shardId);
}
// 廣播查詢(無分片鍵)
public List broadcastQuery(String sql) {
return shardMap.values().parallelStream()
.map(ds -> execute(ds, sql))
.flatMap(List::stream)
.collect(Collectors.toList());
}
}
按照 DDD 限界上下文劃分:用戶中心、訂單中心、支付中心、倉儲中心、營銷中心……每個上下文獨立部署、獨立數據庫、獨立演進。
SQL Server 原生支持 分區視圖:
-- 每分片建立 CHECK 約束
CREATE TABLE Orders_2024Q1 (... CHECK (OrderDate >= '2024-01-01' AND OrderDate < '2024-04-01'));
CREATE TABLE Orders_2024Q2 (... CHECK (OrderDate >= '2024-04-01' AND OrderDate < '2024-07-01'));
-- 視圖聯合
CREATE VIEW dbo.Orders_All AS
SELECT * FROM Orders_2024Q1
UNION ALL SELECT * FROM Orders_2024Q2
UNION ALL SELECT * FROM Orders_2024Q3
UNION ALL SELECT * FROM Orders_2024Q4;
優化器根據 WHERE OrderDate ... 自動裁剪分片(Partition Elimination),實現透明路由。
向外擴展不是銀彈,引入了分佈式系統固有的複雜性。建議:先優化單機(索引、緩存、讀寫分離、歸檔),單機極限仍不滿足時,再按業務邊界垂直拆分,最後對單一巨大表實施水平分片。每一步都要有明確的 ROI 試算與回滾預案。