如果您在运行时更改系统时间,我已经听到有关数据库和邮件服务器发生故障的传言。 但是,我很难find有关实际风险的具体信息。
我有一个运行在Debian Wheezy主机上的产品Postgres 9.3服务器,时间是367秒。 我可以运行ntpdate
或在Postgres运行时启动openntp,或者可能导致问题吗? 如果是的话,更正时间的更安全的方法是什么?
有其他服务对系统时间的变化更敏感吗? 也许邮件服务器(exim,sendmail等)或消息队列(activemq,rabbitmq,zeromq等)?
数据库不喜欢及时的后退步骤,所以你不想从跳跃时间的默认行为开始。 如果偏移量小于600秒(10分钟),将-x
选项添加到命令行将转换时间。 在最大转换速率下,花费大约一天半时间来调整时钟一分钟。 这是一个缓慢但安全的方式来调整时间。
在运行ntp
来调整时间之前,可能需要使用-g 2
这样的选项来启动ntp
来validation它正在检测的偏移量有多大。 这将设置恐慌偏移量为2秒,这应该是相对安全的。
在这个选项之前我已经使用了一个替代选项,那就是编写一个循环,每分钟左右重置一次秒钟。 如果你检查确保重置不会改变第二个这可能是安全的。 如果大量使用时间戳,则可能会出现无序的logging。
一个常见的select是closures服务器足够长的时间,不会有时钟的倒退。 可以将ntp
或ntpdate
configuration为在启动时将时钟跳转到正确的时间。 这应该在数据库启动之前完成。
如果数据库非常活跃并且在内部logging上有时间戳,则数据库尤其容易受到系统时间变化的影响。 一般来说,如果时间落后了,如果突然向前跳跃,就会比在前进时突然跳下来的问题less得多。
正如Joffrey所指出的那样 – 比起数据库本身,突然出现时间跳跃的应用程序更为常见。 最安全的方法是closures应用程序N + 1分钟(其中N是系统时钟提前的分钟数),然后同步时间,启动NTP,然后重新启动应用程序。 如果你在应用程序中不能占用那么多的停机时间,那么我只能build议你在同步时间之前先备份数据库,然后提供一个死的松鼠给计算机中心,然后拉动触发器。 好吧,我有点儿滑稽,但我想不出任何其他“安全”的方式比应用程序中断。
通常不是数据库服务器在发生即时时间跳动时容易出错:使用时间的应用程序。
通常有两种跟踪时间的方法:自己的时间跟踪或比较系统时间。 两者都有一些正面和负面的权衡。
我发现这在一些embedded式编程和系统中使用,其中确切的时序并不重要。 在一个主要的应用程序循环中,一个跟踪“滴答”的方法被照顾。 这可能是由内核给出的报警,睡眠或select,表明已经过去的时间量。 当你知道什么时候通过了,你知道你可以把这个时间加到或减去一个计数器。 这个计数器是什么使你的计时应用程序发生。 例如,如果计数器高于10秒,你可以丢弃一些东西,或者你需要做一些事情。
如果应用程序没有logging时间,计数器将不会改变。 这可能是需要的,这取决于您的应用程序的devise。 例如,跟踪一个长时间运行的进程需要处理多长时间的处理比启动/停止时间戳列表更容易。
优点:
缺点:
这是更经常使用的系统:存储时间戳并使用系统时间调用将其与时间戳进行比较。 系统时间的巨大偏斜可能威胁到应用程序的完整性,几秒钟的任务可能需要数小时或根据时钟方向立即结束。
优点:
缺点:
大多数应用程序将使用时间戳与计划任务进行比较。 对于可能是caching清理的数据库系统。
所有使用查询语言的数据库和调用时间函数的应用程序如果应用程序没有检测到并处理,将会受到偏斜的影响。 应用程序永远不会停止运行,或根据其用途允许无限期的login期限。
邮件系统将使用时间戳和/或超时处理陈旧或未传送的邮件。 时钟歪斜可能会影响,但影响小得多。 有关重新连接到服务器的回退计时器可能会被丢失,从而导致连接服务器受到处罚。
我不认为(没有研究过)在更改系统时间时内核报警会closures。 使用这些系统的系统可能是安全的。
轻轻地移动时间。 这可以在您最喜爱的时间解决scheme的文档中find。