分布式系统(五)时钟与顺序

214 阅读5分钟

时钟和顺序

时钟简述

什么是分布式系统下的时钟

大多数设备都有时钟功能,时钟在通信时起到了非常重要的作用。

集中式系统下,时钟由设备自行控制,没有与其他设备的交互,因此时钟值的准确性影响并不是很大。

分布式系统下,存在每个设备也都有自己的时钟,各个时钟的值可能不一样。如果分布式系统的各个设备时钟不同,那么凡是用到时间或时间戳的地方就会出现时钟问题。因此保证各个设备时间的一致性是非常重要的。

分布式系统中的时钟最重要的应用之一就是保证事件的有序性,比如LWW依赖于时钟。

时钟一致性的几种方式

目前工业中使用最多的方式是时钟同步。

  • 物理时钟:通过设备自身的物理时钟实现。不可行,因为物理时钟有误差,所以不可能一致。
  • 逻辑时钟:通过逻辑上的时钟实现,可行,由于并非物理性质的时间戳,因此时间都是可控的,但是复杂度高并且会出现冲突问题。
  • 时钟同步:使用物理时钟,但同时依赖于一组更加准确的时钟服务器,各个设备不断的从服务器同步时间,可行,但也有一定误差,最小可控制在几十毫秒之内。

物理时钟

时间本质上是一个过程,只要一个物理东西能够模拟这个过程,并加以累计和计算,那么这就是物理时钟。

通常最准确的物理时钟时以铯原子跃迁的周期为1s,从而实现的铯原子钟。但由于造价昂贵,因此现代计算机或大多数网络设备上都是用石英钟,造价低廉但同时也不是非常精准,特别是高温情况下。

时钟同步

为什么需要时钟同步

分布式系统中,每个设备都有一个各自的时钟,如果这些设备的时钟都不相同,那么就会出现一次完整请求中,链路中的不同设备上看到的请求发生时间不一致。另外由于一些通信依赖于时钟,当时间错误时,还可能会发生通信故障。

如一次请求中依次经过了A、B、C三个设备。理论上A、B、C三个设备上看到的请求日志时间应该是A<B<C。但由于A、B、C三个设备时间没有同步,因此最终A设备上请求时间为2022-1-1 12:00:00,而B设备上看到的时间为2021-2-2 12:00:00,C设备上看到的时间为2022-1-1 12:01:00。由于时钟未作同步而导致无法观测调用情况。

如分布式系统中,处理并发情况时使用了时间戳对比,而由于各个设备上时间不一致,那么就会产生并发问题。

时钟同步算法
NTP

通过NTP实现分布式系统中各个设备上时间的一致。

NTP的原理是各个设备从同一组NTPD服务器上逐步同步时间,直到时间趋于一致,而这组NTPD服务器可能又是从其他更上层NTPD服务组上同步的时间。

最顶层的NTPD通常由权威机构所持有,底层通过铯原子钟保证时间的准确性。同时针对特殊的误差由人工或机器校准。

逻辑时钟

由于物理时钟误差太大时钟同步依旧有几十毫秒的误差,因此出现了逻辑时钟。

逻辑时钟本质上并非是真实的时间,而是用这种逻辑概念来表现事件的顺序。

使用逻辑时钟,进程的每一个操作都是事件,由进程为每一个进程分配一个逻辑时间戳,从而保证事件一定是有序的。

Lamport 算法

有序通信

有序通信非常重要,有时这决定程序以什么样的逻辑运行。

如设备1同时收到另外两台设备2和3的交互时(如2尝试修改A=2,3尝试修改A=3),1会根据2和3发生的时间戳,来选择执行哪一个交互。如果2先发生,那么最终A=3;如果3先发生,那么最终A=2。如果时钟一致时,依赖于时钟的通信就是有序的。当时钟不一致时,2虽然发生的早,但设备时间较大,3虽然发生迟,但设备时间较小,最终会导致期望的是先执行2再执行3,但由于时钟不一致导致时间戳不正确,从而造成结果发生错误。

设备故障后,副本选举中,多个副本都尝试发起选举请求,通常先发起的副本应当票数最多,但由于时钟不一致导致通信不是有序的,最终选举出来的副本很可能并不是理论上的设备。