首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 水平/垂直分庫分表:向外擴展架構設計與工程落地指南

     編輯:關於SqlServer

為什麼要向外擴展?

單實例垂直擴展(加 CPU/內存/SSD)存在物理上限與成本指數增長。向外擴展通過將數據/負載分散到多個獨立實例,突破單機瓶頸,實現線性擴展能力。

核心模式對比

維度水平分片垂直拆分
定義同表結構,按鍵值範圍/Hash 分散到多實例不同業務域表分離到不同實例
典型場景海量單表(訂單、日誌、傳感器數據)微服務拆分、核心/非核心業務隔離
數據分佈每片數據互斥,邏輯完整實例間表結構不同,業務邊界清晰
跨片查詢複雜,需中間層聚合或分布式事務少,主要通過服務調用或異步同步
擴展方式增加分片、重平衡新增業務域實例

水平分片深度實踐

1. 分片鍵選擇:業務核心維度

  • 範圍分片:按時間(月/季)、地域、租戶 ID。優點:範圍查詢單片命中;缺點:熱點寫入(最新分片壓力大)。
  • Hash 分片:UserID % N、OrderID % N。優點:寫入均勻;缺點:範圍查詢需散播全片、擴容需重分片。
  • 一致性 Hash + 虛擬節點:平滑擴容,僅遷移少量數據。

2. 中間層路由架構


// 概念代碼:分片路由器
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());
    }
}

3. 分布式事務方案

  • 最終一致性(推薦):本地事務 + 事件發布(Kafka/RocketMQ)+ 消費者補償/重試,如 Seata AT 模式、Outbox 模式。
  • 強一致性(少用):XA 兩階段提交(MSDTC),性能差、鎖持久、單點風險。
  • Saga 模式:長事務拆分為一系列本地事務 + 反向補償操作。

4. 分片變更:擴容/縮容/遷移

  1. 雙寫期:舊分片邏輯 + 新分片邏輯並行寫入,數據同步校驗。
  2. 切流量:灰度切換讀流量,驗證無誤後切寫流量。
  3. 下線舊邏輯:清理舊分片數據、移除路由配置。

垂直拆分工程指南

1. 業務域識別:限界上下文

按照 DDD 限界上下文劃分:用戶中心、訂單中心、支付中心、倉儲中心、營銷中心……每個上下文獨立部署、獨立數據庫、獨立演進。

2. 共享數據處理

  • 主數據同步:核心實體(用戶、商品)由主域發布變更事件,下游域訂閱同步冗余副本(最終一致)。
  • 引用不複製:非核心屬性通過 RPC/Feign 實時調用主域獲取。

3. 跨域查詢:API 組合 vs CQRS

  • 簡單聚合:API 閘道/後端編排並行調用多服務組裝響應。
  • 複雜報表:CQRS 讀模型,異步構建寬表/物化視圖至專用查詢庫/ES/ClickHouse。

分布式查詢優化:分區視圖與聯合索引

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),實現透明路由。

運維體系建設

  • 統一元數據中心:分片映射表、表結構版本、遷移狀態集中管理。
  • 全鏈路監控:分片級 QPS/RT/錯誤率、同步延遲、分布式事務狀態。
  • 混沌工程演練:定期模擬分片故障、網絡分區、時鐘漂移,驗證降級/熔斷預案。

向外擴展不是銀彈,引入了分佈式系統固有的複雜性。建議:先優化單機(索引、緩存、讀寫分離、歸檔),單機極限仍不滿足時,再按業務邊界垂直拆分,最後對單一巨大表實施水平分片。每一步都要有明確的 ROI 試算與回滾預案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved