當節點增減或資料傾斜時,要把分片重新分配到節點上。難點是:搬最少的資料、過程中不中斷服務、且事後負載均勻。再平衡策略的好壞,決定了叢集能不能平順地擴縮。
🧠 Intuition
TIP
再平衡的第一守則是「不要用 hash(key) % N」——N 一變幾乎所有 key 都要搬。好策略讓「搬遷量」只正比於「節點變動的比例」,而不是整個資料集。
- 目標三件事:搬遷量最小、搬遷期間讀寫照常、結束後各節點負載相近。
- 關鍵手法是把「分片數」與「節點數」解耦:分片是邏輯單位,節點只是分片的容器。
⚖️ Tradeoffs
固定數量分片 (Fixed number of partitions) — 最常見
- 一開始就切成遠多於節點的分片數(如 1000 個),每個節點持有多個分片。
- 加節點:從每個既有節點「偷」幾個整分片過來;刪節點反之。只搬整分片,key→分片的映射不變。
- 代價:分片數選定後難改;選太大有額外管理開銷,選太小未來無法細分。
- 用於 Elasticsearch、Couchbase、Riak。
動態分片 (Dynamic partitioning) — 隨資料量增減
- 分片過大就分裂、過小就合併(類似 B-tree)。分片數隨資料量自適應。
- 適合 key 範圍分片(range),避免熱點區間撐爆單一分片。
- 用於 HBase、MongoDB;range 分片的代表作法。
依節點比例分片 (Partitioning proportional to nodes)
- 分片數固定為「每節點固定數量」,加節點即隨機分裂既有分片接管一半。
- 是 Cassandra/Dynamo 風格一致性雜湊 + 虛擬節點的思路。
自動 vs 手動再平衡
- 全自動:省事,但可能在節點短暫變慢時誤判、觸發連鎖搬遷,與正常流量搶資源 → 級聯故障。
- 半自動:系統算出建議方案,由人確認後執行——多數生產系統的折衷。
🔑 Takeaways
- 再平衡的核心是把分片數和節點數解耦,並避免
% N這種「動一個就全搬」的映射。 - 固定數量分片:映射不變、只搬整分片,最易理解(hash 分片常用)。
- 動態分片:分裂/合併隨資料量自適應,是 range 分片避免熱點的標配。
- 全自動再平衡會與故障偵測互相放大成級聯故障——生產上多採人確認的半自動。
2026-07-01
- Q: 「固定數量分片」聽起來最簡單,為什麼還需要動態分片?
- A: 固定分片在「資料量大致均勻、可預估」時很好用,因為映射永不變、只搬整分片。但若用 key 範圍分片,資料分佈會嚴重不均(某些區間爆量、某些空),固定切法會讓少數分片變超大熱點。動態分片讓大分片自動分裂、小分片合併,分片大小自我調節——這正是 range 分片要搭配動態再平衡的原因。