Pastry学习笔记

这个笔记主要是参考CDK5和老师的教学PPT

资源可以使用全局唯一标识符(globally unique identifier,GUID)来标识。

对等系统(P2P)

路由覆盖(routing overlay)

在对等系统中路由覆盖是一个著名的分布式算法,它负责定位节点和对象。顾名思义,中间件表现为一层的形式,该层负责把来自客户的请求路由到请求所针对的对象所在的主机上。感兴趣的节点可以放到网络中的任何节点,然后将他重定位,在这个过程中不需要任何顾客的参与。

他之所以被称为覆盖,是因为它在应用层实现了一个路由机制,但这个路由机制与部署在网络层的路由机制相分离。

路由覆盖的主要任务如下:

路由请求给对象:一个客户希望调用一个对象上的操作,那么他想路由覆盖提交一个请求,请求中包含响应对象的GUID,路由覆盖把这个请求路由到含有该对象的副本的节点上。

插入对象:节点想要向一个对等服务中添加一个新对象,那么它可以通过计算得到该对象的GUID并通知路由覆盖,路由覆盖会保证其他对象能够访问到该对象。

删除对象

节点的增加和删除:节点加入或者退出服务

一个对象的GUID是通过该对象的全部或者一部分状态通过一个函数计算得到的,这个值很有可能是唯一的。通常通过一个散列函数来根据对象的值产生对象的GUID。

路由覆盖有时也被称为***分布式散列表***(Distributed Hash Table ,DHT)

路由覆盖研究实例:Pastry

能够通过pastry访问的所有节点和对象都被分配了一个128位的GUID值。每一个结点都有一个公钥,将一个安全的散列函数(如SHA-1)应用到这个公钥上,通过计算便可以得到结点对应的GUID。而对于对象来说,他们的GUID的获得是将安全的散列哈桑农户应用到对象名字或者他们的部分存储状态上。

他们被随机分派到空间[0,2^128-1]

一个具有N个节点的网络中,Pastry路由算法能够在O(logN)步内将正确的消息路由到任何GUID对应的地址上。如果GUID表示的节点当前处于活跃状态,那么将消息直接发给这个节点,否则消息将发送给数值上最接近该GUID且处于活跃状态的节点上,。处于活跃状态的节点负责处理发往让们的数值意义上的邻居节点的请求。

路由过程涉及使用的底层传输协议(一般是UDP)将消息传出到一个“更接近”目的地的Pastry节点上去。这里更接近是指在完全人造的空间(GUID构成的空间)中接近。这使得网络中可能需要很多IP跳。

路由算法

每一个活跃的节点都保存一个叶子集合,叶子集合是一个大小为2l的向量L,L中包含和当前节点GUID在数值上接近的2l(l个大于,l个小于)其他节点的GUID和IP地址。

​ 叶子集合是一个大小为2l的向量L, L包含有和当前结点nodeID相邻的2l个(l个大于,l个小于)其他结点的nodeID和结点IP地址
​ 邻居集合包含了M个结点的nodeID和对应的IP地址,这些结点在物理上与当前结点最靠近。
一个叶结点的结构

每个Pasrty节点都维护一个树形结构的路由表,表中包含一系列节点的GUID和IP地址,这些GUID的值可能是2^128范围内的任意一个值,其中数值上接近当前节点的GUID值得GUID密度更大。

路由表的结构:GUID的值以16进制表示,路由表依据GUID的十六进制数的前缀的不同对其进行分类。路由表的行数与GUID的十六进制表示的位数相同,因此对于正在描述的Pastry系统原型来说,路由表有128/4=32行 (一个128位的数字用十六进制表示的话,总共用32个16进制数值)。表中的没想指向具有相关的GUID前缀的是多个节点中的一个。
请路由表结构

伪代码:

伪代码

主机加入 首先要加入的节点计算出一个GUID,然后和附近的pastry节点建立连接。

假设加入的节点的GUID是X,并且它联系的附近的节点的GUID是A。节点X发送一个专门的join请求给节点A,并且这个消息的目标地址被设置为X。节点A按照正常的Pastry分发join消息。假设路由连接消息路途上的结点有B,C。Pastry将会把join消息发送到GUID值与X在数值上相近的节点上去,这里把这个目的节点成为Z。

X的路由表:A是X的一个邻居节点,从而节点A的路由表的第一行将是节点X路由表的第一行(X0)的首选。另一方面,对于节点X路由表的第二行(X1)来说,节点A的路由表可能与X1是不相关的了,因为节点X的GUID和节点A的GUID澳门的十六进制第一位并不相同。不过,路由算法可以确保结点X的GUID和结点B的GUID的第一位是相同的,这也意味着,结点B路由表的第二行(B1)对于X1(结点X路由表的第二行)来说是合适的首选。相似的,结点C路由表的第三行(C2)对于结点X路由表的第三行(X2)来说是合适的首选,其他的以此类推。

X的叶子集合:既然结点Z的GUID从数值上接近结点X的GUID,那么X的叶子集合应该和Z的叶子集合是相似的。事实上,理想化的X的叶子集合与Z的叶子集合只有一个成员不同。因此Z的叶子集合对于X来说是一个足够好的近似
X将路由表和叶子集合的信息发送给路由表和叶子集合中的所有结点,相关结点接收到X的信息,然后调整它们的路由表或叶子集合

节点失效:为了修复自身的叶子集合L,它找到靠近失效结点的某个活结点,然后从这个邻居结点中获得它叶子集合L’的一份拷贝,L’中包含一部分与L重叠的GUID,其中有一个合适的代替失效结点的结点。别的相邻结点也会收到有结点失效的通知,然后这些结点执行上述类似的操作,以修复它们的叶子集合。这个修复过程能够保证结点的叶子集合可以得到修复,除非结点中的l个连续的相邻结点同时失效
对路由表的修复基于“一旦发现”机制。即使一些路由表项不再有效,消息的路由仍能继续进行:如果路由失败,那么将使用路由表同一行的其他项
使用一个简单的闲聊(gossip)协议来定期在结点之间交换路由表信息,从而修复路由表失效的项,并避免地域特性的缓慢退化。闲聊协议每隔20分钟运行一次。

具体代码实现

带更。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值