什麼是資料分片#

資料分區(Data Partitioning),又稱為分片(Sharding),是一種將大型資料庫拆分為多個較小部分的技術。其核心目的是將資料庫或資料表分散至多台機器,以改善:

  • 可管理性(Manageability)
  • 效能(Performance)
  • 可用性(Availability)
  • 負載均衡(Load Balancing)

資料分片的根本理由在於:當系統達到一定規模後,透過水平擴展(增加更多機器)垂直擴展(升級更強大的伺服器) 更為經濟且可行。

分區方法(Partitioning Methods)#

以下是三種大型應用中最常用的分區方法。

水平分區(Horizontal Partitioning)#

不同的資料列(Row)放入不同的資料表

  • 例如:儲存地點資料時,郵遞區號小於 10000 的存入一張表,大於 10000 的存入另一張表
  • 又稱為基於範圍的分片(Range-Based Sharding)

若用來分片的欄位範圍選擇不當,會導致伺服器負載不均。例如,以郵遞區號分區假設各區域的地點數量均勻分佈,但人口密集的區域(如曼哈頓)資料量會遠多於郊區。

垂直分區(Vertical Partitioning)#

將與特定功能相關的資料表存放在獨立的伺服器上:

  • 例如:類似 Instagram 的應用中,可將使用者個人資料放在一台 DB 伺服器、好友清單放在另一台、照片放在第三台
  • 實作相對簡單,對應用程式的影響較小

垂直分區的主要問題是:若應用持續成長,可能需要對某個功能的資料庫進一步分區(例如,單一伺服器無法處理 1.4 億使用者上傳的 100 億張照片的所有中繼資料查詢)。

目錄式分區(Directory-Based Partitioning)#

一種鬆耦合(Loosely Coupled) 的方法,用於解決上述方案的限制:

  • 建立一個查詢服務(Lookup Service),掌握當前的分區方案,並將其抽象化
  • 查詢特定資料所在位置時,向目錄伺服器查詢每個元組鍵(Tuple Key)與 DB 伺服器的對映
  • 優點:可在不影響應用程式的情況下,動態新增伺服器或變更分區方案

分區標準(Partitioning Criteria)#

鍵值或雜湊分區(Key or Hash-Based Partitioning)#

  • 對儲存實體的某個鍵屬性套用雜湊函數(Hash Function),計算出分區編號
  • 例如:100 台 DB 伺服器,ID 為遞增數值時,雜湊函數可為 ID % 100,得出目標伺服器編號
  • 能確保資料在伺服器間均勻分配

此方法的根本問題在於:它實際上固定了 DB 伺服器的總數。新增伺服器意味著要變更雜湊函數,需要重新分配資料並造成服務停機。解決方案是使用一致性雜湊(Consistent Hashing)

清單分區(List Partitioning)#

  • 每個分區被分配一組值的清單
  • 插入新紀錄時,檢查鍵值屬於哪個分區的清單,即存入該分區
  • 例如:將冰島、挪威、瑞典、芬蘭、丹麥的使用者統一存入「北歐國家」分區

輪詢分區(Round-Robin Partitioning)#

  • 一種確保資料均勻分佈的簡單策略
  • n 個分區時,第 i 筆元組分配至分區 i mod n

複合分區(Composite Partitioning)#

  • 結合上述任意分區方式組成新方案
  • 例如:先進行清單分區,再進行雜湊分區
  • 一致性雜湊可被視為雜湊分區與清單分區的複合,其中雜湊將鍵空間縮減至可列舉的大小

分片的常見問題#

在分片資料庫上,某些操作會受到額外的限制。大部分限制源自於:跨表或同表跨列的操作不再於同一台伺服器上執行

聯結與反正規化(Joins and Denormalization)#

  • 在單一伺服器上執行聯結(Join)很簡單,但在分片後跨分區執行聯結往往不可行
  • 跨分區聯結的效能極差,因為資料需要從多台伺服器彙整
  • 常見解法是對資料庫進行反正規化(Denormalization),使原本需要聯結的查詢可從單一表完成
  • 代價:需要處理反正規化帶來的資料不一致問題

參照完整性(Referential Integrity)#

  • 在分片資料庫中強制執行外鍵(Foreign Key) 等資料完整性約束極為困難
  • 大多數 RDBMS 不支援跨不同伺服器的資料庫之間的外鍵約束
  • 需要參照完整性的應用通常必須在應用程式碼中自行實現
  • 常需定期執行 SQL 任務清理孤立參照(Dangling References)

再平衡(Rebalancing)#

需要變更分片方案的常見原因:

  1. 資料分佈不均——例如某個郵遞區號的地點數量過多,單一分區無法容納
  2. 分片負載過重——例如處理使用者照片的 DB 分片請求量過大

再平衡意味著分區方案變更,所有現有資料需要遷移至新位置。在不造成服務停機的情況下完成此操作極為困難。使用目錄式分區可讓再平衡較為容易,但代價是增加系統複雜度,並引入新的單點故障(Single Point of Failure)——即查詢服務/資料庫本身。