什麼是資料分片#
資料分區(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)#
需要變更分片方案的常見原因:
- 資料分佈不均——例如某個郵遞區號的地點數量過多,單一分區無法容納
- 分片負載過重——例如處理使用者照片的 DB 分片請求量過大
再平衡意味著分區方案變更,所有現有資料需要遷移至新位置。在不造成服務停機的情況下完成此操作極為困難。使用目錄式分區可讓再平衡較為容易,但代價是增加系統複雜度,並引入新的單點故障(Single Point of Failure)——即查詢服務/資料庫本身。