跳到主要内容

时间同步服务

前言

××××年×月××日--*时*分,你在加班,解决着棘手的报错问题。

你检查了服务配置文件,均没有问题,在焦灼的过程中,重复着复制报错,浏览帖子,不经意间觉察到该不会是时间不同步导致。

最终......果然。

简介:

时间,对于服务来说是要求精度的,两台服务器之间时间相差过多,可能会带来不可预估的情况:

  • 分布式服务的数据不一致。
  • 日志分析困难,混乱。
  • 服务之间的认证,授权失败。
  • .............

目前实现时间同步的服务协议有两种:NTPChrony,二者的区别如下:

  • NTP:是传统的时间同步协议,有较长历史,通常用于对时间精度要求较高的场景,如金融,科学实验室等。

    ​ 更多的配置,能够进行更精细的调优,也因此算法复制,启动耗时,可能会耗费系统资源。

  • Chrony:相对较新的时间同步工具,对标NTP,设计取代之,并提供更好的性能和精度。

    ​ 算法更简单,启动速度更快,对系统资源消耗更少。

在大多数场景下,Chrony足以满足我们对时间的同步需求,且维护更加容器配置与管理。

Chrony搭建部署

角色(Centos7.6系统)IP
chrony服务器192.168.10.110
客户机192.168.10.120
  1. Chrony服务安装
# yum -y install chrony
  1. Chrony同步外网服务器
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp.aliyun.com iburst # 或者为127.127.1.0

# ......... 此处省略中间配置,无需更改

# Allow NTP client access from local network.
allow 192.168.10.0/24

# ......... 此处省略中间配置,无需更改
  • server ntp.aliyun.com:指定为阿里云时间服务器地址。

  • server 127.0.0.1:则指定本地为时间服务器地址。此情况适用于该服务器的时间精度正常。

  • allow 192.168.10.0/24:指定允许连接服务器地址的来源地址。

  1. Chrony服务重启
# systemctl restart chronyd

