03-ntp-server部署手册¶
NTP简介¶
NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
NTP服务器就是利用NTP协议提供时间同步服务的。
NTP工作原理¶
ntpd 进程通过定期与NTP时钟源服务器发送消息来获取时间信息。在进程初始启动时候,不论是第一次boot还是随后启动,nptd 会给服务器发送消息以获取时间本设置到本地系统。为了防止网络风暴,进程启动后会在定义好的间隔64秒之上再加一个随机延迟值,这个随机值的范围是0~16秒;因此进程启动后需要数分钟才会开始同步时间。如今的计算机都带有硬件时钟芯片(time-of-year (TOY) chip),用于在计算机掉电过程中仍然保持正确时间,当计算机上电,操作系统从时钟芯片中获取时间。当操作系统启动完成并连接到时钟源之后,操作系统会依据时钟源定时调整芯片时间。在服务器没有硬件时钟芯片或硬件时钟芯片故障(CMOS电池没电)或其他原因导致操作系统本地时间与时钟源时间差别超过1000秒,nptd认为此时发生了严重问题,唯一可靠的处理方法是人为介入。这种情况下nptd Daemon进程会退出并在操作系统的syslog中记录一条日志。nptd 的启动选项 -g 选项可以忽略1000秒的检查并强制将时钟源时间设置为硬件时间,不过考虑到硬件时钟芯片故障的场景(CMOS电池没电、或时钟计时器故障),一旦再次出现芯片时间与时钟源超过1000秒,nptd还是会退出。通常情况下,ntpd 以很小的步长调整时间使得时间尽量是连续的、不出现跳跃。在网络极度拥塞的条件下,nptd 与时钟源之间发送一个消息包来回的时延有可能达到3秒,因此会导致同步距离(半个来回时延,1.5秒)变的很大。ntpd 同步算法会丢弃时差大于128ms的包,除非在900秒内没有时差小于128ms的包,还有就是首次启动时候不会检查这个时差直接同步。这种设计是为了减少误报时钟同步异常的告警。上述行为的结果是每次成功设置本地时间,一般不会超过128ms,即使在网络时延很高的情况下。有时候,特别是在ntpd首次启动的时候,时差可能超过128ms,这种罕见场景一般是本地时间比时钟源的时间快(未来)超过128秒,这种情况本地时间将会被往过去方向调回。这种情况下某些应用程序会有问题。如果启动nptd时候加上了 -x 选项,那么 nptd 不会以步长方式(stepped)同步,只会以微调校正方式(slew correction)同步。使用 -x 选项之前需要仔细考量影响。 ntpd 微调校准的最大频率是 500 个 PPM (parts-per-million)每秒,也就是每秒校准 5/10,000 秒。因此会导致本地时间与时钟源之间需要很长时间才能将时差同步到一个可接受的范围,大概是2000秒同步一秒,对于依赖网络时钟源的应用来说这种情况不可接受。
NTP运行模式¶
nptd 可以运行在多种模式下,包括对称的 主动、被动(active/passive),客户端、服务端(client/server),广播、多播(broadcast/multicase/manycase),详细参考Association Management。通常运行模式是以Daemon方式持续跟踪同步时钟源时间;当然也可以只运行一次,从外部时钟源同步时间(从上次纪录的频度误差文件中读取频度误差值)。广播与多播模式下客户端能够自动发现时钟源服务器,并计算各个服务器的时延然后自动完成配置,这种模式使得工作站集群自动配置变为现实。*****默认情况下nptd以Daemon方式持续跟踪多个时钟源,同步的间隔由一个复杂的状态机决定。状态机使用启发式算法,根据消息包来回时延、频度误差来计算最优的同步间隔。通常情况下,状态机初始以64秒为间隔并最终达到1024秒,少量的随机数值会被增加到间隔上为了均衡服务器压力。额外的,如果一个服务器不可达的情况下,为了减少网络消息排队阻塞,间隔会逐步增加到1024秒。*****在某些情况下nptd不能正常持续运行,通常的规避手段时使用cron定时任务执行ntpdate命令。但是ntpdate并没有像nptd一样有考虑各种信号处理、错误检查、连续同步算法。nptd -q 可以达到与 ntpdate同样的效果,-q 参数使得 npt同步一次后就退出;同步的过程与Daemon模式的nptd是相同的。******如果操作系统内核支持调整时钟频度(Solaris,Linux,FreeBSD都已经支持),那么时钟同步还有一种不以Daemon方式运行的可选用法。首先,nptd以Daemon方式运行,配置好时钟源,大约一个或几个小时后,获取到频度误差npt.drift 文件;然后退出nptd进程,并以一次性模式运行(nptd -q),此时每次nptd运行都基于当前获取到的频度误差与时钟源同步时间。
同步间隔控制¶
当前版本的NTP包含了一个复杂的状态机,用于减少同步时的网络负载;同时也包含很多种提升精度的方法。使用者在修改同步间隔(64秒~1024秒)的时候需要仔细考虑影响。默认的最小同步间隔可以使用 tinker minpool 命令修改为不小于16秒,这个值会被用作所有相关的使用到同步间隔的地方,除非显示使用minpoll 选项覆盖。需要注意的是不少设备驱动在同步间隔小于64秒时候不能正常工作;同时广播与多播模式也是使用的默认值,除非显示覆盖。
ntpd和ntpdate的区别¶
- ntpd在实际同步时间时是一点点的校准过来时间的,最终把时间慢慢的校正对(平滑同步)。而ntpdate不会考虑其他程序是否会阵痛,直接调整时间(“跃变”)。
- 一个是校准时间,一个是调整时间。
- “跃变”的危害:
- 这样做不安全。ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。
- 这样做不精确。一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。
- 这样做不够优雅。由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)
1
因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。
Linux如果开启了NTP服务,则不能手动运行ntpdate更新时间(会报端口被占用),它只能根据/etc/ntp.conf 里server 字段后的服务器地址按一定时间间隔自动向上级NTP服务器更新时间。可以运行命令 ntpstat 查看每次更新间隔如:
[root@ESXI ~]# ntpstat
synchronised to NTP server (210.72.145.44) at stratum 2 #本NTP服务器层次为2,已向210.72.145.44 NTP同步过
time correct to within 93 ms #时间校正到相差93ms之内
polling server every 1024 s #每1024秒会向上级NTP轮询更新一次时间
ntpd和chrony的区别¶
Ntp和chrony实现时间同步的方式
- ntpd实现时间同步的思路:把时间的周期缩短,也就是让秒针转动的速度变快,以追上时间服务器的时间。
- chrony实现时间同步的思路:也是让时间周期缩短,但是它相比于ntpd,它是直接转动时针,所以能更快的将时间同步。
NTP服务器安装部署¶
查看系统是否安装ntp服务
[root@oldboy ~]# rpm -qa ntp
ntp-4.2.6p5-5.el6.centos.x86_64
若没有安装可以使用YUM命令进行安装即可
[root@oldboy ~]# yum -y install ntp
配置NTP服务¶
ntp服务器默认是不允许客户端进行时间同步的,所有我们需要配置文件设置允许
[root@oldboy ~]# vi /etc/ntp.conf # NTP服务的默认配置文件
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server ntp1.aliyun.com iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
添加新的时间同步源(以下时间服务器选择一个即可)
server ntp1.aliyun.com
server time.nist.gov
启动NTP服务器¶
客户端先将系统优化是定时任务自动同步时间服务器的定时任务注释,如果不注释的话可能会冲突
提示:本地的ntp时间服务器会跟互联网的时间服务器冲突,只能选择一个进行同步。
启动NTP时间同步服务
systemctl start ntpd
设置ntp服务器开机自动启动
systemctl enable ntpd
检查ntp服务状态
[root@localhost ~]# ntpstat #检查是否与互联网时间同步
synchronised to NTP server (120.25.115.20) at stratum 3
time correct to within 42 ms
polling server every 1024 s
[root@localhost ~]# ntpq -p #查看ntp服务器的详细状态
remote refid st t when poll reach delay offset jitter
==============================================================================
*120.25.115.20 10.137.53.7 2 u 2 1024 337 38.198 1.195 1.634
ntpq用来监视ntpd操作,ntpq -p查询网络中的NTP服务器,同时显示客户端和每个服务器的关系
位置 | 标志 | 含义 |
---|---|---|
remote之前 | * | 响应的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的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确 |
客户机时间同步¶
方法1 ntpd(推荐)¶
1.安装ntp客户端
yum -y install ntp
3.配置ntp客户端
[root@hb02-ntp_server-172e28e8e239 ~]# cat /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server 192.168.56.11 iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
4.启动ntp客户端
systemctl start ntpd
systemctl enable ntpd
5.检查ntp服务状态
[root@localhost ~]# ntpstat #检查是否与互联网时间同步
synchronised to NTP server (192.168.56.11) at stratum 3
time correct to within 42 ms
polling server every 1024 s
备注:此方法推荐生产环境使用,客户端会首先检查自己与服务端的时间差异,如果时间差异大,将停止同步,自动关闭服务。
方法2 chrony(强烈推荐)¶
centos7以上版本默认内置此软件
1.在客户机上,编辑 /etc/chrony.conf 并确保它具有以下行
server 192.168.56.11 iburst
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
log measurements statistics tracking
2.在每个主机上启动并启用 chronyd
systemctl start chronyd
systemctl enable chronyd
3.检查ntp服务状态
[root@localhost ~]# ntpstat #检查是否与互联网时间同步
synchronised to NTP server (192.168.56.11) at stratum 3
time correct to within 42 ms
polling server every 1024 s
方法2 ntpdate(不推荐)¶
客户机要等几分钟再与新启动的ntp服务器进行时间同步,否则会提示no server suitable for synchronization found
错误。
[root@oldboy ~]# ntpdate 10.0.0.101
8 Jun 00:22:39 ntpdate[12852]: no server suitable for synchronization found
客户端同步时间的方法:
[root@zyops ~]# ntpdate 10.0.0.9
7 Dec 18:40:16 ntpdate[1453]: step time server 10.0.0.9 offset 40.880807 sec
# 将命令放入计划任务即可。
备注: 此方法会强制将客户端的时间与服务端进行同步时间,生产环境不推荐使用,可能会造成业务服务异常。
将系统时间同步到bios¶
Linux hwclock命令用于显示与设定硬件时钟。
在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
语法:
hwclock [--adjust][--debug][--directisa][--hctosys][--show][--systohc][--test]
[--utc][--version][--set --date=<日期与时间>]
--adjust hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。
--debug 显示hwclock执行时详细的信息。
--directisa hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟。
--hctosys 将系统时钟调整为与目前的硬件时钟一致。
--set --date=<日期与时间> 设定硬件时钟。
--show 显示硬件时钟的时间与日期。
--systohc 将硬件时钟调整为与目前的系统时钟一致。
--test 仅测试程序,而不会实际更改硬件时钟。
--utc 若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。
--version 显示版本信息。
实例
显示当前时间
[root@localhost ~]# hwclock
Tue 26 Oct 2021 10:00:25 PM EDT -0.569676 seconds
将硬件时钟设置为系统时间
[root@localhost ~]# hwclock -w
[root@localhost ~]# hwclock
Tue 26 Oct 2021 10:00:25 PM EDT -0.569676 seconds
ntp时间同步调整方案¶
由于特殊情况导致生产环境出现客户端与服务端时间产生差异,如何来进行优雅的恢复时间差异
环境介绍¶
目前设计时间同步集群有2套,分别为
eds块集群(16台)
eds-ssd全闪集群(15台,5台被调拨机器不计入)
目前全集群仍同步至192.168.11.239时钟源,快标准时间约12min
adjtimex工具¶
LINUX的时间分两个时间:
一个叫RTC或者硬件时间;
另一个叫系统时间,是通过操作系统的软件中断调用来计算出的时间。
系统时间是系统启动的时候调用HWCLOCK -HCTOSYS来生成操作系统启动时的时间的。
系统启动后,则根据CPU的频率来计算出多少频率后,系统时间该走一个TICK。
adjtimex是用来显示或者修改linux内核的时间变量的工具,他提供了对与内核时间变量的直接访问功能,可以实现对于系统时间的漂移进行修正。
系统默认100个tick为1s,及1个tick为系统增加1000微秒;通过调整每tick为系统增加的时间,来调整时间流速。
#adjtimex -p查看配置情况
#adjtimex -t num 设置每tick为系统增加的时间(默认10000微秒)
调整方案¶
1.对NTP服务器10.30.9.239调慢时间流速,并通过NTP服务同步至全集群
2.目前集群绝大部分机器同步时间间隔为1024s,对NTP初次流速调整应较小,1024s内全集群时间同步大小在1s左右
3.集群机器进行第一次同步后,因有时间调整,时间间隔为重置为64s;
时间同步完成后继续调慢NTP服务器,使每500s集群机器时间同步大小为1s左右(NTP调整步长为128ms,使每64s调整约为128ms);
3.直至NTP与标准时间同步,将NTP服务器时间流速调为正常
总时长预计100小时
操作步骤¶
1.对全集群时间同步情况检查,同步源为10.30.9.239,同步时间间隔为1024s
2.对NTP服务器时间流速调整为标准时间流速的999/1000
3.等待集群时间同步,且同步间隔重置为64s
4.对NTP服务器时间流速调整为标准时间流速的998/1000
备注:此方式是降低时间流速的方式来进行调整时间差异。