两台远程计算机之间的同步(时钟)

时间:2008-12-23 16:54:17

标签: time synchronization clock

我正在考虑在我的应用程序中编写一个简单的同步功能,其中一个问题是两个远程计算机之间的时间同步,每个计算机都有自己的时钟(特别是关于文件/对象的修改日期) )。

我确信已就此主题进行了大量研究,并且不想过于理论化,但我想知道是否有任何可接受的最佳做法可以最大限度地减少远程时钟之间的时间差异?

例如,开始是始终使用通用时间(UTC),因为这可以避免时区问题,但不能保证两台计算机将具有完全相同的系统时间。幸运的是,我正在做的工作并不是非常精细,所以它并不是一个非常重要的问题,但我仍然很好奇。

一种解决方案是始终在两端使用相同的时钟,例如全局时间服务器,而不是本地系统时钟。据推测,这(与共享资源锁相结合)可以保证同步时间不会意外重叠,但这不太实用。

有人认为只是突然出现在每个节点(每个客户端)与先前某点计算的偏移同步,可能是通过计算系统时钟与全球时间服务器的偏移量。这只需要偶尔进行,因为偏移本身不会在短时间内发生很大变化。

更新:我只想补充一点,我对实际同步两台计算机的系统时钟并不感兴趣 - 我认为操作系统在大多数情况下都会处理这个问题。这只是一个如何确保应用程序的两个实例使用同步时间的问题,尽管在这个时代,我认为系统时钟几乎肯定会在一些非常小的delta内同步。

9 个答案:

答案 0 :(得分:18)

依赖NTP为您的应用程序,因为其他人建议是容易的软糖。正确的方法是使用Lamport的分布式时钟同步算法。它在1978年的经典论文Time, clocks, and the ordering of events in a distributed system中得到了解释。

答案 1 :(得分:8)

查看“Network Time Protocol”(NTP)规范。

答案 2 :(得分:5)

您可以尝试PTP,精确时间协议(PTP)是一种用于在整个计算机网络中同步时钟的协议。在局域网上,它可以在亚微秒范围内实现时钟精度,使其适用于测量和控制系统。 http://en.wikipedia.org/wiki/Precision_Time_Protocol

答案 3 :(得分:3)

将它们与NTP网络时间协议同步。

你在哪个平台上?

使用NTP,您可以将计算机的时间与原子钟同步,并使用世界上的官方时间。

答案 4 :(得分:3)

不是编写代码来同步时钟,而不是只能在两台机器上运行ntp客户端吗?

或者,如果上述情况不可能并且您的应用程序正在以足够的权限运行来设置时间,那么我很想在应用程序中实现最小的NTP客户端并尝试将其与公共服务器同步。只是不要在...中硬编码某人的私人服务器。

答案 5 :(得分:3)

这是我目前必须解决的问题,对于那些能够做很多事情来破坏前几个贡献者提出的合理建议的不熟练的最终用户。一个不成熟的最终用户至少可以做这些事情,还有更多:

1)没有足够的计算知识来设置ntp时间同步

2)将计算机时钟设置为不正确的家庭时钟或手机时钟

3)在Windows XP中意外禁用ntp时间同步而不知道如何再次启用它,或者计算机日期设置错误,在这种情况下Windows ntp不起作用

4)计算机生物电池电量不足,因此电脑总是在1970年启动!

5)用户将他们的笔记本电脑带到国外并暂时将笔记本电脑时钟设置为当地时间但不改变时区,所以现在电脑将返回错误的时间!!!

因此,您的程序本身必须管理时间,当然您希望以最小的开销实现这一目标。

假设有两个运行程序的最终用户需要程序在将来的相同绝对时间执行某些操作。

我提出这个方案,从cron工作的方式中得到一些想法,如果有人能提出改进意见,我会很高兴。

1)当你的应用程序启动时,它会通过soap调用第三方服务器或你自己的时间服务器(你可以用ntp自己保持时间)将自己的内部utc时间同步到ntp。

2)之后,它会增加系统时钟的经过时间以保持时间。如果要求严格,您可能需要定期重复ntp同步。

3)然后,应用程序会查看需要按时完成的未来作业列表。它需要知道最早的工作。

4)然后创建一个线程,它在最早的工作之前停留一段时间,减去安全边际,这取决于您的要求可能提前10分钟,提前一两个小时等等

5)当线程唤醒时,它会通过进一步的soap调用重新检查绝对时间,然后依赖系统时钟来增加经过的时间,直到它达到应该执行第一个作业的时间。 / p>

6)一旦触发了作业(在另一个线程中运行),时间监视线程就会计算出前一个下一个任务时间,并在此期间再次进入休眠状态。

该想法的改进:

1)用户可以在到期作业之前关闭应用程序,因此您可能需要使用上述相同同步方案的后台进程或服务来独立监视存储在数据库或文件中的作业列表,以及及时启动应用程序。 (在Windows中,生成应用程序进程)

2)您的应用程序可能正在动态添加更新的早期作业,或者删除作业,因此您的休眠线程可能需要唤醒才能重新计算新的早期作业,或者删除作业后的作业。在Win32中,您可以通过在事件上等待超时的线程执行此操作,您设置为强制它重新计算休眠时间。在Linux中毫无疑问有类似的机制。

3)对于Soap调用来获取时间,记下发送Soap的时间和收到响应的时间。如果周转时间太长,您不能依赖时间,可能需要重复呼叫,否则您可能会妥协。例如,如果Soap说计算机时钟快5分钟,但Soap呼叫本身需要一分钟才能回复,那么你只能确定计算机时钟至少快4分钟。

答案 6 :(得分:2)

我们做的一件事实际上是将所有计时操作卸载到“主机”机器上。例如,如果您有20台服务器都共享数据库,请使用数据库的时间。如果你有一台中央服务器和一百万台客户端机器,那么客户端机器不应该负责任何计时;完成所有同步服务器端。在真正的“分布式”环境中,如P2P网络或其他东西,使用最直接“拥有”有问题的资源的机器(实际的PC,您要编写的文件)来同步/控制对文件的访问。

答案 7 :(得分:0)

任何联网机器都应该使用NTP。所有现代系统都包含一种简单的方法来设置它。唯一的问题应该是选择一个特定的服务器,如果你需要一点额外的精度;但它已经在毫秒范围内,所以我不在乎,通常只指向pool.ntp.org

答案 8 :(得分:0)

不要使用NTP。 NTP仅用于获取日期/时间。

它可以在不通信的应用程序之间同步事件。例如,报警应用程序和您的身体。

对于有直接通信,共享资源的应用,使用灯管时钟或矢量时钟,Diomidis说。 Lamport时钟可以很好地实现事件之间的部分顺序,当您需要识别并发事件时,矢量时钟很棒。