时钟
时钟在一般意义上指的是一个计算机的物理时间,每个计算机都会包括他们自己的物理时钟,不同的计算机的物理可能会不同。
时钟漂移
经过在同个地方的计算机,他们的物理也有可能会不一样,如果他们从刚刚开始相同的时间计时开始,过了1过月,1年也可能会有快又慢,这在专业名词上讲叫做时间漂移。本质的原因是每秒的时间偏移,经过日记月累之后,就会有可能达到1秒钟的差距,解决的办法很简单,就是过一段时间之后,将时间纠正回来就可以了。
UTC
UTC全称是Coordinated Universal Time,协调世界时,又称世界统一时间,用来进行高进度时间的同步。协调世界时以原子时秒长为基础,在此时刻上尽量接近于世界时的一种时间计量系统。
同步物理时间同步物理时间的主要手段分为2个External synchronization,靠的是UTC协调世界时,给定一个边界值D>0, 满足条件|S(t)-Ci(t)|<D,另外1个是Internal synchronization,同样给定时间边界D,相互之间进行同步,|Ci(t)-Cj(t)|<D。
同步系统中的时间同步
我们首先在一般情况下进行考虑,比如2个进程,相互之间只允许进行消息传递来进行通信,如何进行事件同步,假设传输的时间为T(trans),假设发送进程P1发送的时间为t,则P2的时间应该设置成t+T(trans),这个很好理解,基于这个思路继续,发送的传输时间一般不可能是固定的,可能受网络环境的影响或快或慢,所以定义了传输的时间上界u(max),下界u(min),则此时的抵达时间应该设置成t+(max+min)/2,
Cristian时钟同步方法
Cristian的方法利用了时间服务器,连接上设备并且能够接受从UTC资源发来的信号进行同步,以UTC的时间作为同步的时间。定义一个进程p,一个TimeServer s,请求消息为M(r),接收消息M(r),M(r)中包含了从时间服务器中获取的最新的时间,进程p记录了收发的总延时T(round),则进程p接收到消息后,他的时间应该是p(t)=M(r)中的时间t+T(round)/2。方法大体的思路就是如此,重新体会一下这个方法有什么弊端,明显的一点是单点瓶颈问题,因为服务器是单一服务器,随时都可能挂,所以我们可以联想到的解决办法是提供服务器集群组的方式处理,这时单点问题解决了,但是万一有些进程故意发错的时间给接收进程呢,如何处理,这是一个典型的拜占庭将军问题了,这个暂时不讨论,下面的算法可以帮我们解决这个问题。
The Berkeley Algorithm
这个算法用的是Internal synchronization的方法,给定一组计算机,选出一个作为Coordinator,作为master,这个master选择机器中将要被同步的机器,叫做slave,通过计算与这些机器之间进行时间交换,平均快的和慢的时间,最终达到时间一致性,在比较的过程中,就可以排除明显偏差大的时间了。
The Network Time Protocol
Cristian和Berkeley算法都是偏向于用于小规模的内网中,而Network Time Protocol则是一种在因特网上的分布式时间服务。他定义了Time Service的结构。NTP有下面几个特点。
1、NTP提供了一个客户端可以从网络中精准同步UTC时间的客户端。
2、服务端通过接口的形式方便客户端的调用。
3、NTP服务器与服务器之间的时间同步是以层级控制的方式构成。1级节点同步2个2级节点,2(1)可能又同步2个3级节点,2(2)也可能2个3级节点。其中的时间交互协议通过信息之间的交换。
逻辑时间和时钟逻辑时间,从字面上理解当然不同于物理时间,在分布式系统中,运用逻辑时间的例子也不少,假设L(i)表示的是消息事件的发生事件,当p1进程接收到的时候,就需要对时间做递增操作,L(i) = L(i) + 1,逻辑意义上的时间增加。
全局有序逻辑时间--Vector Clock
Vector Clock是向量时钟,可以可以保证全局有序的逻辑时间,通过V<t1, t2, t3....>ti保存了Pi进程的当前进行到的时间,当进程Pi接收到相应的消息事件时,则在对应的位置上ti上进行ti = ti + 1的操作,当做Vector Clock向量比较的时候,需要对V每个位置上进行比较,如果V1中的ti全部小于V2中的ti时,才算事件1早于事件2发生。
参考文献:<<Distributed
Sysytems Concepts And Design>>原版第五版,author:George Coulouris,Jean Dollimore, Tim Kindberg,Gordon Blair