分布式系统:Chord 多播树的查找、构建与维护

1. Chord 是什么?

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

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

2. 结构化与非结构化网络

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

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

3. Chord 环的简单认识

下面有几个定义:

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

在下图中,红色点为 Node,蓝色点为标志符。

结点负责的标志符范围

下图是一个 Node 负责相应标志符的例子。

例如,结点 8 负责其到上一个结点 3 之间的所有标志符,即 4, 5, 6, 7, 8。

利用 Chord 环查找结点的速度

下图表明了结点 N1 查找结点 N53 的过程,还是非常快的,可以达到 O(log(N)) 级别。

4. 分布式哈希表(DHT)

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

5. DHT 表的键值查找

基于 DHT 系统的主要问题是要高效地把键值 k 解析为 succ(k) 的地址。每个 Chord 结点不是线性地进行键值查找,而是维护一个最多有 m 个实体的指状表(finger table)。如果用 FTp 表示结点 p 的指状表,那么有:

\mathrm{FT_p[i]=succ((p+2^{i-1})~mod~2^m)}

换句话说,第 i 个实体指向 (p+2^(i-1)) mod 2^m 的第一个结点。要查找键值 k,结点 p 立即把该请求转发给在 p 的指状表中索引为 j 的结点 q,其中:

\mathrm{q}=\mathrm{FT}_{\mathrm{p}}[\mathrm{j}] \leqslant \mathrm{k}<\mathrm{FT}_{\mathrm{p}}[\mathrm{j}+1]

下图是在 Chord 系统中从结点 1 解析键值 26,从结点 28 解析键值 12 的一个例子。

首先解释一下指状表各列的含义:

  • 第 1 列的 i 是指状表实体的索引,满足 1≤i≤m。
  • 第 2 列是指向 (p+2^(i-1)) mod 2^m 的第一个负责结点(succ)。例如结点 1 的指状表(图 a),FT1[1]=succ( (1+2^0) mod 2^5 )=succ(2)=4,因为标志符 2 是由结点 4 负责的。又例如结点 28 的指状表(图 b),FT28[5]=succ( (28+2^4) mod 2^5 )=succ(12)=14,因为标志符 12 是由结点 14 负责的。

为了解释这种查找,我们从结点 1 解析 k=26,如上图所示。首先,结点 1 在其指状表中查找 k=26,发现该值大于 FT1[5],表示该请求将转发给结点 18 (=FT1[5]),而结点 18 将选择结点 20,因为 FT18[2]<k≤FT18[3]。最后,该请求从结点 20 转发给结点 21,从结点 21 又转发给结点 28,该结点负责 k=26。此时,结点 28 的地址返回给结点 1,于是就完成了该键值的解析。

同样,当请求结点 28 解析键值 k=12 时,该请求将按上图所示的虚线路由。可以证明,一个查找通常需要 O(log(N)) 步,其中 N 为系统中的结点数。

6. Chord 结构中的应用层多播树的构建与维护

加入诸如 Chord 的基于 DHT 的系统相对简单。假设结点 p 要加入。它只需与已有系统中的任意结点联系,并请求查找 succ(p+1)。一旦标识了该结点,p 就可以把自己插入到该环中。离开也同样简单。注意,结点还要跟踪其前继者。

以下是结点插入的例子:

在举例的 Chord 系统中如图所示,假设加入了结点 7,为它建立指示表,并修改其他相关的指示表。

为解答上述问题,我们需要考虑到,加入了结点 7 之后,原本结点 9 负责的标志符,有一部分分给了结点 7 负责。即原本结点 9 负责标志符 5, 6, 7, 8, 9,现在结点 7 负责标志符 5, 6, 7,结点 9 负责标志符 8, 9。

然后通过以下公式来更新每一个结点的指状表的 succ:

\mathrm{FT_p[i]=succ((p+2^{i-1})~mod~2^m)}

得到的最终结果为:

描述在更新指状表后从结点 7 解析键值 k=23 的过程。

① 结点 7 在指示表中查找 k=23,发现 FT7[4]<k<FT7[5],请求转发给结点 18

② 结点 18 在指示表中查找 k=23,发现 FT18[2]<k<FT18[3],请求转发给结点 20

③ 结点 20 在指示表中查找 k=23,发现 FT20[1]<k<FT20[2],请求转发给结点 21

④ 结点 21 在指示表中查找 k=23,发现 k<FT21[1],请求转发给结点 28

⑤ 结点 28 负责 k=23,此时结点28的地址返回给结点 7,完成 k=23 的解析

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值