解读网络时间协议及其配置

原题:《老毕跟你聊聊NTP》

在网络应用发展的今天,很多大型应用,如航空航天、金融数据中心等,出于各种重要原因,其网络内各计算机及相关设备,需要保持时间完全精准。

那么如何保证它们之间的时间完全同步呢?

01 标准时间

说到时间,我们先来了解一下标准时间的概念及演变。

早期,标准时间采用的是格林尼治时间,即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时。“作为科技进步的产物,全面采用原子时,意味着人们可以完全摆脱地球自转与日月更替,孤独地奔跑在向前的路上。”,因此需要用闰秒进行修正。就最近国际电信联盟的投票结果而言,闰秒得以保留,UTC依然作为公认的国际标准时间。

02 网络时间(NTP)协议

既然确定了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将使用自身的时间设备(普通设备一般为晶振,一级服务器一般为原子钟)提供服务。

03 ntp 配置

NTP的配置也比较容易,在不更改默认参数的情况下,主要配置文件为/etc/ntp.conf,在文件中指定主服务器名或ip即可.

server 主时间服务器 prefer

server 从时间服务器

server 从时间服务器

为保证NTP自动启动,需在服务配置中,将NTP服务设置为开机启动。配置方法在各操作系统下各不相同,这里不再详细说明。

对NTP使用中,一般用到以下几个常规命令(基于AIX、HPUX、LINUX),简单介绍如下:

1) 查看NTP状态:ntpq -p

可以使用ntpq –p查看ntp状态。正常情况下:remote列的各个服务器前, 应该有一个*,其它为+

输出说明如下:

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差的绝对值。

2) 查看实时时间偏差:ntpdate -q 对方ip

正常输出如下:

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服务。

3) 立即与服务器进行时间同步:ntpdate 对方ip

如: ntpdate 192.168.11.33

需要注意的是,这个命令将一次性把时间同步到位,会产生时间的跳变,需确定无影响后再执行。

来自社区平台人生专栏:

http://www.talkwithtrend.com/Column/detail/id/11

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612B08DN000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券