コンシステントハッシュ
ノードの追加・削除時にデータの再配置を最小限に抑える分散ハッシュアルゴリズム
コンシステントハッシュとは
コンシステントハッシュ (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 | データのレプリケーション先の決定 |
現場での応用を知るには関連書籍も役立つ。
この記事は役に立ちましたか?
関連用語
シャーディング
データを複数のデータベースインスタンスに水平分割し、書き込みスループットとストレージ容量をスケールさせる手法
DynamoDB
AWS のフルマネージド NoSQL データベースで、ミリ秒単位のレイテンシとシームレスなスケーリングを提供する
ロードバランシング
複数のサーバーにトラフィックを分散し、可用性とスケーラビリティを向上させる仕組み
ハッシュ
任意のデータを固定長の値に変換する関数で、データの整合性検証や高速検索に使う
ハッシュテーブル
キーをハッシュ関数で変換し、O(1) でデータを検索・挿入・削除するデータ構造
ホットパーティション
特定のパーティションにアクセスが集中し、スループットが低下する DynamoDB の性能問題
関連する記事
技術書の読書ノート術 - 付箋・マーカー・デジタルの使い分け
技術書を読むときのノートの取り方を比較します。付箋派、マーカー派、デジタルノート派、それぞれの長所と短所を実体験をもとに紹介します。
README を書くように本を読む - エンジニアのための構造化読書法
エンジニアが日常的に書く README のフォーマットを読書に応用する方法を紹介します。目的・使い方・注意点の 3 点で本の内容を整理すると、知識の再利用性が飛躍的に高まります。
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで理解の深さと速度を飛躍的に高める方法を解説します。