Chord算法(原理)

Chrod算法是P2P中的四大算法之一,是有MIT(麻省理工学院)于2001年提出,其他三大算法分别是:

Chord的目的是提供一种能在P2P网络快速定位资源的的算法,Cord并不关心资源是如何存储的,只是从算法层面研究资源的取得,因此Chord的API就简单到只有一个set、get。

1、Chord是什么?

Chord是一个算法,也是一个协议。作为一个算法,Chord可以从数学的角度严格证明其正确性和收敛性;作为一个协议,Chord详细定义了每个环节的消息类型。当然,Chord之所以受追捧,还有一个主要原因就是Chord足够简单,3000行的代码就足以实现一个完整的Chord。

Chord还可以被作为一个一致性哈希、分布式哈希(DHT)的实现。

2、覆盖网络(overlaynetwork)

覆盖网络是指这样一种网络:构建在其他网络之上、网络节点之间通过虚拟或逻辑连接在一起,比如云计算、分布式系统都是覆盖网络,因为其都构建于TCP/IP之上,且节点之间有联系。Chord也是构建于覆盖网络。

3、结构化与非结构化网络

非结构化的P2P网络是指网络节点之间不存在组织关系,节点之间完全是对等的,比如第一代P2P网络Napster,这类网络结构清晰、简单,但查找没有多大的优化余地,经常采用全局或分区泛洪查找,查找时间长、且结果难以保证(有可能在找到前就超时)。

结构化的P2P网络与非结构化恰好相反,我们认为网络在逻辑上存在一个人为设计的结构,比如Chord假定网络是一个环,Kadelima则假定为一颗二叉树,所有的节点均为树的叶子节点。有了这些逻辑结构,就给我们资源查找引入了更多的算法和思路。

4、分布式哈希表(DHT)

DHT的主要想法是把网络上资源的存取像Hashtable一样,可以简单而快速地进行put、get,该思想的诞生主要是受第一代P2P(Napster)网络的影响。与一致性哈希相比,DHT更强调的是资源的存取,而不管资源是否是一致性的。与一致性哈希相同的是,DHT也只是一个概念,具体细节留给各实现。

当前这些P2P实现可以被作为DHT的具体实现,再次再列举一些有代表性的实现:

  • Chord
  • CAN
  • Tapestry
  • Pastry
  • Apache Cassandra
  • Kadelima
  • P-Grid
  • BitTorrent DHT

5、Chord实现原理

Chord通过把Node和Key映射到相同的空间而保证一致性哈希,为了保证哈希的非重复性,Chord选择SHA-1作为哈希函数,SHA-1会产生一个2160的空间,每项为一个16字节(160bit)的大整数。我们可以认为这些整数首尾相连形成一个环,称之为Chord环。整数在Chord环上按大小顺时针排列,Node(机器的IP地址和Port)与Key(资源标识)都被哈希到Chord环上,这样我们就假定了整个P2P网络的状态为一个虚拟的环,因此我们说Chord是结构化的P2P网络。

下面有几个定义:

  • 我们称Chord环上的每个节点为标志符
  • 如果某个Node映射到了某个标志符,则继续称该标准符为Node
  • 按顺时针,节点前面的成为前继(predecessor),节点后面的成为后继(successor);同理,第一个predecessor称之为直接前继,第一个successor称之为直接后继

如图:

红色点为Node,蓝色为标志符。上面只是部分节点和标志符,以节点N1为例说明其Finger表中的successor:

No ith successor Successor
1 N1+20  N18 
2 N1+21  N18
3 N1+22  N18
4 N1+23  N18
5 N1+24  N18
6 N1+25  N45
7 N1+26   N1
8 N1+27  N1

把Node和Key都映射到一个值域感觉是把狗和猫放在一起衡量,虽然有点怪,但这样可以保证一致性哈希,具体可以参考前文。

很显然,分布在Chord环上的Node数远远小于标志符数(2160是一个无法衡量的天文数字),这样Chord环上的Node就会很稀疏地分布在Chord环上,理论上应该是随机分布,但如前面一致性哈希的讨论,如果节点数量不多,分布肯定是不均匀的,可以考虑增加虚拟节点来增加其平衡性,如果在节点较多(比如大型的P2P网络有上百万的机器)就不必引入虚拟节点。

