一般搭建NTP时间服务器的搭建有2种方式:
尽量优先使用chrony配置时间同步(较好适配centOS7及以上版本)。并且,常规的ntp服务可能会涉及一些系统相关信息,不安全。
说到时间,我们先来了解一下标准时间的概念及演变。
早期,标准时间采用的是格林尼治时间,即GMT,也称为世界时。它是指英国伦敦格林尼治天文台的标准时间,是以地球自转为基础,根据太阳横穿格林尼治本初子午线(即0度经线)来确定标准时间,用天来定义秒的计量系统,是基于天文学的。由于地球自转速度不均匀,并且正在缓慢减速,因此,在GMT下,每天的一秒在微观尺度上和其它天的都不相同,不是一种均匀的时间系统。
基于某些元素的原子能级跃迁频率有极高的稳定性这一特点,1967年国际度量衡大会对秒重新进行了定义:铯133元素的两个超精细能阶之间跃迁时所辐射的电磁波的周期的9,192,631,770倍的时间定义为一秒。在此基础上,1971年由国际时间局建立了国际原子时(TAI),并取1958年1月1日0时0分0秒世界时的瞬间作为同年同月同日0时0分0秒TAI。因此,TAI是基于物理学,为一种极其精确的时间系统,是用秒来定义天。
为解决TAI和GMT之间的时间误差,协调世界时于1972年面世。协调世界时,又称世界标准时间、国际协调时间,简称UTC。以TAI秒长为基础,当GMT与TAI之间时刻相差超过0.9秒时,通过在当年的6月30日或12月31日的最后时刻增减1秒进行修正,在时刻上尽量接近GMT。这就是闰秒。自1972年以来,一共进行了27次闰秒调整,都是正闰秒,即增加一秒。
闰秒在当今存在一些争议。一些国家(如美国、法国、日本)认为应该直接使用TAI,不需要闰秒。因为要让世界各国在同一个瞬间增加一个闰秒,绝非易事。稍有疏忽,很多重要系统就会因时间误差而导致混乱。而且,基于闰秒出现的无规律性和不可预知性,要在设备上预留“置闰”设置也非常麻烦。总而言之,闰秒会让全世界付出更多的许多人力财力成本。而另一些国家(如中国、英国、俄罗斯)则认为,在地球越转越慢的现实之中,五千年后的人类将发现,“日居正中”将是下午1时。“作为科技进步的产物,全面采用原子时,意味着人们可以完全摆脱地球自转与日月更替,孤独地奔跑在向前的路上。”,因此需要用闰秒进行修正。就最近国际电信联盟的投票结679C而言,闰秒得以保留,UTC依然作为公认的国际标准时间。
NTP(Network Time Protocol) 网络时间协议,工作在UDP的123端口上。是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(局域网上与标准间差小于1毫秒,互联网上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
既然确定了UTC作为公认的国际标准时间。那如何保证时间的统一性和准确性,是按照A这台计算机的时间,还是按照B这台计算机的时间?这就需要用到网络时间协议,英文名称为Network Time Protocol ,简称NTP。通过该协议,可以把计算机的时钟同步到UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
在NTP中,时间按照服务器的等级传播,Stratum-1(我们一般称作一级服务器)为最高层,其时间源为标准UTC,该时间源可以来自外部,如北斗、GPS,也可以来自该服务器内部的原子钟。而Stratum-2(二级服务器)则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数最多不超过15层。为防止单点故障,每一级服务器都应该有多台,且数量一般为奇数,以便于下级服务器决策。
在NTP协议中,下级服务器在指定的轮询时间范围(如64秒至1024秒)内,向上一级服务器通过UDP123端口发送报文,进行探测,根据多次的探测结果进行时间校准。在默认配置下,时差在128ms以内,会分成多步慢慢调整;时差在128ms至1000ms,时间会一次性调整到位;时差超过1000ms,NTP会判定为当前环境不可靠,而中止运行。有些系统支持对以上参数进行调整,但有些系统则不可以。
正如之前所提到的,在对时间精确度要求很高的环境下进行闰秒的调整绝非易事,其最主要的原则就是不能发生时间跳变。在一个复杂网络环境中,不是所有的系统或设备都能支持参数调整,也就是说在向上级服务器探测时间时,时差不能超过128ms。所以闰秒调整需分多步进行,以保证每一级服务时间差不超过128ms。受到网络传输延时的影响,在广域网内,越远端的服务器(如Stratum-15)的时间波动越明显,因此,在确认闰秒分步调整时,需要考虑这方面的因素,合理确定分步范围。根据笔者最近两次的调整经验,在3层服务器架构中,一次闰秒调整需分13次至15次完成。
NTP有足够的容错性,除之前提到的1000ms中止运行外,还能根据算法,选用可靠的上一级服务器。当无法正确获得上一级服务器时间时,NTP将使用自身的时间设备(普通设备一般为晶振,一级服务器一般为原子钟)提供服务。
NTP服务器提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC 源的远近将所有服务器归入不同的Stratum(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。
计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。
时间服务器可以利用以下三种方式与其他服务器对时:broadcast/multicast,client/server和Symmetric。
(1)broadcast/multicast:方式主要适用于局域网的环境,时间服务器周期性的以广播的方式,将时间信息传送给其他网路中的时间服务器,其时间仅会有少许的延迟,而且配置非常的简单。但是此方式的精确度并不高,对时间精确度要求不是很高的情况下可以采用。
(2)Symmetric:的方式得一台服务器可以从远端时间服务器获取时钟,如果需要也可提供时间信息给远端的时间服务器。此一方式适用于配置冗余的时间服务器,可以提供更高的精确度给主机。
(3)client/server:方式与symmetric方式比较相似,只是不提供给其他时间服务器时间信息,此方式适用于一台时间服务器接收上层时间服务器的时间信息,并提供时间信息给下层的用户。
上述三种方式,时间信息的传输都使用UDP协议。时间服务器利用一个过滤演算法,及先前八个校时资料计算出时间参考值,判断后续校时包的精确性,一个相对较高的离散程度,表示一个对时资料的可信度比较低。仅从一个时间服务器获得校时信息,不能校正通讯过程所造成的时间偏差,而同时与许多时间服务器通信校时,就可利用过滤算法找出相对较可靠的时间来源,然后采用它的时间来校时。
NTP在Linux主机上默认一般都是安装过的,只是服务没有启用。如果没有安装可直接使用yum install ntp命令即可。
NTP的主配置文件,以下是NTP服务器可选的指令:
//特别注意:以下配置文件是服务器端即ntp时间服务器的配置方法,这里csdn文章只作为配置参考,工作中并没有亲自配置过。
vim /etc/ntp.conf
# 允许172.16.*.*的IP使用该时间服务器;
restrict 172.16.0.0 mask 255.255.0.0 nomodify
#允许任何人来同步;
restrict default nomodify notrap
# 屏蔽其他IP过来更新时间;
restrict 0.0.0.0 mask 0.0.0.0 nomodify notrap noquery notrust
#ignore:关闭所有的NTP联机服务;
#nomodify:表示Client端不能更改Server端的时间参数;不过Client端仍然可以透过Server端来进行网络校时;
#notrust:该Client除非通过认证否则该Client来源将被视为不信任网域;
#noquery:不提供Client端的时间查询;
#notrap:允许任何人来查询;
# 同步的上层服务器(210.72.145.44国家时间服务器),NTP服务器默认也有同步的时间服务器;
server 210.72.145.44
# 同步本地时间;
server 127.127.1.0 prefer
# 本地服务器的stratum大小不能超过16;
fudge 127.127.1.0 stratum 8
systemctl enable ntpd
systemctl start ntpd
(注意,客户端上也是可以用这个命令的)可以使用ntpq –p查看ntp状态。正常情况下:remote列的各个服务器前, 应该有一个*,其它为+
注意:本次这个时间是与阿里云源同步的;
注意:NTP服务器配置完成启动之后,NTP自身或者与其server的同步需要一个时间段这个过程可能是5-10分钟;在这个时间段内客户端运行ntpdate命令时会产生no serversuitable for synchronization found的错误。
输出说明如下:
remote: 对应的NTP服务器,服务器名字前的符号含义如下
*: 选定的时间服务器
+: 处于候选状态的服务器
#: 选定的时间服务器,但距离超过最大值(这句话不太容易理解,但就经验判断,一般是上级之上的服务器存在问题)。
空格:该服务器不可用,原因为未能同步(可能是刚启动还未同步,也有可能是其它原因)。
-: 该服务器不可用。被集群算法所放弃。
x: 该服务器不可用。被交集算法所放弃。
refid: 对应的NTP服务器的上一级NTP服务器。
st: 对应的NTP服务器所在的Stratum(即服务器级别,1为第一级,2为第二级,以此类推)
t:
when: 上一次探测ntp服务器到现在的时间(默认单位为秒,如果时间较长,会出现m、h,分别代表分钟和小时)
poll: 探测ntp服务器的轮询时间,单位为秒。
reach:为8进制,转换为二进制后,代表最近8次探测ntp服务器的状态。失败为0,成功为1。
delay:与ntp服务器的网络时延,单位为毫秒。
offset:与NTP服务器的时间(协议值)偏差,单位为毫秒。
本机时间+offset=NTP服务器时间
jitter:有的版本为disp。多数情况下为最近两次有变化的offset差的绝对值。
(注意,客户端上也是可以用这个命令的)
正常输出如下:
server 192.168.11.33, stratum 2, offset 0.000843, delay 0.02579
24 Jan 20:09:19 ntpdate[10420968]: adjust time server 192.168.11.33 offset 0.000843
offset的值即为实时偏差值,单位为s。
如果显示如下:
server 192.168.11.44, stratum 0, offset 0.000000, delay 0.00000
24 Jan 20:11:26 ntpdate[15139008]: no server suitable for synchronization found
则说明无法从上级服务器获得时间信息,产生原因有可能是网络不通,也有可能是上级服务器未开启ntp服务。
[root@centos77-test ~]#vim /etc/ntp.conf
SYNC_HWCLOCK=yes # 添加如下内容到此配置文件中去。
注意:一般客户端建议的配置做法如下
(1)确保服务器安装了ntp服务:
yum install -y ntp
systemctl enable ntpd
systemctl start ntpd
(2)配置ntp配置文件
本人在工作中常用到的配置如下:
vim /etc/ntp.conf
//注释上面4个server行,添加如下2个ntp时间服务器ip,然后重启ntpd服务即可。
server xx.xx.xx.xx prefer # 主时间服务器
server xx.xx.xx.xx # 从时间服务器
(3)与服务器端同步时间(注意,一般工作中,没用到下面这些脚本,是从配置openstack中Get到的方法,可以作为参考)
ntpdate 172.16.16.1 # 注意,这个ip就是ntp时间服务器的ip
需要注意的是,这个命令将一次性把时间同步到位,会产生时间的跳变,需确定无影响后再执行。
//写到脚本中去。
crontab -e
*/10 * * * * /usr/sbin/ntpdate time1.aliyun.com && hwclock -w
或者
*/10 * * * * /usr/sbin/ntpdate ntp时间服务器ip && hwclock -w
(4)查看ntp服务状态
systemctl status ntpd
ntpq -p
原文链接:csdn文章
https://blog.csdn.net/genglei1022/article/details/77833406
Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确。它由两个程序组成:chronyd和chronyc。
chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。
chronyc 提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作
配置文件:Chrony启动时,它会读取/etc/chrony.conf配置文件中的设置。
服务端安装chrony:
[root@localhost ~]# yum install chrony –y #安装chrony
服务端配置chrony主机: cat /etc/chrony.conf
备注:以下配置内容为csdn博客当时配置的信息,具体内容视情况而定
设置开机自启:
#systemctl start chronyd
#systemctl status chronyd --查看chronyd服务状态
#systemctl enable chronyd --开机启动
客户端安装chrony
[root@localhost ~]# yum install chrony –y
客户端配置文件:cat /etc/chrony.conf
客户端启动服务:
#systemctl start chronyd
#systemctl status chronyd --查看chronyd服务状态
#systemctl enable chronyd --开机启动