分布式系统之同步化

1、时钟同步

在说到时钟同步时,我们会先考虑到一个例子:unix系统中make程序,该程序基于文件更改时间来决定程序是否需要重新编译,例如,一个源程序文件为input.c,相对应的目标文件为input.o,若input.c文件的更改时间为2016,而input.o的更改时间为2015,则make程序便知道input.c文件被更改过,需重新编译,但若是input.c的更改时间为2015,而input.o的更改时间为2016,则make程序判断出input.o是最新编译的,无需重新编译。由此便产生了一个问题:在缺乏协调处理的全局时钟的情况下,有两台主机A、B,现在将主机A上一个程序的源文件及编译后的目标文件复制到主机B上,而由于某些原因,主机B本地时钟的时间较主机A略慢一些,此时主机B更改源文件后,其更改时间还是小于拷贝过来文件中的目标文件,这就将导致源文件不能被编译。
那如何得到一个全局较精确的时钟呢,目前UTC(统一协调时间)作为权威的时钟,国际时间标准组织在位于科罗拉多州科林斯堡建立了一个名叫WWV的广播站,WWV会每个UTC秒开始时广播一个小脉冲,各区域可使用WWV接收器来同步各自区域的时钟,有了全局时钟之后,那各区域内的其它没装上WWV接收器的主机如何同步呢?这就需要时钟同步算法了。
最大偏移率
首先我们讲下最大偏移率的概念,我们假设在某时刻UTC的时间为T,某一主机的时间为C,在理想情况我们肯定希望T/C = 1,然而这样是不现实的,总有点偏差,所以引入偏移,如下式子所示:

这里的β即为最大偏移率,这可由生产厂商测试后给出的一个常量,那这个最大偏移率有什么用处呢?我们假设以下这种情况,若两个时钟以相反的方向偏离UTC,在它们同步后的∆t时间时,它们的最大差值可能是2β∆t,如果想要保证它们的差值不超过δ,那么时钟必须以每δ/2β时间同步一次。接下来我们讲述几种时钟同步算法。

1.1 网络时间协议

一种最直观的算法,每个想要同步的客户直接发送消息给装有WWV接收器的时间服务器,时间服务器返回一个消息,消息内容为时间服务器当前的时间,客户接收到该时间后便可更新自己的时间。
分布式系统之同步化_第1张图片
上图表示客户在T1时间发送一个同步请求到时间服务器,时间服务器在T2时间接收到该消息,并记录下来,在T3时间回复时间戳消息给客户,该消息内包括了T2, T3,客户在T4接收到消息。
这样就可以计算出客户和服务器之间的偏差。
我们假设如下:客户与服务器的偏差为θ,客户到服务器的传播时间为m,假设往返时间都相同,即为m,我们便有以下两个方程:
分布式系统之同步化_第2张图片
这里抛开了很多因素,例如网络延迟、往返时间不同等。
客户得到了偏差后如何处理呢? 如果客户比时间服务器要满,则很简单,将时间调快些便可,但如果比时间服务器还快呢?这时不能将时间调慢了,为何呢,因为如果调慢了,那不就是某些更改后的源文件时间小于对应的目标文件时间了吗,那怎么办?处理方法即是将客户的计时器调得慢些即可,例如假设正常情况下每秒会产生99个中断,那么将每次中断的时间延长些直到校正完成即可。

1.1.2 Berkeley算法

未完待续

你可能感兴趣的:(读书笔记,分布式系统-同步)