再平衡 (Rebalancing)

★★★★Reviewed

FromDDIADatabase Internals

📚 From the Books

再平衡 (Rebalancing)Partitioning

當節點增減或資料傾斜時,要把分片重新分配到節點上。難點是:搬最少的資料、過程中不中斷服務、且事後負載均勻。再平衡策略的好壞,決定了叢集能不能平順地擴縮。

🧠 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

✍️ My Notes

2026-07-01

  • Q: 「固定數量分片」聽起來最簡單,為什麼還需要動態分片?
  • A: 固定分片在「資料量大致均勻、可預估」時很好用,因為映射永不變、只搬整分片。但若用 key 範圍分片,資料分佈會嚴重不均(某些區間爆量、某些空),固定切法會讓少數分片變超大熱點。動態分片讓大分片自動分裂、小分片合併,分片大小自我調節——這正是 range 分片要搭配動態再平衡的原因。

📖 Further Reading

🔗 Dive Deeper