Mímisbrunnr知恵の泉

← 分散システム 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:パーティショニング/シャーディング | 関連:ゴシップ・反エントロピー・故障検出(SWIM)分散コンピューティングの誤謬(8つの誤謬)

要点(BLUF)

問題設定 ── ノード追加で全移動は困る

パーティショニング/シャーディングmod N ハッシュを使うと、ノードを1台足して N→N+1 になった瞬間、ほとんどのキーの割り当て先が変わる。再配置でデータ大移動が起き、キャッシュは総ミス、可用性が落ちる(分散コンピューティングの誤謬(8つの誤謬) の「トポロジは変わらない」が破れる場面)。

アルゴリズム ── リングと時計回り

flowchart LR
    K["キー hash(key)"] -->|"リング上で時計回り"| N["最初に出会うノードが担当"]
    ADD["新ノード追加"] -->|"その区間のキーだけ"| MOVE["新ノードへ移動(他は不動)"]
  1. ハッシュ空間を**円環(0〜2^m−1 を環状)**とみなす。
  2. 各ノードを hash(node) でリング上に配置。
  3. キー hash(key) から時計回りに最初のノードが担当。
  4. ノード追加時、影響を受けるのは追加点とその直前ノードの間のキーだけ。他は不動。

仮想ノード:物理ノード1台を hash(node#0), hash(node#1), … と多数の点で配置。これで各物理ノードの担当区間が細かく分散し、負荷が平準化し、ノード故障時の引き継ぎも複数ノードに分散される。

具体例 ── 移動キー数を実測(実機)

ラボ 06-04_consistent_hashing.py。1万キーを5ノードに配置し、6ノードへ1台追加したときの移動キー数を、素朴な mod-N と一貫性ハッシュで比較:

== ノード追加時に再配置されるキーの割合 (キー総数 10000) ==

素朴な mod-N (5->6):
  移動したキー: 8361 / 10000 = 83.6%
  -> ほぼ全キーが再配置される(剰余が総入れ替え)

一貫性ハッシュ (5->6, 仮想ノード100):
  移動したキー: 1476 / 10000 = 14.8%
  -> 理論値 1/(N+1)=1/6=16.7% 近傍。追加ノードの担当ぶんだけ動く

mod-N は83.6%(ほぼ全移動)。一貫性ハッシュは14.8%——理論値 1/(N+1)=1/6=約16.7% の近傍に収まり、移動するのは新ノードが引き受ける区間のキーだけ。スケール変更の衝撃が桁違いに小さいことが定量的に確認できます。

正しさ/性質の観点

他手法との比較

方式ノード追加時の移動負荷均等レンジ検索
mod N ハッシュほぼ全部(83.6%実測)不可
一貫性ハッシュ約 1/(N+1)(14.8%実測)仮想ノードで良不可
固定数パーティションパーティション単位で移動設計依存範囲分割なら可

なぜ分散だと難しいか(直観)

分散ハッシュテーブルの肝は「ノード集合が動的に変わる」こと。mod N は N に全キーが依存するので N が変わると総崩れ。一貫性ハッシュは「キーの居場所をN に依存させず、リング上の相対位置で決める」ことで、変化の影響を局所に閉じ込めます。変化に強い割り当てという発想が、動的クラスタの前提に噛み合っています。

⚠️ よくある誤解・落とし穴

対応ラボ

distributed-systems-study/labs/06-04_consistent_hashing.py(5→6ノードで mod-N が83.6%移動、一貫性ハッシュが14.8%移動を確認済み)。

関連

第6章 レプリケーションとパーティショニング 目次