![为什么 NTP 同步到本地而不是远程服务器?](https://linux22.com/image/798672/%E4%B8%BA%E4%BB%80%E4%B9%88%20NTP%20%E5%90%8C%E6%AD%A5%E5%88%B0%E6%9C%AC%E5%9C%B0%E8%80%8C%E4%B8%8D%E6%98%AF%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
因此,我尝试调试当前的 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 版本中已得到支持:
最初,所有 4 台服务器的层级均为 10,并且首选本地时钟。我修复了这个问题,但它们仍然首选本地时钟(不过层级似乎确实很重要)。
我使用 ntpq 命令 pe (peer)、as、rv 来了解发生了什么。您需要对服务器的关联编号使用 rv (readvar) 来转储信息。pe 和 as 似乎按相同的索引排序,因此您可以通过这种方式获取 as 编号。as 有一个名为 condition 的字段,如果它不喜欢该服务器,则可能会显示值拒绝。
在 rv 输出中有一个名为 flash 的字段。如果一切正常,它将为零。如果不是,它是问题的位掩码(以十六进制显示)。可以在此处查找它们:
我遇到的问题是 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 的层。