关于 NTP 服务器的基本概念: 时间服务器:NTP服务器
关于 NTP 服务器的基本安装搭建:NTP 服务器的安装与设定
目标环境,5台 Linux centos 6.5, 一台作为 NTPD 服务与外部公共 NTP 服务同步时间,同时作为内网的 NTPD 服务器,其他机器与这台服务做时间同步。其中也只有一台作为 NTPD 服务的机子可以上外网,其他的主机只能在局域网中通信。
1. NTP时间同步方式选择
现有一台设备,系统时间是 13:00 , 真实的当前时间(在空中,也许卫星上,这里假设是在准备同步的上级目标NTP服务器)是: 12:30 。如果我们使用ntpdate同步(ntpdate -u 目标NTP服务器IP),操作系统的时间立即更新为12:30,假如,我们的系统有一个定时应用,是在每天12:40运行,那么实际今天这个的任务已经运行过了(当前时间是13:00嘛),现在被ntpdate修改为12:30,那么意味作10分钟后,又会执行一次任务,这就糟糕了,这个任务只能执行一次的嘛!这就暴露了 ntpdate 时间同步的隐患,当然这个例子有些极端,但的确是有风险的,生产环境我不打算这么干,还是稳妥点好。所以解决该问题的办法就是时间平滑更改,不会让一个时间点在一天内经历两次,这就是NTPD服务方式平滑同步时间,它每次同步时间的偏移量不会太陡,是慢慢来的(完全同步好需要较长时间,所以一般开启 NTPD 服务同步前先用 ntpdate 先手动同步一次)。
2. 关系如下:
IP 地址 | NTP 角色 | 说明 | 是否开启 ntpd | 同步方式 |
---|---|---|---|---|
10.6.3.43 | NTPD服务 | 1、负责与外部公共NTPD服务同步标准时间 2、作为内外网络的NTPD服务 |
是 | NTPD服务平滑同步 |
10.6.3.32 | 内外NTP客户端 | 内网设备与 10.6.3.43 同步时间 | 是 | NTPD服务平滑同步 |
10.6.3.33 | 内外NTP客户端 | 内网设备与 10.6.3.43 同步时间 | 是 | NTPD服务平滑同步 |
10.6.3.36 | 内外NTP客户端 | 内网设备与 10.6.3.43 同步时间 | 是 | NTPD服务平滑同步 |
10.6.3.48 | 内外NTP客户端 | 内网设备与 10.6.3.43 同步时间 | 是 | NTPD服务平滑同步 |
在中国,正确的时区应为 CST(Chinese Standard Time),也就是我们通常所说的北京时间。那么中国当地的时间晚上8点的话,我们可以有下面两种表示方式
因为中国处在 UTC+8 时区,依次类推,在 UTC 标准时间,就是 12:00了。不管通过任何渠道我们想要同步系统的时间,通常提供方只会给出 UTC+0 的时间值而不会提供时区(因为它不知道你在哪里).所以当我们设置系统时间的时候,设置好时区是首先要做的工作。
1. 查看当前时区
date
>> Sat Dec 26 14:11:45 EDT 2015
重点在于这个 “EDT“,并非之前所说应该是 “CST”
2. 修改 /etc/sysconfig/clock
vim /etc/sysconfig/clock
ZONE="America/New_York"
#改为
ZONE="Asia/Shanghai"
3.覆盖 /etc/localtime
cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite `/etc/localtime'? y
4. 查看修改后的时区
date
>> Sat Dec 26 14:11:45 CST 2015
rpm -qa |grep ntp
>> ntp-4.2.6p5-1.el6.centos.x86_64
>> ntpdate-4.2.6p5-1.el6.centos.x86_64
如果没有安装,我们按照下
yum install ntp
在 Linux 下系统时间在开机的时候会和硬件时间同步(synchronization),之后也就各自独立运行了那么既然两个时钟独自运行,那么时间久了必然就会产生误差了,而 NTP 默认又只更新系统时间,因此我们需要设置硬件时钟进行同步调整
vim /etc/sysconfig/ntpd
添加以下即可:
SYNC_HWCLOCK="yes"
在能够上网的一台主机中(比如 10.6.3.43)上执行以下命令,查看可以正常提供时间服务的外部主机。
ntpdate -q 1.cn.pool.ntp.org
也就是说有三个可以提供该服务的 IP,其中 202.118.29.82 的时延最小。如果上层服务器不可用,一般类似如下显示
1.server 202.118.1.81, stratum 0, offset 0.000000, delay 0.00000
26 Dec 17:25:18 ntpdate[23338]: no server suitable for synchronization found
Note:IP地址: 202.112.10.36 中国 教育网,提供时间校准服务
配置前,先使用ntpdate手动同步下内网中作为 NTPD 服务器的时间,免得本机与外部时间服务器时间差距太大,让ntpd不能正常同步。即在 10.6.3.43 上执行 (root 权限下操作):
ntpdate -u 1.cn.pool.ntp.org
>> 26 Dec 14:48:37 ntpdate[32758]: adjust time server 202.112.10.36 offset -0.006147 sec
然后再将该时间先写入硬件时间
date;hwclock -w
下面主要是配置内网的NPTD服务器(10.6.3.43), NTPD服务配置核心就在 /etc/ntp.conf
文件,配置好了就 OK。
vim /etc/ntp.conf
1. 指定上层对时服务器
加 # 号注释掉 centos 默认的对时服务器,如果主机可以访问外网,这一步最好做一下。添加国家对时服务器。
# 中国这边最活跃的时间服务器 : http://www.pool.ntp.org/zone/cn
server 202.112.29.82 perfer # 1.cn.pool.ntp.org
server 202.118.1.81 # stratum 2
server 202.118.1.130 # stratum 2
server 202.112.10.36 # stratum 3
2. 修改上层时间服务器对本机的权限
# allow update time by the upper server # 允许上层时间服务器主动修改本机时间 restrict 202.112.29.82 nomodify notrap noquery restrict 202.118.1.81 nomodify notrap noquery restrict 202.118.1.130 nomodify notrap noquery restrict 202.112.10.36 nomodify notrap noquery
3. 外部时间服务器不可用时,设置以本地时间作为时间服务
# 外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
4. 设置对内网主机提供NTP服务
因为笔者的实验环境中,内网使用 10.6.3.0/24 网段,所以设置如下
restrict 10.6.3.0 mask 255.255.255.0 nomodify notrap
内网其他设备作为NTP的客户端配置,相对就比较简单,而且所有设备的配置都相同。找其中一台配置 /etc/ntp.conf
文件,配置完成验证通过后,拷贝到其他客户端机器,直接使用即可。 Client 配置在笔者的集群中,是在 10.6.3.32、10.6.3.33、10.6.3.36、10.6.3.48 上完成。
driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
# 配置时间服务器为本地的时间服务器
server 10.6.3.43
restrict 10.6.3.43 nomodify notrap noquery
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
为了简单,这里只列出了配置项,注释全部清理了。
因为在 “2.4 先使用 ntpdate 手动同步下时间” 中我们已经和外部时间服务器进行过一次时间校准了。所以在集群中作为 NTPD服务 的 10.6.3.3.43 主机上直接先启动 NTP 服务(root 权限下完成)
service ntpd start chkconfig ntpd on
启动后,一般需要 5-10 分钟左右的时候才能与外部时间服务器开始同步时间。可以通过命令查询NTPD服务情况。
1. netstat -tlunp 查看端口以及监听情况
netstat -tlunp | grep ntp
表示连接和监听已正确,采用UDP方式
2. ntpq -p 查看网络中的NTP服务器,同时显示客户端和每个服务器的关系
ntpq -p
笔者不定时地进行查看,过程如下:
很明显,作为等级才 10 的 LOCAL 在等级为 2 的时间服务器面前,不敢嚣张了…
符号 | 含义 |
---|---|
* | 响应的NTP服务器和最精确的服务器 代表目前正在作用当中的上层 NTP |
+ | 响应这个查询请求的NTP服务器 代表也有连上线,而且可作为下一个提供时间更新的候选者 |
blank (空格) |
没有响应的NTP服务器 |
remote | 响应这个请求的NTP服务器的名称 |
refid | NTP服务器使用的更高一级服务器的名称 |
st | 正在响应请求的NTP服务器的级别 |
when | 上一次成功请求之后到现在的秒数 |
poll | 本地和远程服务器多少时间进行一次同步,单位秒,在一开始运行NTP的时候这个poll值会比较小,服务器同步的频率大,可以尽快调整到正确的时间范围,之后poll值会逐渐增大,同步的频率也就会相应减小 |
reach | 用来测试能否和服务器连接,是一个八进制值,每成功连接一次它的值就会增加 |
delay | 从本地机发送同步要求到ntp服务器的往返时间 |
offset | 主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒,offset越接近于0,主机和ntp服务器的时间越接近 |
jitter | 统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确 |
3. ntpstat 查看连接并同步后信息
ntpstat
之前在 “3.2 配置内网 NTP-Client ” 部分已经配置好 Client 。
ntpdate -u 10.6.3.43
>> 26 Dec 18:23:32 ntpdate[20408]: step time server 10.6.3.43 offset 58.586935 sec
然后写入硬件时间
date;hwclock -w
service ntpd start chkconfig ntpd on
ntpq -p
过了一阵子后,改为 master5(10.6.3.43) 为 NTP 时间服务器
ntpdate -u ip -> no server suitable for synchronization found
判断:在 ntp 客户端用 ntpdate –d serverIP
查看,发现有 “Server dropped: strata too high” 的错误,并且显示”stratum 16”。而正常情况下 stratum 这个值得范围是“0~15”,或者是配置文件没有配置好。
原因:NTP server 还没有和其自身或者它的 server 同步上。在 ntp server 上重新启动 ntp 服务后,ntp server 自身或者与其 server 的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行 ntpdate 命令时会产生 no server suitable for synchronization found
的错误。或配置文件 (/etc/ntp.conf)配置有误或压根没配置。
处理:等待几分钟后,重试一般解决,或重新配置 /etc/ntp.conf。
参考资料: