写在前面:
在NTP改造的过程中,会涉及到NTP客户端设备的NTP配置的修改。不同的操作系统有不同的配置方法,在实际NTP取时的行为过程中也有些许差异,本文将重点阐述Linux centos 操作系统NTP服务的配置方法、不同配置间的差异以及其他值得我们注意的相关技术细节。
知识准备:
在NTP服务端
首先,我们知道专业的NTP设备,通过卫星同步的方式获取准确的时间。目前NTP设备可以选择同步北斗或者GPS卫星的时间,两个时间没有差异。而数据中心内的其他设备,在设备数量不大,且网络质量较好的情况下,可以直接向专业的NTP设备取时,打造扁平化的NTP架构,减少NTP层级,确保我们设备时间的准确性。
在NTP设备部署时,要注意设备天线部署的位置、天线的防雷、馈线的长度等等,这些一般由专业的厂家直接完成,博主不在这里阐述。
NTP设备获取到的时间为UTC时间,所以NTP客户端到NTP设备上取得的也是UTC时间。有关时区的设置需要在NTP客户端本地独立完成。中国所处的时区比UTC时间快8小时,也就是UTC+8,时区为CST。
在NTP客户端
针对本文重点要讲的Linux centos操作系统,要通过NTP获取时间一共有两种方式。分别是ntpdate和ntpd
ntpdate—采用这种方式,操作系统会直接发起向NTP设备的时间同步请求,操作系统的时间会直接调整到从NTP服务器获取到的准确时间。获取准确时间后,操作系统将依赖操作系统本身的运算机制计算本地时间,而不会再去进行同步。所以,有些操作系统会配合crontab,定时进行时间的同步工作。
ntpd—采用这种方式,操作系统会去尝试与NTP设备进行时间同步,当发现两者的时间偏差较大的时候,会通过多次同步过程来完成同步,而不是直接调整到位。这个过程可能会持续10几分钟,甚至更多的时间,这取决于时间偏差有多少,直到操作系统时间准确。之后操作系统会以一定的间隔向NTP设备同步时间,保持操作系统时间的同步。
我们知道有些程序—尤其是数据库在运行时依赖时间的准确性,而采用ntpdate的方式,直接将操作系统时间同步,可能会导致操作系统时间发生跃变,因此我们选择采用ntpd的方式,来同步时间。
在NTP客户端层面,除了操作系统时间以外,还有硬件时间的概念。硬件时间一般是硬件设备在出厂时设备制造地在硬件底层便设置好的,我们可以设置硬件时间与操作系统时间进行同步,确保硬件时间是我们当地的时间。
具体怎么做:
手动设置的方法:
首先,我们可以通过date命令查看当前时间
[root@ansible ~]# date
Mon Oct 1 00:00:01 CST 2018
这里,我们可以看到当前的时间,时区为CST时间,我们可以通过timedatectl查看当前的时区
[root@ansible ~]# timedatectl
Local time: Wed 2018-10-24 11:19:42 CST
Universal time: Wed 2018-10-24 03:19:42 UTC
RTC time: Wed 2018-10-24 03:19:43
Timezone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
可以通过hwclock查看当前硬件时间
[root@ansible ~]# hwclock
Wed 24 Oct 2018 10:16:33 AM CST -0.864798 seconds
通过hwclock -w 将操作系统时间同步到硬件时间
[root@ansible ~]# hwclock -w
[root@ansible ~]# hwclock
Mon 01 Oct 2018 12:01:25 AM CST -0.956970 seconds
除了通过NTP同步时间以外,我们也可以通过date-s手动设置时间
[root@ansible ~]# date -s "20181001 00:00:00"
Mon Oct 1 00:00:00 CST 2018
手动设置时区
timedatectl set-timezone Asia/Shanghai
采用ntpd的方式进行同步:
首先要安装ntp服务,可以与互联网通信的话,可以通过yum进行安装
yum -y install ntp
查看当前ntp状态
[root@ansible ~]# ntpstat
timeout
NTP设置主要涉及到两个配置文件,分别为在/etc/ntp.conf和/etc/sysconfig/ntpd
在/etc/ntp.conf设置NTP服务器
[root@ansible ~]# vi /etc/ntp.conf
server cn.pool.ntp.org prefer
上述用到的cn.pool.ntp.org为互联网上的一个提供ntp服务的网址
重启NTPD服务
[root@ansible ~]# service ntpd restart
Redirecting to /bin/systemctl restart ntpd.service
查看当前NTP状态
[root@ansible ~]# ntpstat
unsynchronised
time server re-starting
polling server every 8 s
查看NTP同步情况
[root@ansible ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
192.168.126.98 .INIT. 16 u - 64 0 0.000 0.000 0.000
dns1.synet.edu. 202.118.1.46 2 u 27 64 1 44.996 2024174 0.000
这里有几个重要参数,when代表了多少秒前进行了时间的同步;poll代表了时间同步的间隔;delay代表从客户端到NTP服务端之间的延时;offset代表了当前时间的差距。
可见当前操作系统时间与NTP服务器有较大的差距
过了一会
[root@ansible ~]# ntpstat
unsynchronised
polling server every 64 s
[root@ansible ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
192.168.126.98 .STEP. 16 u - 64 0 0.000 0.000 0.000
203.107.6.88 100.107.25.114 2 u 45 64 1 24.507 6.837 0.000
等待了十几分钟以后
[root@ansible ~]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
time correct to within 43 ms
polling server every 64 s
[root@ansible ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
192.168.126.98 .STEP. 16 u - 512 0 0.000 0.000 0.000
*203.107.6.88 100.107.25.114 2 u 24 64 377 24.974 17.522 2.376
过了一会,同步成功
[root@ansible ~]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
time correct to within 42 ms
polling server every 128 s
[root@ansible ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
192.168.126.98 .STEP. 16 u - 1024 0 0.000 0.000 0.000
*203.107.6.88 10.165.84.13 2 u 124 128 377 20.336 -5.768 3.414
其他ntpd参数设置
-g参数
查看当前ntpd的配置,系统默认使用了-g参数
[root@ansible ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"
这里解释一下-g参数,通过增加-g 可忽略本地与远端NTP服务器时钟相差大于1000s时,ntpd停止工作的问题,如果不设置-g参数,当偏差大于1000s时,ntp服务会停止,测试过程如下:
在这里我们尝试不使用 无 -g参数,查看使用效果
[root@ansible ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
# OPTIONS="-g"
重启ntpd服务
[root@ansible ~]# service ntpd restart
Redirecting to /bin/systemctl restart ntpd.service
查看当前ntp状态
[root@ansible ~]# ntpstat
unsynchronised
time server re-starting
polling server every 8 s
[root@ansible ~]# ^C
[root@ansible ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
192.168.126.98 .INIT. 16 u - 64 0 0.000 0.000 0.000
dns1.synet.edu. 202.118.1.46 2 u 27 64 1 44.996 2024174 0.000
过一会在看
[root@ansible ~]# ntpstat
Unable to talk to NTP daemon. Is it running?
[root@ansible ~]# ntpq -p
ntpq: read: Connection refused
可见NTP服务停止。
-x参数
设置-x参数 操作系统在进行NTP同步时只做微调,当偏差大于600s时步进,但也不是一次到位的。
不使用-x参数 则小于128ms时微调,大于128ms步进,同样,也不是一步到位的。
centos系统默认是不带-x参数的,配置方法如下:
[root@linux_tcp_2 ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g -x"
-x的参数带来的差异不好模拟,没有做相关实验。
SYNC_HWCLOCK参数
可用该参数保持硬件时间与操作系统时间的自动同步,配制方法如下:
[root@linux_tcp_2 ~]# cat /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"
SYNC_HWCLOCK=yes
该参数设置带来的差异,在虚拟机环境没有模拟出来。
ntpdate的使用
我们也可以通过ntpdate的方式,手动进行时间的同步,在前文已经讲到,使用这种方式同步时间,操作系统的时间会一次到位,但可能会影响应用程序的运行,需要谨慎操作,使用时需要重启NTP服务,使用效果如下:
[root@ansible ~]# date -s "20181001 00:00:00"
Mon Oct 1 00:00:00 CST 2018
[root@ansible ~]#
[root@ansible ~]#
[root@ansible ~]# date
Mon Oct 1 00:00:01 CST 2018
[root@ansible ~]# ntpdate cn.pool.ntp.org
24 Oct 13:05:00 ntpdate[3059]: step time server 34.198.99.183 offset 2034288.744837 sec
[root@ansible ~]# date
Wed Oct 24 13:05:04 CST 2018
可见,操作系统时间直接同步到了准确的时间
总结
至此,我将目前所掌握的NTP配制方法和相关参数带来的差异在前文中进行了讲述,并做了相关的实验。除了配制方法以外,我们应该能够熟练地使用ntpstat命令和ntpq -p命令,查看当前ntp同步的状态。希望以上内容能够对大家有所帮助。除了上文讲到的参数以外,在操作系统中,应该还有许多其他NTP参数可以进行设置,以后工作中有需要再去研究吧~