使用 NTP 将一组 Linux 服务器同步到公共时间源

使用 NTP 将一组 Linux 服务器同步到公共时间源

我有 20 台左右的 Linux 服务器,我想将它们的所有时钟同步到单个 NTP 服务器,该服务器与我的服务器位于同一机架和交换机中。没有虚拟化任何内容。

我们的管理员无法让各个机器上的时钟同步到 500 毫秒以内。我猜是这样的,这个帖子意味着我们应该能够使Linux机器与源机器在2毫秒内同步。

我对 NTP 的期望是否不合理?管理员应该做什么/检查什么?有什么提示吗?

答案1

我拥有一家托管公司,我们就是这么做的。以下是我们实现这一目标的方法。

首先,您需要一个 NTP 主源。因此,您的一台 Linux 服务器将成为主服务器。我将创建一个名为 time.example.com 的 DNS A 记录(假设 example.com 是域)。这样,如果您的主服务器移动,您就不需要更新其他 19 台服务器。

在主服务器上,您需要有一个适当配置的 ntp.conf 文件。

以下是我们的主 /etc/ntp.conf 文件之一。请注意,这是一个使用 172.17.xx 的私有地址空间 (RFC1918) 的数据中心,因此您需要进行相应调整。如果您想要多个主服务器,请创建多个 DNS A 记录,每个记录具有不同的 IP,以便在需要时获得一定的容错能力。

server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10

server 0.north-america.pool.ntp.org
server 1.north-america.pool.ntp.org
server 2.north-america.pool.ntp.org
server 3.north-america.pool.ntp.org


# Logging & Stats
statistics loopstats
statsdir /var/log/ntp/
filegen peerstats file peers type day link enable
filegen loopstats file loops type day link enable

# Drift file.  Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
#
driftfile /etc/ntp/drift
broadcastdelay  0.008

restrict default noquery nomodify

restrict 0.north-america.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 1.north-america.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 2.north-america.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery
restrict 3.north-america.pool.ntp.org mask 255.255.255.255 nomodify notrap noquery

# Allow LAN to query us
restrict 172.17.0.0 mask 255.255.0.0 nomodify notrap

# Trust ourselves.  :-)
restrict 127.0.0.1

现在在每个客户端上,我们都有一个如下所示的 /etc/ntp.conf 文件:

server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10
server time.example.com

# Drift file.  Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.

driftfile /etc/ntp/drift
multicastclient                 # listen on default 224.0.1.1
broadcastdelay  0.008

# Don't serve time or stats to anyone else by default (more secure)

restrict default noquery nomodify

restrict time.example.com mask 255.255.255.255 nomodify notrap noquery

# Allow LAN to query us
restrict 172.17.0.0 mask 255.255.0.0 nomodify notrap

# Trust ourselves.  :-)
restrict 127.0.0.1

使用 ntpq 命令查看您与之同步的服务器。它为您提供了已配置的时间服务器列表以及您的服务器与这些服务器之间的延迟、偏移和抖动。为了正确同步,延迟和偏移值应为非零,抖动值应低于 100。

在我们的客户端节点上,我们还有一个 rc 脚本 (/etc/rc.d/rc.local),用于在启动 NTPD 守护进程之前同步时钟。以下是重要部分... 它们依赖于顺序。

将客户端的时钟与主时间源同步 /usr/sbin/ntpdate -b time.example.com

启动 NTPD 守护进程,允许在启动期间进行大幅度的时间调整。/usr/sbin/ntpd -g -x

最后,根据您的设置,您需要设置防火墙规则,以允许您的 time.example.com 主服务器通过 UDP 端口访问公共互联网。以下是典型且放置适当的 IPTables 规则

iptables -t nat -A POSTROUTING -o $PUB_IF -p udp --dport 123 -j MASQUERADE

其中 PUB_IF 是公共接口(eth0、eth1 等等)

答案2

正确配置的 NTP 将在几毫秒内实现同步。我始终确保每个 NTP 客户端至少与三个 NTP 服务器通信。

用于ntpq -p监控状态 - 它应该会给出一些迹象表明为什么您没有获得更好的同步。

答案3

我不确定您是否可以实现如此少的时间同步,但正确配置 ntp 服务器将使服务器同步几乎 10-20 毫秒,这是我在服务器上所做的。尽量减少漂移时间。这并非不可能实现,但在设置 NTP 服务器并将所有服务器指向该 NTP 服务器并首次手动同步时间后,将减少服务器之间的时间差异。

相关内容