我有一个Web服务器,它处理来自多个源/机器的事件。 对于每个事件,我给出一个时间戳,并将其存储在DB中。这样,即使并非源机器中的所有时钟都有准确的时间 - 它也不重要。事件的顺序将被保留,因为服务器负责时间戳。
现在,我想再添加一个可以处理这些事件的服务器,并将它们存储在同一个数据库中。 在服务器之间同步时钟的最佳方法是什么?服务器部署在客户网站上,虽然我可以告诉他时钟必须同步,我们希望确保这一点。
有没有办法在没有服务器之间通信的情况下解决它? 在SQL语句中有没有办法使用DB机器时钟? (我应该支持mysql,sqlserver和oracle。我的O / R映射是休眠的。)
答案 0 :(得分:2)
同步应用程序服务器次数(NTP等)不会“确保”跨越它们的事件的完美排序。这两个服务器具有不同的时间轴,并且他们无法独立决定两者中发生事件的“顺序”。这是众所周知的:http://en.wikipedia.org/wiki/Lamport_timestamps
你说'相同'DB =>这是决定事件“顺序”的好地方。但'事件'将是“INSERT请求到达DB”。这对你来说是否可以接受?
如果#1可以接受,并且出现的'顺序'很重要,那么最好使用自动增量字段:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
您仍然可以保留时间戳,只是不要用它来决定'订单'。
答案 1 :(得分:0)
听起来我正在尝试对进程进行负载平衡,以便您有两台可以处理事件的服务器。正如评论中所提到的,在服务器上使用NTP是最好的方法。
如果您无法保证这一点,为什么不让您的代码呼叫您选择的NTP server?如果所有适用的服务器都呼叫同一个NTP服务器,则可以确保时间一致。然后,来自NTP服务器的时间可以存储在数据库中或您想要使用的任何其他内容中。
答案 2 :(得分:0)
NTP Utilities有两种类型的时间同步。
ntpdate需要一个命令行参数,即时间服务器的ip地址。 xntpd需要您在ntp.conf中配置(相同的IP地址)。然后,xntpd需要作为守护进程运行。它与时间提供者进行通信,并逐步纠正时间,并使您的时间消费者始终与服务器保持同步,达到纳秒级。
配置和使用xntpd是一种很好的做法。 xntpd在第一次开始接近服务器时也会调用ntpdate。
因此,根据您的要求,您可以定期调用ntpdate(使用cron,可能一天一次,因为时间不会漂移超过几毫秒)或只是配置xntpd并完成它。
如果您选择xntpd,您可能需要一种方法来了解您是否已同步。为此,您需要运行名为ntpq的命令行交互工具。这将帮助您获得同步的状态。
要更详细地了解ntpq,请参阅http://www.novell.com/coolsolutions/trench/5730.html (注意,在本技术说明中,rvi命令特定于netware,unix只有rv命令)