很显然,任何查找只要沿Chord环一圈结果肯定可以找到,这样的时间复杂度是O(N),N为网络节点数,但对一个上百万节点,且节点经常加入、退出的P2P网络来说,O(N)是不可忍受的,因此Chord提出了下面非线性查找的算法:

  1. 每个节点都维护一个Finger表,该表长度为m(m就是位数,在Chord中为160),该表的第i项存放节点n的第(n+2i-1) mod 2m个successor(1<=i<=m)
  2. 每个节点都维护一个predecessor和successor列表,该列表的作用是能快速定位前继和后继,并能周期性检测前继和后继的健康状态
  3. 就是说存放的successor是按2的倍数等比递增,自所以取模是因为最后的节点的successor是开始的几个节点,比如最大的一个节点的下一个节点定义为第一个节点
  4. 资源Key存储在下面的Node上:沿Chord环,hash(Node)>=hash(key)的第一个Node,我们称这个Node为这个Key的successor
  5. 给定一个Key,按下面的步骤查找其对应的资源位于哪个节点,也就是查找该Key的successor:(假如查找是在节点n上进行)
  • 查看Key的哈希是否落在节点n和其直接successor之间,若是结束查找,n的successor即为所找
  • 在n的Finger表中,找出与hash(Key)距离最近且<hash(Key)的n的successor,该节点也是Finger表中最接近Key的predecessor,把查找请求转发到该节点
  • 继续上述过程,直至找到Key对应的节点

从直觉上来说,上次查找过程应该是指数收敛的,类似二分法的查找,收敛速度应该是很快的;反过来,查找时间或路由复杂度应该是对数即的,在下面我们会证明这一点。

下图表明了节点N1查找节点N53的过程,还是非常快的:

6、Chord收敛性证明

对一个算法而言,收敛性是至关重要的,如果没有收敛性做保证,在程序上化再多的心思也是徒劳。在证明之前,我们再强调3点:

  • Key存放在Key的successor节点上(满足:hash(Node)>=hash(Key))
  • 节点n的第i项存放的是第(n+2i-1)个successor
  • 查找是根据最近原则,当前节点没有存放Key则从Finger表中寻找与hash(Key)距离最近的Node继续这个过程

这里要区分是Key的successor还是节点n的successor,同时要注意最近匹配原则。

假如节点n的Finger表中的第i个successor与Key的距离最近,则满足:Key处在第i项与第i+1项中间

记第i项为J,第i+1项为P

  • J<hash(Key)
  • P>hash(Key)

而:

J = n + 2i-1

P = n + 2i

节点n与Key的距离应该处在n与J和P的中间,即 J-n<n - hash(Key)<P - n

(1) 2i-1<n - hash(Key)<2i

(2) 而J与Key的距离最大为J与P的距离 J-hash(Key) <P - J = 2i-1

也就是说J与Key的距离,小于n与Key的距离,并且该距离小于n与Key距离的一半,这样我们保证每次迭代,与Key的距离都会收敛,并且至少按2的指数收敛,也就是折半查找。

至此,我们理论证明了Chord的收敛性。

7、深入Chord算法

其实Chord算法可以完全转换为一个数学问题:

在Chord环上任意标记个点作为Node集合,任意指定Node T,从任意的Node N开始根据Chord查找算法都能找到节点T。

为什么能这么转换呢?因为只要找到了Key的直接前继,也就算找到了Key,所有问题转化为一个在Chord环上通过Node找Node的问题。这样,这个题就马上变的很神奇,假如我们把查找的步骤记录为路径,又转化为任意2个节点之间存在一条最短路径,而Chord算法其实就是构造了这样一条最短路径,那这样的路径会不会不存在呢?不会的,因为Chord本身是一个环,最差情况可以通过线性查找保证其收敛性。

