为什么在和弦p2p系统中,指针表不存储有关其他节点的所有信息?

时间:2015-10-02 18:50:00

标签: networking p2p distributed-system

我正在学习和弦系统。但我对它的查询算法有疑问。为什么和弦中的手指表只存储successor(n+2^{i-1})的信息,而不是环中所有其他节点的信息?如图所示,enter image description here

如果我想在节点1搜索密钥7.如果节点1存储了环上节点的所有地址,因为我们显然知道7的后继是0,我们可以直接到0.我为什么要去节点6首先使用节点6路由到0.我有点困惑。

1 个答案:

答案 0 :(得分:3)

可扩展性。想象一下,环中有10,000,000个节点。跟踪所有这些变得非常困难(由于内存限制以及信令和处理节点连接/离开所需的通信工作)。

相反,您可以利用节点ID在环中排序的事实。然后你可以使用它们来避免在整个环上进行线性搜索。例如:在节点0中,您只存储大约9个节点的信息(假设ID为0到10,000,000):1,000,000,2,000,000,3,000,000,...和9,000,000。然后,如果您想要到达一个随机节点,比如1,337,000,您只需要在1,000,000到2,000,000的段中搜索。因此,通过存储大约9个节点的信息,您可以将工作量减少10倍。

但你可以做得更好。如果节点1,000,000,1,000,001等使用与节点0相同的快捷方式,那么从1,000,000到1,337,000仍需要很多工作(337,000步),彼此之间的间隔为1,000,000。如果从节点0开始以1M的间隔间隔9个快捷方式,那么不是很好吗,但是从节点1M到2M的间隔为100k的9个快捷方式也不是很好吗?然后你必须在段1,300,000到1,400,000中进行查找。

你可以通过让每个节点以10k的间隔为节点维护9个快捷方式,以及以1k的间隔等为另外9个节点保持9个快捷方式来进一步实现这一点。

因此,总而言之,查找将如下工作:

  • 我们向节点0询问节点1,337,000的信息。
  • 节点0不知道如何直接到达节点1,337,000,但它知道如何达到1,000,000和2,000,000。 1,000,000是最接近的,因此它在那里发送查询。
  • 节点1,000,000不知道如何直接到达节点1,337,000,但它知道如何达到1,100,000,1,200,000,1,300,000等节点1,300,000是最接近的节点,因此它在那里发送查询。
  • 节点1,300,000不知道如何直接到达节点1,337,000,但它知道如何达到1,310,000,1,320,000,1,330,000等。因此它将查询发送到1,330,000。
  • 节点1,330,000知道如何达到1,337,000,因为它在指针表中(它知道如何达到1,331,000,1,332,000,1,333,000等)。

所以你只用了4步就得到了答案。让我们看一下手指表中需要多少存储空间。

任何id为n的节点都需要存储以下信息:

  • 以1的间隔隔开的9个节点,从n开始;
  • 从n开始以间隔100k间隔开的9个节点;
  • 从n开始间隔10k的9个节点;
  • 以1k为间隔隔开的9个节点,从n开始;
  • 从n开始以间隔100间隔开的9个节点;
  • 9个节点间隔10个间隔,从n开始,我们可以在这里停止。

因此每个节点只需要存储大约54个其他节点的信息。在最坏的情况下,您需要6 + 9 = 15次查找才能到达节点。这比没有手指表所需的10M-1查找要好得多。

Chord使用base 2而不是base 10来分割环。因此,你在论文中看到了2而不是10的权力。

我不记得这是否正是和弦的作用方式;但这是一样的想法。分布式二进制搜索。