平台人生
作者平台人生2018-05-29 20:40
软件开发工程师, 平台人生

老毕跟你聊聊NTP

字数 3314阅读 4113评论 0赞 3

作者:毕晓峰


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

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

03ntp 配置

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

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