前言
分布式系统的命名系统,通俗说就是要解析名称(名称解析允许进程访问命名实体),而名称在计算机系统中起着重要的作用,它们用来共享资源,唯一标识实体,指向位置等,在分布式系统中,名称指的是由位或字符组成的指向实体的字符串,分布式系统中的实体实际上可以是任何事物。我们在对实体进行操作的时候,需要访问实体,因此需要一个访问点(access point),访问点是另一种特殊类型的实体。访问点的名称称为地址(address)。而用来唯一标识实体名称 的叫标识符。
原则上,命名系统有一个名称到地址的绑定。而当名称不含任何有关如何定位其相关实体的访问点的信息时,定位这种只给实体标识符的名称,我们叫无层次命名(平面命名),反之叫结构化命名。
无层次命名
1.广播与多播
广播:定位某实体时,包含该实体所用标识符的消息会广播到每台机器上,并且请求每台机器查看它是否拥有该实体。只有能够为该实体提供访问点的机器才会发送回复消息,回复消息中包含访问点的地址。这种方式不仅有很严重的浪费,同时也可能会发生很多主机被它们所不能回答的请求中断。
多播:也就是组播,拥有特定的多播组,当主机向一个多播地址发送消息时,网络层会提供最尽力的服务来把消息发送给全部组成员。
2.转发指针
顾名思义,当实体从A移动到B时,它将在后面留下一个指针,这个指针指向它在B中的新位置。缺点就是开销会很大,同时转发链中的所有终极那位置必须维护它们的那一部分转发指针链,另外链很脆弱,易断开,这都会导致无法到达实体。另外注意转发指针的使用与查找地址是不同的,客户请求是沿着链转发到实际对象的。
3.基于宿主位置的方法
让创建对象的机器(称为该对象的宿主位置( home location))始终保留一个对对象的当前位置的引用。这个引用以一种容错方式进行存储和维护。当链断开时,可以向对象的宿主位置提出请求,询问其对象当前所在的位置。为了允许对象的宿主位置发生变化,可以使用传统的命名服务来记录当前的宿主位置。在大型网络中基于宿主位置的方法存在一个缺点。为了与移动实体通信,客户首先必须与宿主位置进行联系,而宿主位置可能与实体本身处于完全不同的位置。结果是增加了通信延迟。而且由于使用了固定的宿主位置,必须保证宿主位置始终存在,否则无法与实体建立联系。
分布式哈希表(Distributed Hash Tables )<重点内容>
主要介绍Chord环。
它使用m位的标识符空间,将随机选择的标识符赋给结点,并把键值赋给特定实体(m通常为128或160)
- ID: from 0 to 2^m-1 , m is 128 or 160(可用的所有的)
- Node ID (NID): a NID is hashed by the IP address of a node;(给节点的)
- Key ID (KID): a entity is represent by a key, and the KID is hashed by the key;(要做映射的)
- NID, KID 都是ID的子集。
N I D = f ( K I D ) NID=f(KID) NID=f(KID)
1.节点放置:根据节点的NID将节点放置在Chord环上;
2.后继节点和前驱节点:节点的后继节点是Chord环顺时针方向上的下一个节点。前驱是逆时针方向的。
3.Key放置:在顺时针方向,它在恰好与之相等或是后续中第一个比它大的非空NID上。如下图所示:m=6,我们是为了方便理解,但实际没有这么小。
每个Chord结点不是线性地进行键值查找,而是维护一个最多有m个实体的指状表
(finger table)。在结点n的指状表中,第i个实体(i为1~m)指向的是结点n后的2^(i-1)的第一个结点。我们用式子表示就是
s
u
c
c
e
s
s
o
r
(
(
n
+
2
(
i
−
1
)
)
m
o
d
2
m
)
(
i
∈
[
1
,
m
]
)
successor((n+2^(i-1))mod 2^m) (i ∈[1,m])
successor((n+2(i−1))mod2m)(i∈[1,m])
举例如下(chord环为上图所示):
m=6,n=8时:
- i = 1, successor(9) = N14
- i = 2, successor(10) = N14
- i = 3, successor(12) = N14
- i = 4, successor(16) = N21
- i = 5, successor(24) = N32
- i= 6, successor(40) = N42
表示在图上就是:
当要查找键值K时
1.如果NID < KID <= successor(NID),successor(NID)就是结果。
2.如果发现K大于指状表中最后一行的NID,就将请求转发到NID所代表的结点上继续查找。
3.这种查找是O(log(N))的。
举例如下图所示(从N8开始查找K54)
我就介绍到这里,读者朋友可以思考一下在实际的分布式系统中,当chord环中结点集发生变化,甚至是结点失效时该怎么做?
今日推歌
------《天外来物》 薛之谦
你像天外来物一样 求之不得
你在世俗里的名字 不重要了
正好我隐藏的人格是锲而不舍
直到蜂拥而至的人都透明了
我在不近又不远处
用明天换你靠近我