如何解释分布式系统中的时钟偏移?

时间:2017-09-27 22:18:39

标签: time synchronization distributed-system clock

背景

我有一个由多个分布式服务组成的系统,每个服务都不断生成事件并将这些事件报告给中央服务。

我需要提供事件的统一时间轴,其中时间轴中的顺序对应于发生的时刻事件。事件发生的频率和网络延迟是这样的,我不能简单地使用到达中央收集器的时间来订购事件。

E.g。在以下场景中:

sequence diagram

E1需要在时间轴上面 E2中呈现,尽管事后到达收集器,这意味着事件需要带有时间戳元数据。这就是出现问题的地方。

问题

由于对环境设置方式的限制,无法确保每台计算机上的本地时间服务能够可靠地识别当前的UTC时间。我可以假设每台机器都可以准确地测量相对时间,即时钟速度足够接近以使短时间间隔的测量相同,但是NTP配置错误/分区等问题使得无法保证每台机器都同意在当前的UTC时间。

这意味着简单地为每个事件生成本地时间戳的简单方法,然后使用它来排序事件将不起作用:每台机器都有自己对通用时间的看法。

所以问题是:如何恢复在时钟不同意的分布式系统中生成的事件的排序?

我考虑过的方法

我在网上找到的大多数解决方案都在尝试synchronize all the clocks的道路上,这对我来说是不可能的:

  • 我无法控制有问题的机器
  • 首先时钟不同步的原因是网络剥落,我无法修复

我自己的想法是每次生成事件时查询某种中央时间服务,然后使用检索到的时间减去网络飞行时间来标记该事件。这变得毛茸茸,因为我必须向系统添加另一项服务并确保其可用性(如果其他服务无法达到此状态,我将回到零平方)。我希望有一些聪明的方法可以做到这一点,并不要求我以这种方式集中计时。

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案,有点受到你自己的启发,是定期ping我称之为时间源服务器的。在ping中包括服务的芯片时钟;时间源回声,包括其时间戳。然后,服务可以推断往返时间并且猜测时间源的时钟处于时间戳大致往返时间/ 2纳秒之前。然后,您可以将其用作本地芯片时钟的偏移量,以确定全局时间。

您不必为此使用其他服务;收集器服务器会这样做。重要的是,您不必在每次请求时都要求调用时间源服务器;它将它从关键路径中移除。

如果您暂时不想要锯齿功能,可以smooth the time difference

恭喜,您已经重建了NTP!