【いっかんせいはっしゅ】

一貫性ハッシュ とは?

最終更新:
💡 担当が増えても、引っ越すデータを少なくする

ノードの増減で担当するキーが変わる範囲を抑える割り当て手法。代表的な方式では、キーとノードをハッシュ値の輪に配置し、輪をたどって担当ノードを決める。

📌 このページのポイント
一貫性ハッシュ:担当の変更を抑えるABCキー K時計回りの次のノードへK → Bノード追加担当が変わる範囲を抑える仮想ノード:一台を複数の位置に置く輪の例と、固定スロット方式を区別しよう
単一の担当を選ぶリングの例。実際の複製や移行は別に設計します。
ひよこ ひよこ
サーバー数で割る方法とは、どう違う?
ペンギン先生 ペンギン先生
例えばhash(key) % Nで担当を決めると、サーバー数Nの変更で多くのキーの担当が変わるよ。全部が必ず変わるわけではない。一貫性ハッシュは、増減で変わる範囲を抑えるための割り当て方法なんだ。
ひよこ ひよこ
リングでは、どう決める?
ペンギン先生 ペンギン先生
ノードとキーをハッシュ値の輪に置き、時計回りで次にあるノードを担当とする例があるよ。途中に新しいノードを入れると、その前の区間のキーを引き受ける。ほかの区間は担当を保てるんだ。
ひよこ ひよこ
データの偏りは、なくなる?
ペンギン先生 ペンギン先生
必ず均等にはならないよ。仮想ノードでは、一つの物理ノードを輪の複数の位置に置いて分散を調整する。担当位置やキー、アクセスの偏りもあるので、実際の負荷を確かめる必要があるね。複製やデータの移行も別に設計するんだ。
ひよこ ひよこ
DynamoDBやRedisも、この輪なの?
ペンギン先生 ペンギン先生
AmazonのDynamo論文は、リングと仮想ノードを使う代表的な資料だよ。ただし、その説明をそのまま現在のDynamoDBへ当てはめないようにしよう。Redis Clusterの仕様は16384個のハッシュスロットに割り当てる方法で、このリングの例とは区別するね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「一貫性ハッシュ」って出てきたら「サーバーの増減で、データの担当変更を少なくする割り当て方法」と思えばだいたいOK!
📖 おまけ:英語の意味
「Consistent Hashing」 = 一貫性のあるハッシュ法
💬 Consistent は「一貫した」という意味で、ノードが変わってもハッシュの割り当てが大きく変わらないということだよ

参考資料

← 用語集にもどる