跳到主要内容

1、实战:Centos7时间服务器搭建(ntp服务方式)-2023.12.17(测试成功)

更新于:2023年12月24日

实战:Centos7时间服务器搭建(ntp服务方式)-2023.12.17(测试成功)

目录

[toc]

写在前面

对于时间服务(ntp/chrony),都是cs架构(服务端和客户端),我们一般该如何使用呢?

  1. 服务端:就是提供给其它机器ntp时钟源的机器。(安装好ntp/chrony软件,配置一些必要参数,保证自己的ntp服务始终可用就好。)
  2. 客户端:去同步ntp server的机器。(安装好ntp/chrony软件,将ntp server ip配置进去就好。)

前言

Linux的两种时钟: (1)系统时钟(System Clock)由Linux内核通过CPU的工作频率进行的 (2)硬件时钟(RealTime Clock,简称RTC):主板

注意:系统时间是基于内存的,断电就会丢失;硬件时间是写在硬件中的bios程序里的

系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中的“Standard BIOS Feture”选项进行设置。

当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。因此系统时钟和硬件时钟可以采用异步方式即系统时间和硬件时间可以不同。从linux启动过程来看,系统时钟和硬件时钟不会发生冲突但linux中的所有命令都是采用的系统时钟设置

标准时间

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

早期,标准时间采用的是格林尼治时间,即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)协议

NTP(Network Time Protocol) 网络时间协议,工作在UDP的123端口上。是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(局域网上与标准间差小于1毫秒,互联网上几十毫秒)且可介由加密确认的方式来防止恶毒的协议攻击

image-20230212192937759

既然确定了UTC作为公认的国际标准时间。那如何保证时间的统一性和准确性,是按照A这台计算机的时间,还是按照B这台计算机的时间?这就需要用到网络时间协议,英文名称为Network Time Protocol ,简称NTP。通过该协议,可以把计算机的时钟同步到UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms

在NTP协议中,下级服务器在指定的轮询时间范围(如64秒至1024秒)内,向上一级服务器通过_UDP123端口_发送报文,进行探测,根据多次的探测结果进行时间校准。在默认配置下,时差在128ms以内,会分成多步慢慢调整;时差在128ms至1000ms,时间会一次性调整到位;**时差超过1000ms,NTP会判定为当前环境不可靠,而中止运行。**有些系统支持对以上参数进行调整,但有些系统则不可以。

正如之前所提到的,在对时间精确度要求很高的环境下进行闰秒的调整绝非易事其最主要的原则就是不能发生时间跳变。在一个复杂网络环境中,不是所有的系统或设备都能支持参数调整,也就是说在向上级服务器探测时间时,时差不能超过128ms。所以闰秒调整需分多步进行,以保证每一级服务时间差不超过128ms。受到网络传输延时的影响,在广域网内,越远端的服务器(如Stratum-15)的时间波动越明显,因此,在确认闰秒分步调整时,需要考虑这方面的因素,合理确定分步范围。根据笔者最近两次的调整经验,在3层服务器架构中,一次闰秒调整需分13次至15次完成。

NTP有足够的容错性,除之前提到的1000ms中止运行外,还能根据算法,选用可靠的上一级服务器。当无法正确获得上一级服务器时间时,NTP将使用自身的时间设备(普通设备一般为晶振,一级服务器一般为原子钟)提供服务。

理解时间源的层数

在NTP中,时间按照服务器的等级传播,Stratum-1(我们一般称作一级服务器)为最高层,其时间源为标准UTC,该时间源可以来自外部,如北斗、GPS也可以来自该服务器内部的原子钟

而**Stratum-2(二级服务器)**则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推。

但Stratum层的总数最多不超过15层

为防止单点故障,每一级服务器都应该有多台,且数量一般为奇数,以便于下级服务器决策。

原子钟 是什么

原子钟是一种利用原子物理学原理来测量时间的设备。它的工作基于原子的精确振荡特性。最常用的原子钟基于铯或钙原子的振荡。这些钟的精度非常高,能够提供极为准确的时间测量。

