为什么 NTP 同步到本地而不是远程服务器?

为什么 NTP 同步到本地而不是远程服务器?

因此,我尝试调试当前的 NTP 设置,发现它与我配置的单个服务器的偏移量超过 3 秒,并且没有调整。ntpq 输出中 LOCAL(0) 上的星号似乎表示系统正在与自身同步,而不是与 10.130.33.201 服务器(这是我们系统上的另一个 Linux 机器,我们希望所有内容都与其同步)同步。

ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 10.130.33.201   LOCAL(0)         9 u   49   64  377    0.242  -3742.2   1.049
*LOCAL(0)        .LOCL.          10 l    2   64  377    0.000    0.000   0.001

这是我的 ntp.conf 文件。由其他人编写,所以我不能 100% 确定所有内容都是正确的。

server 10.130.33.201 burst iburst minpoll 4 maxpoll 11
driftfile /mnt/active/etc/ntp.drift

restrict -4 default  nomodify nopeer notrap
restrict -6 default  ignore

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10

我已经阅读了有关 burst 和 iburst 以及 minpoll/maxpoll 的文章,所以我意识到这些可能不需要,但我认为这与我当前的问题无关。

此外,由于部署方式的原因,更改该配置文件需要做大量工作,因此我希望没有什么真正需要更改的。我希望这只是因为我不了解 NTP 的工作原理。


编辑 -

因此,这看起来是这个问题,但我觉得发帖人没有得到足够的答案,所以我仍然想知道为什么本地时间优先于服务器时间。另外,按照下面的一个答案,我尝试prefer在配置的服务器行上使用关键字并重新启动,但这似乎没有效果。

如果我按照另一个问题的答案所建议的那样删除配置中的所有“本地”行,如果服务器无法访问,会发生什么? NTP 会死机还是会继续尝试?


重要编辑——

好的,通常情况下,10.130.33.201(“服务器”)无法访问互联网,也没有 GPS 时间源可用。重要的是,系统上的所有设备都与服务器的时间相同,无论该时间实际上有多准确。

因此,为了看看会发生什么,我将其中一个 NTP 池服务器添加到服务器的配置文件中,以便从那里获取时间,而不是从本地获取时间。现在它可以正确地从 NTP 时间服务器获取时间。

在我这样做之后,客户端现在与服务器同步,而不是偏向 LOCAL(0)

 ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*10.130.33.201   38.229.71.1      3 u   58   64  377    0.216  715621.   1.001
 LOCAL(0)        .LOCL.          10 l   18   64  377    0.000    0.000   0.001

新问题 - 当我的服务器使用本地(给出的原始示例)时,客户端似乎在说:“哦,10.130.33.201 正在使用 LOCAL(0)。嗯,我也有 LOCAL(0) 服务器 - 我将直接使用它,而不是通过 10.130.33.201 获取相同的信息”。

是这样吗?他们是否试图“直接转到源”,而源却是错误的 LOCAL(0)?我需要我的服务器从 LOCAL(0) 获取时间,我需要客户端从服务器获取时间。目前,从客户端配置文件中删除“本地”服务器是唯一的选择,但我想了解为什么会发生这种情况,并且如果可能的话,避免更改他们的配置(由于我们的环境,配置更改将需要大量工作……)。

还,看起来像另一个没有好答案的重复。

答案1

如果只配置了一个 NTP 服务器,算法就不能完全确定该信任谁。尽管远程主机的层级较低,但我敢打赌,算法认为本地时间更值得信赖。

尝试prefer在您的server语句中使用关键字将其设置为优先时间源。


编辑 -

因此,看起来这是该问题的重复,但我觉得发帖人没有得到足够的答案,所以我仍然想知道为什么本地时间比服务器更受青睐。

为了得到真正充分的答案,你将深入研究一个非常复杂的算法。文档甚至没有提到具体来说,但我确信有一份白皮书或规范。

