コンシステントハッシュ
ノードの追加・削除時にデータの再配置を最小限に抑える分散ハッシュアルゴリズム
分散システムアルゴリズム
コンシステントハッシュとは
コンシステントハッシュ (Consistent Hashing) は、ノードの追加・削除時にデータの再配置を最小限に抑える分散ハッシュアルゴリズムである。1997 年に David Karger らが提案した。DynamoDB、Cassandra、Redis Cluster、CDN のルーティングで使われている。
通常のハッシュの問題
ノード = hash(key) % N
N=3 の場合: hash("user:1") % 3 = 1 → ノード 1
N=4 に増設: hash("user:1") % 4 = 2 → ノード 2 (移動!)
ノード数 N が変わると、ほぼ全てのキーの割り当て先が変わる。キャッシュサーバーの増設でキャッシュヒット率が一時的に 0% になる。
コンシステントハッシュの仕組み
ノード A (0°)
/ \
ノード D (270°) ノード B (90°)
\ /
ノード C (180°)
キー "user:1" → ハッシュ値 45° → 時計回りで最初のノード B に割り当て
- ノードとキーを同じハッシュリング (0〜2^32) 上に配置
- キーは時計回りで最初に見つかるノードに割り当て
- ノード追加時: 新ノードの直前のキーだけが移動 (全体の 1/N)
- ノード削除時: 削除ノードのキーが次のノードに移動
仮想ノード (Virtual Nodes)
物理ノードが少ないとデータが偏る。各物理ノードに複数の仮想ノードを割り当てて均等に分散する。
物理ノード A → 仮想ノード A-1 (30°), A-2 (120°), A-3 (250°)
物理ノード B → 仮想ノード B-1 (60°), B-2 (180°), B-3 (300°)
DynamoDB は各パーティションに複数の仮想ノードを割り当て、データを均等に分散している。
DynamoDB のパーティショニング
DynamoDB はコンシステントハッシュでパーティションキーのハッシュ値に基づいてデータを分散する。
パーティションキー "user:123" → ハッシュ → パーティション B
パーティションキー "user:456" → ハッシュ → パーティション A
パーティションキーの設計が偏ると (例: 日付をキーにする)、特定パーティションにアクセスが集中する「ホットパーティション」問題が発生する。
他の分散システムでの利用
| システム | 用途 |
|---|---|
| DynamoDB | パーティションキーによるデータ分散 |
| ElastiCache (Redis Cluster) | キャッシュデータのシャーディング |
| CloudFront | オリジンサーバーへのルーティング |
| Cassandra | データのレプリケーション先の決定 |
現場での応用を知るには関連書籍も役立つ。