原子钟的基本原理涉及到原子的稳定振荡。在一个原子钟中,通常使用一个原子束穿过磁场,使原子的电子在两个能级之间跃迁。这种跃迁的频率非常稳定,因此可以作为时间的基准。铯原子钟使用铯的一个特定跃迁,而钙原子钟使用钙的特定跃迁。

国际单位制(SI)中的秒定义为铯原子的某个特定跃迁的9,192,631,770次振荡的持续时间。因此,铯原子钟可以提供非常准确的秒级时间测量。

原子钟的高精度使其成为国际时间标准的基础。全球定位系统(GPS)等现代科技领域都依赖于原子钟来提供高精度的时间信号。原子钟的发展对于科学研究、导航、通信等领域都有着深远的影响。

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)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。

NTP校时方式

时间服务器可以利用以下三种方式与其他服务器对时:broadcast/multicast,client/server和Symmetric

(1)broadcast/multicast:方式主要适用于局域网的环境,时间服务器周期性的以广播的方式,将时间信息传送给其他网路中的时间服务器,其时间仅会有少许的延迟,而且配置非常的简单。但是此方式的精确度并不高,对时间精确度要求不是很高的情况下可以采用。

(2)Symmetric:的方式得一台服务器可以从远端时间服务器获取时钟,如果需要也可提供时间信息给远端的时间服务器此一方式适用于配置冗余的时间服务器,可以提供更高的精确度给主机。

(3)client/server:方式与symmetric方式比较相似,只是不提供给其他时间服务器时间信息,此方式适用于一台时间服务器接收上层时间服务器的时间信息,并提供时间信息给下层的用户。

上述三种方式,时间信息的传输都使用UDP协议。时间服务器利用一个过滤演算法,及先前八个校时资料计算出时间参考值,判断后续校时包的精确性,一个相对较高的离散程度,表示一个对时资料的可信度比较低仅从一个时间服务器获得校时信息,不能校正通讯过程所造成的时间偏差,而同时与许多时间服务器通信校时,就可利用过滤算法找出相对较可靠的时间来源,然后采用它的时间来校时。

时钟服务应用场景

一般来说在中大型的网络环境中时间服务器基本上来说是必须的,在内网中建立一台时间服务器,其他的服务器都来此服务器同步时间。

像虚拟机如果关机或者是被暂停了之后再开机的时候时间还是原来的时间,这个时候就需要从新同步时间。

如果时间不对可能对业务环境有影响。 比如说像一些分布式系统集群等相互协调工作的应用都需要时间同步服务来确保每个服务器的时间是一致的。

时间服务选型

ntpd、chrony这两款时间管理服务应该怎样选型呢?

centos7.4之前的系统默认是提供的ntpd来作为时间管理服务的,之后就是chrony。其实两个都差不多,看个人喜好。


chrony和ntpd精度对比测试

一般搭建NTP时间服务器的搭建有2种方式:

  1. 利用ntp服务搭建;

  2. 利用chrony服务搭建;

结论:

  1. centos7.4之前的系统默认是提供的ntpd来作为时间管理服务的,之后就是chrony。

  2. 尽量优先使用chrony配置时间同步(较好适配centOS7及以上版本)。并且,常规的ntp服务可能会涉及一些系统相关信息,不安全。

在测试之前,从理论上说chrony的主要优点在于:

\1. 支持Hardware timestamping,时间戳会更加准确,因为从网卡到内核之间的延迟可能有几十us。

\2. 支持xleave,可以提升对网络延迟的测量精度。

img

\1. chrony和ntpd精度对比测试

Redhat从RHEL 7.0开始使用chrony替换ntpd作为默认的ntp同步工具。从chrony的官方网站上可以看到与ntpd各维度详细对比:

img

img

在测试之前,从理论上说chrony的主要优点在于:

\1. 支持Hardware timestamping,时间戳会更加准确,因为从网卡到内核之间的延迟可能有几十us。

\2. 支持xleave,可以提升对网络延迟的测量精度。