如果我按照另一个问题的答案所建议的那样删除配置中的所有“本地”行,如果服务器无法访问,会发生什么? NTP 会死机还是会继续尝试?

NTP 守护进程不会死机或停止,但它会在无法连接到远程服务器后停止同步时间。这就是为什么最佳实践会建议至少使用三台远程服务器,并且除非您与网络断开连接,否则不要使用 LCL。建议使用三台服务器,因为当只有两台服务器时,如果它们不一致,它会选择哪台?第三台服务器应该有助于算法消除虚假服务器。

最后,我刚刚注意到您没有定义driftfile。这可能有帮助吗?

答案2

在我看来,偏移间隔(系统时间与 NTP 主机时间之间的差异)相差太大,以至于 NTP 无法正确设置它。

我的建议,

 1. Stop the NTP service
 2. As root ntpdate -bs 10.130.33.201 to reset your time to something close
 3. Start the NTP service

此后您应该不会再遇到任何问题。

答案3

我知道这已经过时了,但我认为你是对的。没有人展示任何调试 ntpd 问题的方法。事实证明这是可行的。

我认为,当您怀疑在本地和上游服务器上使用 LOCAL(0) 可能存在问题时,您的思路是对的。

肯定是在一个有 4 台服务器的时间岛上,我遇到了类似的问题。这些服务器都设置为彼此对等,因此可能与您的问题不同。

首先,有一种更好的处理时间岛的方法,称为孤立模式,这种方法在过去几年的 ntpd 版本中已得到支持:

doc.ntp.org 上的孤立模式

最初,所有 4 台服务器的层级均为 10,并且首选本地时钟。我修复了这个问题,但它们仍然首选本地时钟(不过层级似乎确实很重要)。

我使用 ntpq 命令 pe (peer)、as、rv 来了解发生了什么。您需要对服务器的关联编号使用 rv (readvar) 来转储信息。pe 和 as 似乎按相同的索引排序,因此您可以通过这种方式获取 as 编号。as 有一个名为 condition 的字段,如果它不喜欢该服务器,则可能会显示值拒绝。

在 rv 输出中有一个名为 flash 的字段。如果一切正常,它将为零。如果不是,它是问题的位掩码(以十六进制显示)。可以在此处查找它们:

ntpd 内部解码

我遇到的问题是 0800 peer_loop。事实证明,重新设置时钟非常重要。如果在本地时钟和远程服务器上都看到 LOCAL(0),ntpd 就会认为存在循环。David Mills 在 comp.protocols.time 的帖子“如何避免 NTP 中的循环”中证实了这一点(我已经达到 2 个链接的限制,抱歉!)

使用 refid 参数来 fudge 设置唯一的 refid 不起作用 - 它仍然在收件人处显示为 LOCAL(0)。

似乎有效的方法是为本地驱动程序使用唯一的实例编号。127.127.1.[0-3]。在服务器和 fudge 行上使用相同的 ID。当我这样做时,服务器通常会同步到通常使用其本地时钟的最低层服务器。但是它偶尔会尝试使用将其用作源的其他服务器之一。但是时间已经同步并且似乎一直保持这种状态。

可能太迟了,但我提供它来表明 NTP 适合逻辑和故障排除。我花了几个小时通过反复试验找到答案,然后找到了文档。

答案4

在最初的场景中,“服务器”位于第 9 层,LOCAL也从 同步。正如https://serverfault.com/a/474555/407952远程 9 层服务器在本地将是 10 层,因此具有与“本地LOCAL”相同的层,但统计信息更差。因此将使用本地后备。

通常你需要至少四个真实的NTP 服务器,而不仅仅是从不可靠的时钟 (LOCAL) 获取时间的服务器。在 Intranet 中,您可能希望从一台服务器分发时间,并且如果您无法使用 GPS 或(在欧洲)DCF-77 提供参考时钟,则“捏造”(使层变小)LOCAL 的层。

相关内容