2.4.1 交互模型
2.3节对系统体系结构的讨论表明分布式系统由多个以复杂方式进行交互的进程组成。例如:
- 多个服务器进程能相互协作提供服务,前面提到的例子有域名服务(它将数据分区并复制到互联网中的服务器上)和Sun的网络信息服务(它在局域网的几个服务器上保存口令文件的复制版本)。
- 对等进程能相互协作获得一个共同的目标。例如,一个语音会议系统,它以类似的方式分布音频数据流,但它有严格的实时限制。
大多数程序员非常熟悉算法的概念——采取一系列步骤以执行期望的计算。简单的程序由算法控制,算法中的每一步都有严格的顺序。62由算法决定程序的行为和程序变量的状态。这样的程序作为一个进程执行。由多个上面所说的进程组成的分布式系统是很复杂的。它们的行为和状态能用分布式算法描述——分布式算法定义了组成系统的每个进程所采取的步骤,包括它们之间消息的传递。消息在进程之间传递以便在它们之间传递信息并协调它们的活动。
每个进程执行的速率和进程之间消息传递的时限通常是不能预测的。要描述分布式算法的所有状态也非常困难,因为它必须处理所涉及的一个或多个进程的故障或消息传递的故障。
进程交互完成了分布式系统中所有的活动。每个进程有它自己的状态,该状态由进程能访问和更新的数据集组成,包括程序中的变量。属于每个进程的状态完全是私有的——也就是说,它不能被其他进程访问或更新。
本节讨论分布式系统中影响进程交互的两个重要因素:
- 通信性能经常是一个限制特性。
- 不可能维护一个全局时间概念。
通信通道的性能 在我们的模型中,通信通道在分布式系统中可用许多方法实现,例如,通过计算机网络上的流或简单消息传递来实现。计算机网络上的通信有下列与延迟(latency)、带宽(bandwidth)和抖动(jitter)有关的性能特征: - 从一个进程开始发送消息到另一个进程开始接收消息之间的间隔时间称为延迟。延迟包括:
—第一串比特通过网络传递到目的地所花费的时间。例如,通过卫星链接传递消息的延迟是无线电信号到达卫星并返回的时间。
—访问网络的延迟,当网络负载很重时,延迟增长很快。例如,对以太网传送而言,发送站点要等待网络空闲。
—操作系统通信服务在发送进程和接收进程上所花费的时间,这个时间会随操作系统当前的负载的变化而变化。
- 计算机网络的带宽是指在给定时间内网络能传递的信息总量。当大量通信通道使用同一个网络时,它们就不得不共享可用的带宽。
- 抖动是传递一系列消息所花费的时间的变化值。抖动与多媒体数据有关。例如,如果音频数据的连续采样在不同的时间间隔内播放,那么声音将严重失真。
计算机时钟和时序事件 分布式系统中的每台计算机有自己的内部时钟,本地进程用这个时钟获得当前时间值。因此,在不同计算机上运行的两个进程能将时间戳与它们的事件关联起来。但是,即使两个进程在同时读它们的时钟,它们各自的本地时钟也会提供不同的时间值。这是因为计算机时钟和绝对时间之间有偏移,更重要的是,它们的漂移率互不相同。术语时钟漂移率(clock drift rate)指的是计算机时钟偏离绝对参考时钟的比率。即使分布式系统中所有计算机的时钟在初始情况下都设置成相同的时间,它们的时钟最后也会相差巨大,除非进行校正。
有几种校正计算机时钟的时间的方法。例如,计算机可使用无线电接收器从全球定位系统(GPS)以大约1μs的精度接收时间读数。但GPS接收器不能在建筑物内工作,同时,为每一台计算机增加GPS在费用上也不合理。相反,具有精确时间源(如GPS)的计算机可发送时序消息给网络中的其他计算机。在两个本地时钟时间之间进行协商当然会受消息延迟的影响。有关时钟漂移和时钟同步的更详细的讨论见第14章。
交互模型的两个变体 在分布式系统中,很难对进程执行、消息传递或时钟漂移所花的时间设置时间限制。两种截然相反的观点提供了一对简单模型:第一个模型对时间有严格的假设,第二个模型对时间没有假设。
同步分布式系统:Hadzilacos和Toueg[1994]定义了一个同步分布式系统,它满足下列约束:
- 进程执行每一步的时间有一个上限和下限。
- 通过通道传递的每个消息在一个已知的时间范围内接收到。
- 每个进程有一个本地时钟,它与实际时间的偏移率在一个已知的范围内。
对于分布式系统,建议给出合适的关于进程执行时间、消息延迟和时钟漂移率的上界和下界是可能的。但是达到实际值并对所选值提供保证是比较困难的。除非能保证上界和下界的值,否则任何基于所选值的设计都不可靠。但是,按同步系统构造算法,可以对算法在实际分布式系统的行为提供一些想法。例如,在同步系统中,可以使用超时来检测进程的故障,参见下面的2.4.2节。
同步分布式系统是能够被构造出来的。所要求的是进程用已知的资源需求完成任务,这些资源需求保证有足够的处理器周期和网络能力;还有要为进程提供漂移率在一定范围内的时钟。64
异步分布式系统:许多分布式系统,例如互联网,是非常有用的,但它们不具备同步系统的资格。因此我们需要另一个模型。异步分布式系统是对下列因素没有限制的系统:
- 进程执行速度——例如,进程的一步可能只花费亿万分之一秒,而进程的另一步要花费一个世纪的时间,也就是说,每一步能花费任意长的时间。
- 消息传递延迟——例如,从进程A到进程B传递一个消息的时间可能快得可以忽略,也可能要花费几年时间。换句话说,消息可在任意长时间后接收到。
- 时钟漂移率——时钟漂移率可以是任意的。
异步模型对执行的时间间隔没有任何假设。这正好与互联网一致,在互联网中,服务器或网络负载没有内在的约束,对像用FTP传输文件要花费多长时间也没有限制。有时电子邮件消息要花几天时间才能到达。下面的“Pepperland协定”部分说明在异步分布式系统中达成协定的困难性。
即使有这些假设,有些设计问题也能得到解决。例如,虽然Web并不总能在一个合理的时间限制内提供特定的响应,但浏览器的设计可以做到让用户在等待时做其他事情。对异步分布式系统有效的任何解决方案对同步系统同样有效。
实际的分布式系统经常是异步的,因为进程需要共享处理器,而通信通道需要共享网络。例如,如果有太多特性未知的进程共享一个处理器,那么任何一个进程的性能都不能保证。但是,有许多不能在异步系统中解决的设计问题,在使用时间的某些特征后就能解决。在最终期限之前传递多媒体数据流的每个元素就是这样一个问题。对这样的问题,可使用同步模型。
事件排序 在许多情况下,我们有兴趣知道一个进程中的一个事件(发送或接收一个消息)是发生在另一个进程中的另一个事件之前、之后或同时。尽管缺乏精确的时钟,但系统的执行仍能用事件和它们的顺序来描述。
例如,考虑下列在邮件列表中一组电子邮件用户X、Y、Z、A之间的邮件交换:
1)用户X发送主题为Meeting的消息。
2)用户Y和Z发送一个主题为Re:Meeting的消息进行回复。
在实际环境中,X的消息最早发送,Y读取它并回复;Z读取X的消息和Y的回复并发出另一个回复,该回复引用了X和Y的消息。但是由于在消息传递中各自独立的延迟,消息的传递可能像图2-13所示的一样,一些用户可能以错误的顺序查看这两个消息。例如,用户A可能看见:
Pepperland协定 Pepperland军队的两个师“红师”和“蓝师”驻扎在邻近两座山的山顶上。山谷下面是入侵的敌军。只要Pepperland的两个师留在驻地,他们就是安全的,他们通过派出通信兵穿过山谷进行通信。Pepperland的两个师需要协商它们中的哪一方率先发起对敌军的冲锋以及冲锋何时进行。即使是在异步的Pepperland中,由谁率先冲锋是可能达成一致的。例如,每个师报告剩余人员的数量,人数多的一方率先冲锋(如果人数一样多,则由红师率先冲锋)。但何时冲锋呢?非常遗憾,在异步Pepperland,通信兵的速度是变化的。如果红师派出一个通信兵,带着“冲锋”消息,蓝师可能3个小时也收不到这个消息,也可能5分钟就收到这个消息了。在同步Pepperland中,仍然有协调问题,但是两个师知道一些有用的约束:每个消息至少花费min分钟和至多花费max分钟到达。如果率先冲锋的师发送“冲锋”消息,那么它等待min分钟就可以冲锋。另一个师在收到消息后等待1分钟,然后冲锋。在率先冲锋的师之后、不超过(max-min+1)分钟,另一个师保证发起冲锋。
如果X、Y、Z的计算机上的时钟能同步,那么每个消息在发送时可以携带本地计算机时钟的时间。例如,消息m1、m2和m3能携带时间t1、t2、t3,其中t1<t2<t3。接收到的消息将根据它们的时间排序显示给用户。如果时钟基本上同步,那么这些时间戳通常会以正确的顺序排列。
因为在一个分布式系统中时钟不能精确同步,所以Lamport[1978]提出了逻辑时间的模型,为在分布式系统中运行于不同计算机上的进程的事件提供顺序。使用逻辑时间不需要求助于时钟就可以推断出消息的顺序。详细内容可参见第14章,我们在这里只介绍如何将逻辑排序的某些方面应用到邮件排序问题。
逻辑上,我们知道消息在它发送之后才被接收,因此,我们为图2-13所示的成对事件给出一个逻辑排序。例如,仅考虑涉及X和Y的事件:
X在Y接收到m1之前发送m1;Y在X接收到m2之前发送m2
我们也知道应答在接收到消息后发出,因此对于Y,我们有下列逻辑排序:
Y在发送m2之前接收m1
逻辑时间通过给每个事件赋予一个与它的逻辑顺序相对应的数字而进一步拓展了这个思想。这样,后发生的事件的数字比早发生的事件的数字大。例如,图2-13显示了X和Y上的事件,其数字为1~4。