当节点加入DHT网络时,新节点在一致散列圆上均匀划分最大间隔似乎是最佳的,以便最小化重新映射。但是,这仅适用于2 n 节点(假设以 n = 1开头);如果统一访问密钥,则所有其他数字都会创建热点:
在产生更多重新映射的同时最小化热点的方法是均匀地重新分配新节点:
通过如下所示的实现,重新映射了一些相当少数量的元素(不确定它是否实际上被最小化),消除了热点,并保留了基本的一致性散列算法。
// 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);
}
&#13;
从那里(字母而不是数字)的过渡是:
[abcdefghij]
- &gt; [abcde][fghij]
- &gt; [abc][defg][hij]
- &gt; [ab][cde][fg][hij]
是否有其他/更好的解决方案(这是一个解决的问题)?我对DHT和分布式算法一般都比较新,但我还没有发现这个在我读过的任何DHT / p2p /分布式算法中都有说明。在我的特定情况下,最小化热点是至关重要的,而最小化重映射则更便宜。
答案 0 :(得分:1)
您可以注意到,随着n
的增长,热点和最佳节点之间的负载差异减小,因此常见的解决方案是引入大量虚拟节点(人为地增加n
值)并使真实节点托管多个虚拟节点,以帮助更均匀地分发数据。
这是工业界的常见做法,例如Riak和Cassandra使用它。你可以在这里阅读: