1、概述
同步化是分布式系统中的一个重要概念。同步化主要解决排序问题。例如,多个线程不能同时操作变量,而是使用锁或无锁结构同步多个线程。同步的目的是将多个线程排序为操作时间序来操作变量。
在单个计算机中,时间是明确的。当过程想要获得时间时,系统调用过程,然后操作系统内核返回时间。 然而,在分布式系统中,每台计算机的时钟可能是一致的或不一致的。即使分布式系统中的每台计算机中的时钟是一致的,这个时钟也不是分布式系统的全局。如果不是全局时钟,分布式系统可能会出现问题。
注意
2、物理时钟
计算机中的时钟是物理硬件,通常称为计时器,计算机的计时器通常是石英晶体管。以一定频率振荡石英晶体管。然后两个寄存器与每个石英晶体相连,一个是计数器,另一个是保持寄存器。石英晶体振荡使计数器减1。当计数器为0时,会产生中断,然后计数器将初始值重新安装在保持寄存器中。计数器产生的中断称为时钟滴答。当出现中断时,操作系统会响应中断,并调用中断处理程序将时钟存储器中的值加1。
时钟中断示意图(图片来自网络-示意图显示增加1):
2.1.物理时钟问题
物理时钟在计算中的主要问题是时钟偏移(clock skew)。流行点描述时钟偏移是指时钟摆动的偏移变慢或变快或变慢,导致时钟不同步。
时间偏移基本上不影响同一计算机过程的时间获取,因为即使有时间偏移,不同过程在不同时间获得的时间仍然不同,但分布式系统会有问题。
在分布式系统中,过程分布在不同的计算机上,当每台计算机的时钟偏移时,整个分布式系统中的时钟不同步。如果整个分布式系统中的时钟不同步,则依赖时钟同步的程序将出现问题。
时钟同步算法是解决物理时钟不同步的主要方法。这些算法包括但不限于:网络时间协议Berkeley算法、Critian算法。
2.2.物理时钟同步-网络时间协议(NTP)
网络时间协议是利用计算机与时间服务器同步计算机时钟,实现高精度的时间校正。
2.3.物理时钟同步-Berkeley算法
Berkeley 算法 适用于无线电时钟(radio clock)对于不可用的分布式系统,该系统无法知道真实时间,只能平均时间作为标准时间。时间服务器将定期从每个客户端获取时间,平均处理后,将每个客户端的时间和平均时间的偏移传回,以达到统一使用这个平均时间的目的。该算法适用于时间不一致、时钟速率不一致的系统。如果客户端时间偏移过大,超过容忍值,平均时间的计算通常不参与。如此可以防止系统的时间被单个异常的时钟过度影响。
Berkeley时钟同步算法图:
2.物理时钟同步-Cristian 算法
3、逻辑时钟
逻辑时钟的焦点在顺序上是一致的,这个时间不一定与实际时间相同。
3.1、Lamport逻辑时钟
Lamport逻辑时钟是一个happens-before关系,happens-before意思是先发生(happens-before在Java/go内存模型也在使用)。happens-before关系使用表达式:a->b表示读作“a发生在b之前,这意味着所有过程都同意事件a先发生,然后事件b发生。
定义逻辑时钟
- 如果a和b是同一过程中的两个事件,a在b以前发生过,然后a->b为真。
- 如果a是一个过程发送消息的事件,而b是另一个过程接收消息的事件,a->b为真。
先发关系是一种传递关系,所以如果a->b且b->c则a->c。时间x和y发生在两个不交换信息的过程中,那么x->y不为真,y->x不是真的,我们称这两个事件并发;按照这个理解,happen-before分布式系统中一主多备之间的时间关系是偏序关系。
3.2 Lamport实现逻辑时钟
实现Lamport逻辑时钟,每个时钟的过程Pi维护局部计数器Ci,按以下步骤更新计数器:
- 在执行事件之前,P执行Ci=Ci 1;
- 当进程Pi给m发消息Pj,执行1步后,戳m的时间ts(m)设置为Ci;
- 当收到消息m时,过程Pj调整自己的局部计数器Cj=max(Cj, ts(m)),然后执行第一步,并将信息传输给应用程序。
3.3 Lamport时钟校正
3.4 时钟校正说明
图a和图b说明:
- 图a和图b有三个过程;
- 图a解释了使用物理时钟获得的时间分配;
- 图b说明了使用Lamport逻辑时钟的时间分配。
3.4.1 图a-物理时钟
图a中的三个过程P1、P2和P每台计算机都有自己的时钟,每台物理时钟以不同的速度工作,以获得不同的时间。
时间6,过程P1将消息m1发送给进程P2,当m消息到达过程P2时,进程P2的时时钟值是16;进程P2发送消息m2和进程P3发送消息m3.发送时间和时钟值仍在合理的时钟值范围内;但在过程中P3发送m3到进程P2并达到P2的时钟值有问题,因为发送消息的时间应该小于达到消息的时间,而Lamport逻辑时钟解决了这个问题(看图片b)。
3.4.2 图b-Lamport逻辑时钟
Lamport逻辑时钟是让事件遵循happen-before关系。因为消息m3在时刻60离开P2,那么消息m3到达进程P1时应在61时或更晚。因此,每个消息都应根据发送者时钟的发送时间调整时钟值。图b中进程P3在收到m3消息后,我发现我的时钟小于m消息时钟,过程P2根据消息m3时钟调整时钟为61,过程P也做了同样的时钟值调整。
3.4.3 Lamport复制服务中应用逻辑时钟
复制是提高可靠性和性能的重要手段。复制面临的主要问题是一致性。所有副本应完全相同。一般来说,它们是通过全序多播来实现的。全序多播是将所有信息以相同的顺序传递给每个接收者的多播。全序多播是实现状态机复制的重要工具世界。
3.4.4 Lamport集群复制逻辑时钟
5、参考
- 分布式系统原理与范型(第2版)
- 时钟同步
- 分布式系统:Lamport 逻辑时钟 时钟同步
- 分布式系统(6) - 同步化