分布式哈希表(DHT)的简单基本解释
有没有人可以解释一下DHT的工作原理?
没有太重,只是基础。
好的,他们基本上是一个非常简单的想法。 DHT为您提供了一个类似字典的界面,但节点分布在整个networking中。 使用DHT的技巧是获取存储特定密钥的节点是通过散列该密钥来find的,所以实际上,散列表存储区现在是networking中的独立节点。
这给了很多容错和可靠性,并且可能有一些性能上的好处,但是也带来了很多麻烦。 例如,当一个节点离开networking时会发生什么情况,是由于失败还是以其他方式? 而且,如何在节点join时重新分配密钥,以使负载大致平衡。 来想一想,如何均匀分配密钥? 当一个节点join时,你如何避免重蹈覆辙? (记住如果增加桶的数量,你必须在正常的哈希表中做这个)。
一个解决这些问题的DHT的例子是n个节点的逻辑环,每个节点负责1 / n个密钥空间。 一旦将节点添加到networking中,它就会在环上find一个位于其他两个节点之间的位置,并负责其兄弟节点中的某些密钥。 这种方法的好处在于环中没有其他节点受到影响。 只有两个兄弟节点必须重新分配密钥。
例如,假设在三节点环中,第一个节点具有0-10,第二个11-20和第三个21-30。 如果第四个节点出现并插入节点3和0之间(记住,它们是在一个环中),它可以承担三分之一的密钥空间的责任,所以现在它处理26-30,节点3处理21 -25。
还有许多其他覆盖结构,例如使用基于内容的路由来find存储密钥的正确节点。 在一个环中定位一个密钥需要一次search一个节点(除非你保留一个本地查找表,在成千上万个节点的DHT中有问题),这是O(n)-hop路由。 其他结构 – 包括增强环 – 保证O(log n)-hop路由,还有一些声称为O(1)-hop路由,代价是维护更多。
阅读维基百科页面,如果您真的想深入了解一下,请查看哈佛大学的这个阅读清单非常全面的资料。
DHT为用户提供与普通哈希表类似的接口(按键查找值),但数据分布在任意数量的连接节点上。 维基百科有一个很好的基本介绍,如果我写更多的话,我基本上会反胃,
我想补充一下HenryR的有用答案,因为我刚刚对一致性哈希值有所了解。 正常/天真的哈希查找是两个variables的函数,其中一个是桶的数量。 一致性哈希的美妙之处在于我们从等式中消除了桶的数量“n”。
在天真哈希中,第一个variables是要存储在表中的对象的关键字。 我们将调用密钥“x”。 第二个variables是桶的数量,“n”。 因此,要确定对象存储在哪个桶/机器中,您必须计算:hash(x)mod(n)。 因此,当你改变桶的数量时,你也改变几乎每个对象的存储地址。
将其与一致的哈希值进行比较。 我们将“R”定义为散列函数的范围。 R只是一些常数。 在一致的哈希中,对象的地址位于hash(x)/ R。 由于我们的查找不再是桶的数量的函数,所以当我们改变桶的数量时,我们的重新映射就会减less。
看看这个维基百科文章或这个幻灯片
看看亚马逊的迪纳摩,它解释了一个简单而新颖的基于圈一致哈希的DHT实现。