星期一 22 十二 2008
Chord: A Scalable Peer-to-peer Lookup Protocol for Internet Applications
Posted by yishuai under p2p
No Comments
chord.ppt : Manan Rawal, Bhaskar Gupta
Chord:
定义:
m-bit ID
数据结构:
succesor(k) = first node whose identifier is >= identifier of k in identifier space.
Finger Table: finger [k] = first node that succeeds (n+2^(k-1))mod(2^m)
finger [1] 即 succesor
路由表:
前驱,后继
基本逻辑:路由(可扩展的)
n.find_successor(id) 问节点n:你知道id A的后继是哪个吗?:功能:找内容,因为id A的内容就存在id A的后继上。
// ask node n to find the successor of id
n.find_successor(id)
if (id belongs to (n, successor])
return successor;
else
n0 = closest preceding node(id);
return n0.find_successor(id);
// search the local table for the highest predecessor of id
n.closest_preceding_node(id)
for i = m downto 1
if (finger[i] belongs to (n, id))
return finger[i];
return n;
特别逻辑:对付网络的变化,如节点加入、离开、异常断开
A:节点加入和稳定
节点A加入: 操作:
1)改变A前驱的successor为A
找到A的前驱,通知它
加入新数据结构:前驱
前驱的维护
2) 初始化A的succssor和finger table
succssor即其前驱的successor
finger table从其前驱和后继的finger table可以初始化
Chord方法:每个节点周期运行稳定算法,更新数据结构
n.create()
predecessor = nil;
successor = n;
n.join(m) 初始化后继
predecessor = nil;
successor = m.find_successor(n);
n.stabilize() 周期运行,更新自己的后继为后继的前驱。并通知该后继节点更新自己的前驱为我
x = successor.predecessor;
if (x in (n, successor))
successor = x;
successor.notify(n);
n.notify(m)
if (predecessor is nil or m in (predecessor, n))
predecessor = m;
n.fix_fingers() 周期运行,更新finger table的项
next = next + 1 ;
if (next > m)
next = 1 ;
finger[next] = find_successor(n + 2^(next-1));
n.check_predecessor() 周期运行,检查前驱的正确性
if (predecessor has failed)
predecessor = nil;
维护正确的后继是关键
加副本:r个副本
改进:让那种主动退出的节点做一些退出前的迁移工作:
- 把存的key传给后继
- 通知前驱和后继:自己要走了,请更新自己的后继或前驱