一个节点如何加入分布式哈希表(DHT)集群?

11
我正在尝试了解分布式哈希表(DHT)范例,因为它适用于P2P或完全分布式计算架构。从理论上讲,一旦建立了一个集群,它如何管理数据并分配工作就有了一些意义。
对我来说最有趣的部分是,该架构从不需要某种集中控制器或协调器(没有单点故障)。然而,我仍然在努力理解概念的实际执行方式,特别是集群的形成方式。如果它是一个完全分布式系统,那么节点如何知道如何“加入”已经建立的集群?
在一个简单的例子中:
- 假设我正在创建一个基于DHT模型的P2P应用程序 - 该应用程序分布在互联网上(即不在同一网络中),任何公共客户端都可以连接到集群 - 连接到集群的客户端可以看到集群中的一些(但不一定全部)其他客户端 - 没有连接的客户端没有集群中任何客户端的地址或名称。

如果没有集中式服务器作为信标或提供介绍新客户端加入集群的手段,那么新客户端如何“连接”?

3个回答

10

这是我在我的论文中研究过的一个问题,但我从未找到满意的解决方案。问题在于,在加入网络之前,您需要了解其他节点之一的某种信息,获取第一个地址是困难的。

我想到了几个想法:

  • 鼓励节点发布其地址,这样您就可以建立公共可访问的已知IP列表
  • 运行几个“众所周知”的引导节点
  • 强制扫描地址空间

最后一个选项是唯一真正去中心化的方法。三种方法的组合可能是最好的选择。

一旦您启动了网络,并在断开连接后重新建立连接并不难,只需保存网络中已经存在很长时间的几千个节点的地址,其中至少有一个下次仍在线。


嗯,我就怕会出现这种情况。全局扫描(暴力破解)的方法很有趣,但似乎不是特别实用,除非你有一个有针对性的池来扫描。看起来,建立一个中央列表可能是目前最好的实际解决方案。(谢谢!) - David Elner
最初的Skype实现具有身份验证服务器,该服务器在用户验证后将回答超级节点列表。因此,您可以拥有一个集中的注册表,其中包含一些地址,因为提供这些地址不会产生任何负载。(我说原始的Skype实现,因为我不知道Microsoft在此期间修改了多少) - peter

1
从我所想的来看,您可以为DHT节点网络创建代理服务器,并为该代理服务器创建影子服务器以实现可靠性。
任何试图加入DHT网络的新节点都会与代理服务器通信,代理服务器将其纳入完全P2P的DHT网络中。
这样,只有代理服务器需要公开,所有其他DHT节点都可以拥有私有IP。
尽管应用程序分布在互联网上可能会有障碍,但您始终可以通过代理进行通信。

0

事实上,维护分布式哈希表(DHT)源代码主干的一方是该DHT实例的上帝,因此也是主要的单点故障。如果DHT从匿名网络(TorGNUnetChimera等)节点(以下简称:anonnodes)引导启动,这些节点的地址已经硬编码到DHT源代码中,则该DHT被某些"不存在的机构"劫持的可能性不应增加。经典的wget与Tor网络地址配合使用,如果同时使用torsocks,则可以正常工作。例如:

torsocks wget http://xmh57jrzrnw6insl.onion/

为了减少DHT被劫持的风险,可以使用自动投票过程来防止一些引导节点被劫持。其思想是引导节点从硬编码的匿名节点获取地址列表,并仅从出现在大多数列表中的节点进行引导。如果某些匿名节点比其他节点更“可信”,则可以使用一个系统,其中“更可信”的匿名节点可以拥有多个选票,而不是每个匿名节点只有一个选票。
在早期计算机不可靠的时代,投票系统以一种形式使用,即在不同的投票计算机之间运行相同的计算机程序集命令。计算结果进行比较,最频繁的答案被认为是正确的。也许在分布式哈希表的情况下,可以使用相同的方法:通过一些“较长”的时间段内的不同Tor会话多次向不同的引导节点询问相同的问题,即已知的DHT节点列表。
截至2014_07_xx,我尚未测试这些想法,但我希望我的当前评论能够有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接