服务器之间的同步时间

Posted

技术标签:

【中文标题】服务器之间的同步时间【英文标题】:Sync time between servers 【发布时间】:2012-02-23 11:06:09 【问题描述】:

我有一个网络服务器,它处理来自多个来源/机器的事件。 对于每个事件,我都会给出一个时间戳,并将其存储在数据库中。这样,即使不是源机器中的所有时钟都有准确的时间——也没关系。事件的顺序将被保留,因为服务器对时间戳负责。

现在,我想再添加一台可以处理这些事件的服务器,并将它们存储在同一个数据库中。 在服务器之间同步时钟的最佳方法是什么?服务器部署在客户站点上,虽然我可以告诉他时钟必须同步,但我想确保这一点。

有没有办法在服务器之间不通信的情况下解决它? 有没有办法在 SQL 语句中使用数据库机器时钟? (我应该支持mysql、sqlserver和oracle。我的O/R映射是休眠的)。

【问题讨论】:

听起来您需要使用 NTP 来同步服务器时钟,或者使用 SQL 函数在插入数据时插入时间戳。但不确定是否可以跨多种数据库类型使用 Hibernate 同步时钟并不能确保事件的顺序得以保留,因为如果一个事件发生在两个地方,将不再成为明确定义的事件顺序。如果必须对事件进行排序,则需要对它们进行排序。什么以及如何取决于必须对 why 事件进行排序。 -- 你的实际需求是什么? @DavidSchwartz 对于每台机器,我都会收到进度事件,例如:初始化、运行、完成。如果我在完成后开始跑步,我会将进度条显示为“正在运行”,尽管它已经完成了。这里的问题是有时会发生(如果某个进程在循环中运行)。所以,我不能在这里做任何逻辑,我需要知道事件的确切顺序是什么,跨服务器。 @Jonathan 听起来您需要在事件的源头用序列标记事件。即使您在服务器上准确地标记它们,“已完成”事件仍可能在“运行”事件之后到达服务器 - 假设一个事件进入未加载的服务器,一个事件进入已加载的服务器,导致它们被处理掉秩序。有很多解决方案,例如在事件源中添加时间戳,但选择正确的解决方案需要更详细地了解事件的来源、提交方式等。 【参考方案1】:

    同步应用程序服务器时间(NTP 等)并不能“确保”它们之间的事件完美排序。两台服务器有不同的时间线,它们无法独立决定两者中事件发生的“顺序”。这是众所周知的:http://en.wikipedia.org/wiki/Lamport_timestamps

    您说“相同” DB => 这是决定事件“顺序”的好地方。但是“事件”将是“DB 的 INSERT 请求到达”。你能接受吗?

    如果 #1 是可以接受的,并且发生的“顺序”很重要,您最好使用自动增量字段:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

你仍然可以保留时间戳,只是不要用它来决定“顺序”。

【讨论】:

我想我需要你的第二个选项。我该如何实现呢? @Jonathan:我并不是说这些是选项,而是相关的要点。即参数 #0 => 您不能“确保”使用 NTP 进行总排序。因此,参数#1 =>“确保”总排序的更好地方是在数据库中。因此参数 #2 => 使用“自动增量”字段。 MySQL 有它,我相信其他数据库也有它。自动增量字段会自动为您插入到数据库中的每个条目获取一个唯一的、递增的值。【参考方案2】:

在我看来,您正在尝试对流程进行负载平衡,以便您拥有两台可以处理事件的服务器。如 cmets 所述,在服务器上使用 NTP 是最好的方法。

如果您不能保证这一点,为什么不让您的代码调用您选择的NTP server?如果所有适用的服务器都调用同一个 NTP 服务器,则可以确保时间是一致的。然后可以将来自 NTP 服务器的时间存储在 DB 中或您想用它做的任何其他事情中。

【讨论】:

【参考方案3】:

NTP 实用程序有 2 种时间同步类型。

    立即获取时间并标记它。 (ntpdate) 获取时间并逐渐同步时间提供者和消费者之间的时间。 (xntpd)

ntpdate需要一个命令行参数,时间服务器的ip地址。 xntpd 需要你在 ntp.conf 中配置(相同的 ip 地址)。 xntpd 然后需要作为守护进程运行。它与时间提供者通信并逐渐校正时间,并使您的时间使用者始终与服务器保持同步,精确到纳秒。

配置和使用 xntpd 是一个好习惯。 xntpd 在第一次开始接近服务器时也会调用 ntpdate。

因此,根据您的要求,您可以定期调用 ntpdate(使用 cron,可能每天 1 次,因为时间不会漂移超过几毫秒),或者只配置 xntpd 并完成它。

如果您选择 xntpd,您可能需要一种方法来了解您是否已同步。为此,您需要运行一个名为 ntpq 的命令行交互式工具。这将帮助您了解同步的状态。

要更详细地了解 ntpq,请参阅http://www.novell.com/coolsolutions/trench/5730.html (注意,在这个技术说明中,rvi 命令是特定于 netware 的,unix 只有一个 rv 命令)

【讨论】:

以上是关于服务器之间的同步时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql和sqlite之间同步数据?

如何在多个 linux 服务器之间同步数据 [关闭]

Unet 不同步客户端-服务器、服务器-客户端之间的浮点值

在服务器和多个客户端之间同步数据库更改

服务器和多个客户端之间的数据同步

AngularJS 在服务器和客户端之间自动同步数据