为了评估内部是否需要使用chrony来替换ntpd,我自己也做了一些测试。主要是从集群的延迟稳定性和时钟偏差2个维度来衡量。

测试集群选择三个城市的多个机房内服务器做测试。

1.chrony的延迟稳定性

img

2.ntpd延迟稳定性

img

3.chrony时钟稳定性

img

4.ntpd的时钟稳定性

img

从上面的4个图可以看到,实际上NTPD的同步稳定性相对比较好一些。NTP协议本身精度的瓶颈是在于网络延迟稳定性,NTPD在这一块有大量的算法保证:

\1. Clock Filter Algorithm (huff-n’-puff filter)

\2. Clock Select Algorithm

\3. Clock Cluster Algorithm:

\4. Clock Discipline Algorithm:

整体的流程如下:

img

正因为NTP的设计者一开始就考虑的非常全面,使得目前NTP的授时精度早已经达到理论瓶颈。广域网的授时精度要想稳定性&精度超越ntpd,几乎不太可能(PTP只能用户局域网),因此短期内我还是会继续选择NTPD作为时钟同步软件。

对于NTP这种古老的协议,目前还有人愿意投入精力去改进实际是非常难能可贵的,真心希望chrony能早日从稳定性&精度两个方面超越ntpd。

参考链接:https://chrony.tuxfamily.org/comparison.html

引用:https://blog.gnuers.org/?p=1483

时钟同步

NTP服务器和客户端之间的时钟同步主要有两种方式:主动同步和被动同步。

1、主动同步是指客户端定期主动向NTP服务器发起时钟同步请求。例如:

ntpdate -b time.nist.gov

2、被动同步是指当NTP服务器接收到客户端的时钟同步请求时,向客户端发送时钟数据,从而同步客户端的时钟。例如:

ntpd -gq

1、ntp的安装

NTP在Linux主机上默认一般都是安装过的,只是服务没有启用。如果没有安装可直接使用yum install ntp命令即可。

以下示例将以CentOS系统为例,介绍如何安装ntp。

1.安装软件

yum install ntp –y

2.启动服务并设置开机启动

systemctl enable ntpd
systemctl start ntpd

2、ntp的配置

Chrony的配置文件为/etc/ntp.conf。以下示例列出了几个常见的配置选项。

本人在工作中常用到的配置如下:

vim /etc/ntp.conf

注释上面4个server行,添加如下2个ntp时间服务器ip,然后重启ntpd服务即可。(其余配置文件不变的)

server 主时间服务器 preferserver iburst
从时间服务器server 从时间服务器 iburst

image-20230212192959873

  • 其他可配置信息

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

# 将时间同步到硬件时钟
SYNC_HWCLOCK=yes
  • 案例:防止ntp服务器被攻击

当ntp服务器出现异常时,可能是由于ntp服务器被攻击所致。攻击者可能会利用ntp服务器的特殊功能对服务器进行攻击,例如ntp服务器的monlist功能,可以让攻击者通过向ntp服务器发送monlist请求,来获取大量关于特定IP地址的信息。

为了保护ntp服务器安全,我们可以关闭ntp服务器的monlist功能。可以在ntp.conf文件中添加以下配置:

noquery deny all

这将关闭ntp服务器的monlist功能,并禁止所有查询。

  • 案例:更新ntp服务器配置

当ntp服务器出现异常时,可能是由于ntp服务器的配置不正确所致。我们可以通过更新ntp服务器的配置来解决问题。

可以在ntp.conf文件中添加以下配置,以设置ntp服务器的时钟源为本机的时钟

server 127.127.1.0
fudge 127.127.1.0 stratum 10

这将设置ntp服务器的时钟源为本机的时钟,以最终同步本地时钟。

3、ntp的查看

  • 查看NTP信息

1.查看NTP状态:ntpq -p (注意,客户端上也是可以用这个命令的)

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

image-20230212192945002

注意:本次这个时间是与阿里云源同步的;

image-20230212192950944

