我听说如果在数据库和邮件服务器运行时更改系统时间,它们会发生坏事。但是,我很难找到有关实际风险的任何具体信息。
我有一个在 Debian Wheezy 主机上运行的生产 Postgres 9.3 服务器,时间缩短了 367 秒。我可以ntpdate
在 Postgres 运行时运行或启动 openntp,还是可能会导致问题?如果是这样,更正时间的更安全方法是什么?
是否有其他服务对系统时间的变化更敏感?也许是邮件服务器(exim、sendmail 等)或消息队列(activemq、rabbitmq、zeromq 等)?
数据库不喜欢在时间上倒退,因此您不希望从跳时的默认行为开始。如果偏移量小于 600 秒(10 分钟),则将选项添加
-x
到命令行将缩短时间。在最大转换速率下,将时钟调整一分钟大约需要一天半的时间。这是调整时间的一种缓慢但安全的方法。在运行
ntp
以调整时间之前,您可能希望从ntp
一个选项开始,例如-g 2
验证它检测到的偏移量有多大。这会将恐慌偏移设置为 2 秒,这应该是相对安全的。在此选项可用之前,我使用的另一个选项是编写一个循环,每分钟左右将时钟重置为秒的一部分。如果您检查以确保重置不会改变第二个,这可能是安全的。如果您大量使用时间戳,则可能会出现乱序记录。
一个常见的选项是关闭服务器足够长的时间,以使时钟不会向后移动。
ntp
或者ntpdate
可以配置为在启动时将时钟跳到正确的时间。这应该在数据库启动之前完成。如果数据库非常活跃并且在内部记录上有时间戳,那么它们尤其容易受到系统时间变化的影响。一般来说,如果你的时间落后了,你突然向前跳比你领先然后突然向后跳的问题要少得多。
正如 Joffrey 所指出的 - 与数据库本身相比,出现突然时间跳跃问题的应用程序更常见。更正时间的最安全方法是关闭应用程序 N+1 分钟(其中 N 是您的系统时钟提前的分钟数),然后同步时间,启动 NTP,然后重新启动应用程序。如果您不能在应用程序中占用那么多停机时间,我只能建议您在同步时间之前备份数据库,然后向计算机界的上帝提供一只死松鼠,然后扣动扳机。好吧,我有点开玩笑,但除了让应用程序中断之外,我想不出任何其他“安全”的方法。
当发生瞬时时间跳跃时,通常不是数据库服务器容易出错:它是使用时间的应用程序。
跟踪时间一般有两种方式:自己的时间跟踪或比较系统时间。两者都有一些积极和消极的权衡。
自己的时间跟踪
我看到这在一些嵌入式编程和系统中使用,其中确切的时间并不那么重要。在主应用程序循环中,会处理一种跟踪“滴答”的方式。这可能是内核、睡眠或选择发出的警报,指示经过的时间量。当您知道经过了多少时间时,您就知道可以在计数器上加上或减去这个时间。这个计数器是使您的计时应用发生的原因。例如,如果计数器高于 10 秒,您可以丢弃某些东西,或者您需要做一些事情。
如果应用程序不跟踪时间,则计数器不会更改。这可能是需要的,具体取决于您的应用程序的设计。例如,使用计数器比开始/停止时间戳列表更容易跟踪长时间运行的进程处理某件事的时间。
临:
缺点:
比较系统时间
这是更常用的系统:存储时间戳并使用系统时间调用将其与时间戳进行比较。系统时间的巨大偏差可能会威胁到应用程序的完整性,几秒钟的任务可能需要几个小时或立即结束,具体取决于时钟的方向。
临:
缺点:
受影响的系统
大多数应用程序将使用时间戳比较来安排任务。对于可能是缓存清理的数据库系统。
如果应用程序没有相应地检测和处理,所有使用查询语言中的数据库和调用时间函数的应用程序都将受到偏差的影响。应用程序永远不会停止运行或允许无限期登录,具体取决于其用途。
邮件系统将使用时间戳和/或超时来处理陈旧或未送达的邮件。时钟偏差可能会影响这一点,但影响要小得多。可能会错过有关重新连接到服务器的退避计时器,从而导致连接服务器受到惩罚。
我不认为(尚未研究)更改系统时间时内核警报会响起。使用这些的系统可能是安全的。
解决方案
轻轻移动时间。这可以在您最喜欢的时间解决方案的文档中找到。