从最短路径的角度来看,Chord只是对已存在线性路径的改进,根据这个思路,我们完全可以设计出其他的最短路径算法。从算法本来来看,保证算法收敛或正确性的前提是每个Node要正确地维护其后继节点,但在一个大型的P2P网络中,会有节点的频繁加入、退出,如果没有额外的工作,很难保证每个节点有正确的后继。

Chord冗余性:

所谓冗余性是指Chord的Finger表中存在无用项,那些处在Node N和其successor之间的项均无意义,因为这些项所代表的successor不存在。比如在N1的Finger表中的第1~5项均不存在,故都指向了N18,至少第1~4项为冗余信息。

一般说来,假如Chord环的大小为2m,节点数为2n,假如节点平均分布在Chord环上,则任一节点N的Finger表中的第i项为冗余的条件为:N+2i-1<N + 2m/2n =>2i-1<2m-n =>i <m-n+1,即当i <m-n+1时才有冗余。

冗余度为:(m-n+1)/m=1-(n-1)/m,一般说来m >>n,所以Chord会存在很多的冗余信息。假如,网络上有1024个节点,即n=10,则冗余度为:1-(10-1)/160≈94%。所以很多论文都指出这一点,并认为会造成冗余查询,降低性能。其实不然,因为这些冗余信息是分布在多个Node的Finger表,如果采取适当的路由算法,对路由计算不会有任何影响。

至此,我们已经完整地讨论了Chord算法及其核心思想,接下来要讨论的是Chord的具体实施。

http://blog.csdn.net/chen77716/article/details/6059575

时间: 2025-01-01 22:30:20

Chord算法(原理)的相关文章

Chord算法实现详细

背景 Chord算法是DHT(Distributed Hash Table)的一种经典实现,以下从网上无节操盗了一段介绍性文字: Chord是最简单,最精确的环形P2P模型."Chord"这个单词在英文中是指"弦",在分布式系统中指"带弦环",在P2P领域则指基于带弦环拓扑结构的分布式散列表(DHT)或者构建与其上的P2P网络.虽然MIT和UC Berkeley的研究早在2001年之前就开发了Chord及其应用系统,但有关Chord的正式论文[S

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

FP Tree算法原理总结

在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题,FP Tree算法(也称FP Growth算法)采用了一些技巧,无论多少数据,只需要扫描两次数据集,因此提高了算法运行的效率.下面我们就对FP Tree算法做一个总结. 1. FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示: 第一部分是一个项

分布式memcached学习(四)&mdash;&mdash; 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

POJ1523(求连用分量数目,tarjan算法原理理解)

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7406   Accepted: 3363 Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a

Chord算法

转自:http://blog.csdn.net/wangxiaoqin00007/article/details/7374833 虽然网上搜索CHord,一搜一大堆,但大多讲得不太清楚明白.今天发现一篇blog,图文并茂,逻辑清楚且易懂,特意转载收藏. P2P的一个常见问题是如何高效的定位节点,也就是说,一个节点怎样高效的知道在网络中的哪个节点包含它所寻找的数据,如下图: 对此,有三种比较典型的来解决这个问题. Napster:使用一个中心服务器接收所有的查询,服务器告知去哪下载其所需要的数据.

Kmeans聚类算法原理与实现

Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果. 假设要把样本集分为k个类别,算法描述如下: (1)适当选择k个类的初始中心,最初一般为随机选取: (2)在每次迭代中,对任意一个样本,分别求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类: (3)利用

【转】两种非对称算法原理:RSA和DH

转自:http://blog.chinaunix.net/uid-7550780-id-2611984.html 两种非对称算法原理:RSA和DH 虽然对称算法的效率高,但是密钥的传输需要另外的信道.非对称算法RSA和DH可以解决密钥的传输问题(当然,它们的作用不限于此).这两个算法的名字都是来自于算法作者的缩写,希望有朝一日能够出现用中国人命名的加密算法.非对称算法的根本原理就是单向函数,f(a)=b,但是用b很难得到a. RSA算法 RSA算法是基于大数难于分解的原理.不但可以用于认证,也可

Canny边缘检测算法原理及其VC实现详解(一)

转自:http://blog.csdn.net/likezhaobin/article/details/6892176 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量.检测和定位,自从1959提出边缘检测以来,经过五十多年