ノードが DHT ネットワークに参加すると、再マッピングを最小限に抑えるために、新しいノードが一貫したハッシュの円の最大間隔を均等に分割することが最適なようです。ただし、これは 2 nノードに対してのみ最適です( n = 1 で開始すると仮定)。キーが一様にアクセスされる場合、他のすべての番号はホットスポットを作成します。
- n =2, 1 / 2 1 / 2 , 最適
- n =3, 1 / 4 1 / 4 1 / 2 , 1 / 3のノードが1 / 2のトラフィックを処理するホットスポット
- n =4, 1 / 4 1 / 4 1 / 4 1 / 4 , 最適
- n =5、1 / 8 1 / 8 1 / 4 1 / 4 1 / 4 、 3 / 5のノードが3 / 4のトラフィックを処理するホットスポット
より多くの再マッピングを発生させながらホットスポットを最小限に抑えるアプローチは、新しいノードを均等に再配布することです。
- n = 2、1 / 2 1/2 _ _
- n = 3、1 / 3 1/3 1/3 _ _ _ _
以下のような実装では、かなり少数の要素が再マップされ (実際に最小化されているかどうかは不明)、ホットスポットが排除され、基本的な一貫したハッシュ アルゴリズムが維持されます。
// 10 perfectly distributed hash keys, later referred to as a-j
var hashKeys = [0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95];
for (var kNodeCount = 1; kNodeCount < 5; kNodeCount++) {
var buckets = [];
for (var k = 0; k < kNodeCount; k++) buckets[k] = [];
// Distribute keys to buckets:
for (var i = 0; i < hashKeys.length; i++) {
var hashKey = hashKeys[i];
var bucketIndex = Math.floor(hashKey * kNodeCount);
buckets[bucketIndex].push(hashKey);
}
console.log(kNodeCount, buckets);
}
そこからの遷移 (数字ではなく文字) は次のとおりです。
[abcdefghij]
-> [abcde][fghij]
-> [abc][defg][hij]
->[ab][cde][fg][hij]
これに対する他の/より良い解決策はありますか (これは解決済みの問題ですか)? 私は一般的にDHTと分散アルゴリズムに比較的慣れていませんが、私が読んだDHT / p2p /分散アルゴリズムでこれに対処していることは見つかりませんでした. 私の特定のシナリオでは、ホットスポットを最小限に抑えることが重要ですが、再マッピングを最小限に抑えることはコストがかかりません。