注意:NTP服务器配置完成启动之后,NTP自身或者与其server的同步需要一个时间段这个过程可能是5-10分钟,在这个时间段内客户端运行ntpdate命令时会产生no serversuitable for synchronization found的错误。

ntpq -p具体含义

image-20230212192945002

输出说明如下:

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.检查ntp服务器是否可用: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服务。

常用命令

案例:ntpdate -q ntp_server_ip 检查ntp服务器是否可用

检查ntp服务器是否可用:ntpdate -q ntp_server_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服务。

案例:ntpstat

FAQ

ntp server vip

客户端ntp配置服务器 serverIp时,配置一个vip,是可以的吗?有啥单边风险没?

在客户端配置 NTP 服务器时,使用一个 VIP(虚拟 IP 地址)是可以的。VIP 可以提供更高的可用性和容错能力,因为它可以指向多个物理服务器。

然而,配置 VIP 也存在一些单边风险需要考虑:

  1. 单点故障:如果 VIP 所指向的物理服务器发生故障,或者 VIP 本身发生故障,将导致客户端无法与 NTP 服务器进行通信。

  2. 同步问题:如果 VIP 所指向的不同物理服务器之间的时间不同步,那么客户端将在不同的时间源之间切换,可能导致时间不准确或不稳定。

  3. 网络拥塞:如果 VIP 所指向的物理服务器之间的网络出现拥塞,客户端可能会受到影响并无法正常与 NTP 服务器通信。

为了减少这些风险,您可以采取以下措施:

  1. 多个 VIP:配置多个 VIP,使其分别指向不同的物理服务器,以提高可用性和容错能力。

  2. 健康检查:使用健康检查机制来监测 VIP 和物理服务器的状态,及时发现故障并进行切换以确保正常运行。

  3. 时间同步:确保所使用的物理服务器之间时间同步,并使用可靠的时间同步协议(如 NTP)来保持时间准确性。

  4. 网络负载均衡:考虑在 VIP 前部署负载均衡器,以在多个物理服务器之间均衡请求,减少网络拥塞的风险。

综上所述,配置一个 VIP 来指向 NTP 服务器是可以的,但需要综合考虑可用性、容错能力和时间同步等因素,并采取相应的措施来减少单边风险。

时间服务故障排查方法

1、机器上的时钟服务器一般要配至少2个ntp server才可以!(1主1备)

2、ntp排错方法

第一步:先确认是否是ntp server的问题

​ 1.是否有大量业务服务器报障时钟服务异常?

​ 2.使用故障机器再同步到另一台ntp server,看下其时钟服务是否正常?

第二步:如果不是ntp server的问题,那接下来就排查下自身时钟服务问题

​ 1.是否是虚机,如果是虚机,那么虚机是否有配置和宿主机同步时钟服务选项?

​ 2.看下当前时钟服务使用的是ntp还是chrony呢?

​ 1.ntp服务

​ 查询命令:

systemctl status ntpd

ntpq -p #查看时间同步源

ntpdate 10.128.252.8 #手动和ntp server同步

​ 配置文件路径:/etc/ntp.conf

​ 2.chrony服务

​ 查询服务状态:

systemctl status chronyd

chronyc sources -v #查看时间同步源

​ 配置文件路径:/etc/chrony.conf

问题:ntp服务器重启后会对业务产生影响吗?

次问题,经工作实践,请知悉。

  • 问题背景

ntp server中的1台有硬件故障,需要停机维修,那么停机后会对业务产生影响吗?

  • 问题解答

一般情况,机器配置ntp都会配置2台ntp server,因此当1台ntp server有问题时,不会对业务产生影响;

一般也放在晚上进行操作,操作完验证下当前ntp server的ntp状态就行;

这2台ntp server(1级ntp源)是gps哦,6;

我们的pc是访问不了的,应该有做白名单限制;

脚本同步ntp

与服务器端同步时间

注意,一般工作中,没用到下面这些脚本,是从配置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

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://onedayxyy.cn/

🍀 语雀

https://www.yuque.com/xyy-onlyone

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!