分布式哈希表(DHT)的简单基本解释

时间:2008-09-27 20:08:25

标签: theory p2p dht

任何人都可以解释DHT的工作原理吗?

没什么太重,只是基础。

6 个答案:

答案 0 :(得分:219)

好吧,从根本上说,这是一个非常简单的想法。 DHT为您提供类似字典的界面,但节点分布在整个网络中。 DHT的技巧是通过散列该密钥来找到存储特定密钥的节点,因此实际上您的散列表桶现在是网络中的独立节点。

这提供了很多容错和可靠性,并且可能带来一些性能优势,但它也带来了许多令人头疼的问题。例如,当节点离开网络时,失败或其他情况会发生什么?如何在节点加入时重新分配密钥,以便负载大致平衡。想想看,无论如何均匀分配密钥?当一个节点加入时,你如何避免重复一切? (如果增加桶的数量,请记住,您必须在普通的哈希表中执行此操作)。

解决其中一些问题的DHT的一个示例是n个节点的逻辑环,每个节点负责密钥空间的1 / n。将节点添加到网络后,它会在环上找到一个位于其他两个节点之间的位置,并负责其兄弟节点中的某些键。这种方法的优点在于环中没有其他节点受到影响;只有两个兄弟节点必须重新分配密钥。

例如,假设在三节点环中,第一个节点具有键0-10,第二个节点具有键20-20和第三个节点21-30。如果第四个节点出现并在节点3和0之间插入(请记住,它们处于一个环中),它可以负责说3个键空间的一半,所以现在它处理26-30和节点3处理21 -25。

还有许多其他覆盖结构,例如使用基于内容的路由来查找存储密钥的正确节点。在环中定位密钥需要一次在一个节点周围搜索环(除非你保留一个本地查找表,在数千个节点的DHT中存在问题),即O(n)-hop路由。其他结构 - 包括增强环 - 保证O(log n)-hop路由,有些声称O(1)-hop路由以更多维护为代价。

阅读维基百科页面,如果您真的想深入了解一下,请查看哈佛大学的coursepage,其中有一个非常全面的阅读清单。

答案 1 :(得分:12)

DHT为用户提供与普通哈希表相同类型的接口(按键查找值),但数据分布在任意数量的连接节点上。维基百科有一个很好的基本介绍,如果我写更多的话,我基本上会反思 -

http://en.wikipedia.org/wiki/Distributed_hash_table

答案 2 :(得分:7)

我想补充HenryR的有用答案,因为我对一致哈希有深入的了解。普通/朴素哈希查找是两个变量的函数,其中一个是桶的数量。一致哈希的美妙之处在于我们从等式中消除了桶“n”的数量。

在幼稚哈希中,第一个变量是要存储在表中的对象的键。我们称之为“x”键。第二个变量是桶的数量,“n”。因此,要确定对象存储在哪个桶/机器中,您必须计算:hash(x)mod(n)。因此,当您更改存储桶的数量时,还会更改几乎每个对象的存储地址。

将此与一致哈希进行比较。让我们将“R”定义为散列函数的范围。 R只是一些常数。在一致散列中,对象的地址位于散列(x)/ R。由于我们的查找不再是存储桶数量的函数,因此当我们更改存储桶数量时,最终会减少重新映射。

http://michaelnielsen.org/blog/consistent-hashing/

答案 3 :(得分:0)

答案 4 :(得分:0)

DHT 的核心是哈希表。键值对存储在 DHT 中,可以使用键查找值。键是值的唯一标识符,范围可以从区块链中的块到地址和文档。

DHT 与普通哈希表的不同之处在于,DHT 上的存储和查找分布在多个(可能是数百万)个节点或机器上。 DHT 的这一特性使它看起来像用于存储和检索的分布式数据库。参与节点之间没有主从层次结构或集中控制。所有节点都被视为对等节点。

DHT 为参与节点提供了自由,以便节点可以随时加入或离开网络。由于这个原因,DHT 被广泛用于点对点 (P2P) 网络。事实上,DHT 研究背后的部分动机源于其在 P2P 网络中的使用。

DHT的特点

  1. 去中心化:因为没有中央权威或协调

  2. 可扩展:系统可以轻松扩展到数百万个节点

  3. 容错:DHT 在所有节点上复制数据存储。 因此,即使一个节点离开网络,也不应该影响网络中的其他节点。

让我们看看在像 Chord 这样流行的 DHT 协议中查找是如何发生的。考虑节点的循环双向链表。每个节点都有一个指向它上一个和下一个节点的引用指针。问题节点旁边的节点称为后继节点。问题节点之前的节点称为前驱节点。

就 DHT 而言,每个节点都有一个唯一的 k 位节点 ID,这些节点按其节点 ID 的升序排列。 假设这些节点排列在称为标识符环的环结构中。对于每个节点,后继节点顺时针方向距离最短。对于大多数节点,这是 ID 最接近但仍大于当前节点 ID 的节点。 要找出适合特定密钥的节点,首先使用一致的哈希技术(如 SHA-1)将密钥 K 和所有节点哈希到恰好 k 位。

SHA1

从环中的任何一点开始,顺时针遍历,直到找到节点 ID 与密钥 K 更接近,但可以大于 K 的节点。该节点负责存储和查找该特定密钥。

Basic Lookup in DHT

在迭代式查找中,每个节点 Q 查询其后继节点以获取 KV(键值)对。如果被查询的节点没有目标key,它会返回一组可以更接近目标的节点S。查询节点 Q 然后查询 S 中离自己更近的节点。这一直持续到目标 KV 对返回或没有更多节点可供查询。

这种查找非常适合所有节点都具有完美正常运行时间的理想场景。但是如何处理节点有意或失败离开网络的情况?这就需要一个强大的加入/离开协议。

流行的 DHT 协议和实现

  1. 和弦
  2. 卡德姆利亚
  3. Apache Cassandra
  4. Koorde TomP2P
  5. 伏地魔

参考文献:

  1. https://en.wikipedia.org/wiki/Distributed_hash_table
  2. https://steffikj19.medium.com/dht-demystified-77dd31727ea7
  3. https://www.linuxjournal.com/article/6797

答案 5 :(得分:-2)

看看亚马逊的Dynamo,它解释了一个基于圆一致散列的简单而新颖的DHT实现。