# 查看同步服务器状态:
[root@chrony ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? 203.107.6.88 2 6 3 40 -205us[ -205us] +/- 20ms

# 输出信息解释:
* MS Name/IP address: 表示主从服务器的名称或IP地址。
* Stratum: 表示该服务器的时钟层级。Stratum 0 代表最准确的时钟(通常是原子钟),Stratum 1 是直接与 Stratum 0 同步的服务器,以此类推。
* Poll: 表示客户端向服务器发送时间同步请求的间隔时间。这里的值6表示每隔2^6 = 64 秒向服务器发送一次时间同步请求。
* Reach: 表示客户端最近一段时间内成功与服务器通信的次数。在这里,值为1表示最近一段时间内只有一次成功通信。
* LastRx: 表示客户端上次接收到服务器时间信息的时间戳。在这里,-14161s 表示相对于当前时间已经过去了14161秒。
* Last sample: 表示客户端对服务器进行最后一次时间采样的时间。"+/- 26ms" 表示最后一次采样的时间与实际时间的偏差为26毫秒。

[root@chrony ~]# nslookup ntp.aliyun.com
Server: 114.114.114.114
Address: 114.114.114.114#53

Non-authoritative answer:
Name: ntp.aliyun.com
Address: 203.107.6.88 # 可以看到与上方地址一致,代表连接aliyun时间服务器成功。
  1. 客户端时间同步
# 安装步骤同上:
# 安装chrony
# 配置chrony:此时指定的server地址为192.168.10.110
# 无需配置allow参数选项

# 重启服务,查看时间:
[root@client ~]# systemctl restart chronyd
[root@client ~]# date
2024年 02月 27日 星期二 22:21:10 CST

# 强制手动与时间服务器同步
[root@client ~]# chronyc -a makestep

NTP搭建部署

步骤与上方一致

  1. NTP服务安装:
[root@ntp ~]# yum -y install ntp
  1. NTP服务配置:
[root@ntp ~]# vi /etc/ntp.conf
# 主要配置:
# restrict: 对ntp做权限控制,比如:
# restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap >> 允许192.168.1.0/24网段的主机进行时间同步
# 其中的:nomodify: 限制客户端不能使用命令ntpc和ntpq来修改服务器端的时间
# notrap: 不接受远程登录请求
# 其它的:nopeer: 表示不允许其他 NTP 对等体与此服务器进行对等通信。
# noquery: 表示不允许进行时间查询操作。

# server: 指定同步的时间服务器地址
# 注释掉默认的4行,下方新增一行:
# server ntp.aliyun.com iburst 【若以本地时间为准进行同步, 则IP地址指向自己: 127.127.1.0】
# iburst配置: 在启动时以更快的速度进行同步, 通常情况下,NTP 客户端在启动时会等待一段时间才开始与服务器进行同步。使用 "iburst" 选项可以加快这个过程,让客户端更快地获得准确的时间信息,特别是在初始连接时或重新连接时非常有用。
# server后方还可以添加minpool 5 maxpool 10, 来指定客户端时间同步的周期
# 例如: server ntp.aliyun.com iburst minpool 5 maxpool 10: 表示最短5s, 最长10s进行时间同步, 默认是64s。
  1. NTP服务启动
[root@ntp ~]# systemctl start ntpd
  1. 验证时间同步
[root@ntp ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
203.107.6.88 100.107.25.114 2 u 1 64 1 29.216 7.394 0.000

# 输出信息解释:
* remote: 远程 NTP 服务器的 IP 地址为 203.107.6.88。
* refid: 引用标识,指示远程服务器的参考时钟源为 100.107.25.114。
* st: 表示远程服务器的时钟层级为 2(stratum 2),即该服务器直接与 stratum 1 服务器同步。
* t: 表示服务类型,这里为 u(upstream),表示该服务器是上游时间源。
* when: 上次成功通信的秒数。
* poll: 每隔多少秒向服务器发起一次查询。
* reach: 表示最近 8 个查询中成功与服务器通信的次数。
* delay: 表示网络延迟,单位为毫秒。
* offset: 表示本地时钟相对于服务器时钟的偏移量,单位为毫秒。
* jitter: 表示本地时钟的抖动,即时钟值在短时间内发生变化的程度。

Ntpdata与Ntpstat

这两个命令都可以帮助我们去调试,配置,查询时间同步的状态,信息等。具体用法如下

  • Ntpdata
# 选项参数
-b:使用步进模式,即快速强制设置时间,而不是平滑地调整时间。一般是客户端的时间与服务器有较大差距。
-d:启用调试模式,显示更详细的调试信息。
-q:查询模式,仅查询 NTP 服务器的时间,不会更新本地系统时间。
-u:使用未占用 UDP 端口进行通信,这样就可以绕过一些防火墙的限制。
-s:将错误消息输出到日志文件中。
-a:自动尝试调整时间,即自动选择最佳服务器并调整时间。
-t seconds:指定超时时间,单位为秒,表示 ntpdate 尝试连接 NTP 服务器的时间上限。
serverip:要同步的 NTP 服务器的主机名或 IP 地址。

# 同步时间服务器时间: ntpdate serverip -t 10
# 查询时间服务器时间: ntpdate -q serverip [不会同步本地时间]
# 查询同步过程的细节: ntpdate -d
  • Ntpstat
# 提供了关于系统时间同步性能的简要信息
# 直接使用Ntpstat输出信息的情况如下:
unsynchronised:表示系统时间未与 NTP 服务器同步。
time server re-starting:表示时间服务器正在重新启动。
frequency unknown:表示无法确定系统时钟频率,可能需要更多时间来同步。
frequency tolerance:显示系统时钟与 NTP 服务器之间的频率偏差。
maximum error:显示系统时钟的最大误差值。
estimated error:显示估计的系统时钟误差值。
status:显示当前 NTP 状态,如频率校准、时间校准等信息。

# 该命令一般用于快速查看客户端与服务器的同步状态信息

no server suitable for synchronization found

该报错表示:没有找到适合同步的服务器

原因一般如下:

  1. server指定的时间同步服务器地址不可用。解决:可以将地址指向可用的,或者本机
  2. ntp服务版本问题:ntp4.2(包括4.2)之后的版本,在restrict的定义中使用了notrust的话,会导致报错。解决:配置文件中把notrust去掉。
  3. 防火墙规则屏蔽了udp的123端口(NTP协议端口)。解决:可以的情况下,清空防火墙规则。

时间分类

Centos7系统中,时间分为两类:系统时间硬件时间

  • 系统时间:指操作系统内核维护的当前时间,一般可以使用date命令查看和设置。系统时间通常是由操作系统根据硬件时间与时区计算得来的,可以随时被修改。
  • 硬件时间:指存储在计算机主板上的实时时钟所记录的时间,也成为BIOS或RTC时间。硬件时间一般用来系统开机之后的更新时间。

对于两种时间的查看,设置,可以使用以下命令:

# date命令:查看,设置系统时间
[root@localhost ~]# date
2024年 02月 28日 星期三 14:34:08 CST
[root@localhost ~]# date -s "2024-03-01 18:00:00"
2024年 03月 01日 星期五 18:00:00 CST
[root@localhost ~]# date
2024年 03月 01日 星期五 18:00:02 CST

# hwclock命令:查看,设置硬件 <-> 系统时间
# 查看
[root@localhost ~]# hwclock
2024年02月28日 星期三 14时36分24秒 -0.508513 秒
#手动设置硬件时间
[root@localhost ~]# hwclock --set --date "2024-11-23 21:17:23" --utc 【utc为时区,一般为CST】
# 将硬件时间同步到系统时间,-s和--hctosys效果一样
[root@localhost ~]# hwclock -s
[root@localhost ~]# hwclock --hctosys
# 将系统时间同步到硬件时间
[root@localhost ~]# hwclock -w

# timedatectl命令:用于显示或设置系统时间和日期的配置信息,包括时区、NTP 同步状态等。通过该命令修改时间,会同时修改系统时间和硬件时间。但是开启ntp时间同步的话,是不能使用该命令来同步时间的。
# 查看
[root@localhost ~]# timedatectl
Local time: 一 2015-11-23 21:18:48 CST
Universal time: 一 2015-11-23 13:18:48 UTC
RTC time: 一 2015-11-23 13:18:48
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
# 修改,格式:timedatectl set-time "YYYY-MM-DD HH:MM:SS",前提是关闭ntp:timedatectl set-ntp no【开启:yes】
# 设置时区,格式:timedatectl set-timezone Asia/Shanghai
# 查看时区,格式:timedatectl list-timezones

Stratum配置

Stratum:表示时间源的层级,数字越小表示时间源越精准,越可靠。通常情况下,外部时间服务器的 stratum 会比较低,例如 1 或 2,而本地时钟通常会被设置为高一些的层级,如 10。

当本地时钟的 stratum 设置为 10 时,这意味着本地时钟被认为是一个非常不精确的时间源,处于整个 NTP 网络的最底层。其他 NTP 设备会优先选择更低层级的时间源进行时间同步,而将本地时钟作为最后的备用。

同步网络时间服务器

通过ntpdata命令,指定网络服务器地址,快速同步。

[root@localhost ~]# ntpdate ntp.aliyun.com
29 Feb 16:42:59 ntpdate[25965]: adjust time server 203.107.6.88 offset 0.000367 sec

更多网络时间服务器查看:https://dns.iui.im/ntp/

总结

时间对于服务来说是敏感的,但很多时候会被我们所忽略,遗忘,在生产环境中,如果服务器之间出现时间不一致的情况,可能会影响服务的运行,甚至导致线上业务的崩溃。”千里之堤,毁于蚁穴“。故掌握该项技能是必备的,通过本文,可以快速搭建起时间同步服务器,统一时间。