NTP 时间同步服务器
时间同步协议
时间在计算机系统中至关重要的。它不仅仅是为了显示当前的日期和时间,而是为了确保系统的正常运行、安全性、一致性和性能。准确的时间信息对于计算机系统的各个方面都是必不可少的。
- 同步和协调:时间提供了一个共同的参考点,确保计算机系统中的组件和进程按照正确的顺序执行,保持系统的稳定性和一致性。
- 安全和认证:时间在计算机安全和认证中起着关键作用,用于验证和保护系统,包括数字证书的有效期限、身份验证令牌的时间同步和防止重放攻击等。
- 记录和分析:时间戳在记录和日志中起着重要作用,帮助我们了解事件发生的顺序、持续时间和时间间隔,以及在任务调度和性能分析中确定任务优先级、执行时间和延迟等方面的应用。
- 数据一致性和复制:在分布式系统中,时间对于确保数据一致性和复制的正确性非常重要。时间戳可以用于确定事件的顺序,从而确保数据在不同节点之间的正确复制和同步。
计算机的系统时间一般来自两部分:本地计算机时间,远程时间服务器
RTC(Real-Time Clock,实时时钟) 是计算机中的硬件设备,用于保持系统的时间和日期,
即使在系统断电或关机时,它也能继续运行。
RTC 通常由电池供电,因此即使主系统断电,RTC 仍能保持精确的时间。
查看当前 RTC 时间:
hwclock --show
同步系统时间和 RTC 时间:
从 RTC 读取时间并设置系统时间:
hwclock --hctosys
将当前系统时间写入 RTC:
hwclock --systohc
RTC 与系统时间的区别:
RTC 时间:硬件时钟时间,保存在设备中的独立计时器中,即使系统关闭,RTC 仍然继续运行。
系统时间:操作系统维护的时间,通常由内核管理。系统启动时会从 RTC 获取初始时间,但一旦系统启动,系统时间的维护不再依赖于 RTC。
- 系统时钟:表示计算机的系统时间,由操作系统维护,定期进行更新和校准。
- 本地更新:计算机一般内部都配置RTC硬件设备,当操作系统启动时会查询RTC并设置系统时钟。但RTC有个问题就是,会有误差,并且误差会累积,因此当时间拉长,系统时钟会越来越不准确,因此需要定期校准。
- 校准:本地计算机通过时间同步协议定期同步远程时间服务器时间,并对本地系统时钟进行微调校准。
- 时间同步协议:通过该协议对本地系统时钟进行校准
- 时间服务器:通过更高精密的物理设备,提供高精度时间。时间源如:高精度原子钟,GPS卫星时间、其他时间服务器等
常见的时间同步协议如下:
注:互联网中一般使用NTP协议进行计算机之间的时间同步。
时间同步协议 | 名称 | 优点 | 缺点 | 常用领域 |
---|---|---|---|---|
NTP | Network Time Protocol | - 广泛应用于互联网和局域网环境 - 可扩展性和灵活性好 | - 精度相对较低 - 受网络延迟和时钟漂移影响 | 互联网、局域网 |
PTP | Precision Time Protocol | - 高精度时间同步 - 微秒级或纳秒级精度 | - 需要专用硬件支持 - 配置和部署复杂 | 工业自动化、金融交易系统 |
GPS | Global Positioning System | - 提供高精度时间信息 - 全球范围可用 | - 需要接收GPS信号的可见性 - 受天气和地理条件影响 | 科学研究、导航、定位 |
RTS | Radio Time Signals | - 提供时间信号广播 - 一些国家和地区可用 | - 受地理限制 - 精度相对较低 | 特定地区的时间同步需求 |
NTP时间同步发展历程
NTP协议的发展经历了多个版本,从v1到v4,每个版本都引入了新的特性和功能。
以下是每个版本的特点简要概述:
- NTP v1:最早的NTP版本,于1985年发布。它是一个简单的协议,主要用于时间同步和基本的时钟校准。
- NTP v2:于1988年发布,引入了一些改进,如更好的时钟校准算法和更准确的时间同步。
- NTP v3:于1992年发布,是第一个广泛使用的NTP版本。它引入了一些重要的特性,包括对称性和客户端/服务器模式、更准确的时钟校准算法、更好的时钟选择算法以及更强大的安全性。
- NTP v4:于2010年发布,是目前最新和最广泛使用的NTP版本。它引入了许多新特性和改进,包括更准确的时钟选择算法、更强大的安全性和认证机制、更好的时钟校准算法、更灵活的配置选项等。
SNTP(Simple Network Time Protocol): 是NTP的简化版本,旨在提供基本的时间同步功能。由于SNTP实现了一部分NTPv4功能,因此SNTPv4相关实现已经合入到NTPv4。与NTP相比,SNTP协议主要关注基本的时间同步功能,功能较少,更加易于理解和实现,不过时间同步精度较差。因此SNTP适合一些对时间精度和可靠性要求不是特别高的互联网或局域网
NTP工作原理
- T1:时间同步请求时间
- T2:时间服务器接收到请求时间
- T3:时间服务器响应时间
- T4: 时间同步请求响应时间
计算延迟时间Delay
# Delay为客户端和服务端RoundTrip Time
Delay = [(T4 - T1) - (T3 – T2)]/2
计算时间偏差Offset
# 客户端时间T4加Offset为服务端当前时间
T4 + Offset = T3 + Delay
# Offset为计算服务端和客户端的时间偏差,Offset可以为正或者负值
Offset = T3 + Delay - T4 = [(T2 - T1) + (T3 – T4)]/2
注:客户端时间校准基于Offset,错略来说客户端当前时间为CurrentTime = T4 + Offset = (T4 + T3 + T2 - T1)
NTP分层结构
NTP服务一般采用分层结构
实现,从Stratum 0到Stratum 15不等。,Stratum(层)指的是时间源的层级结构。每个时间源都被分配到一个特定的层级,以下是对Stratum分层结构示意图:
- Stratum:Stratum 0是最高层级,代表原子钟、GPS接收器或其他高精度的时间源。Stratum 1是直接与Stratum 0时间源相连的服务器,Stratum 2是与Stratum 1服务器相连的服务器,以此类推。
- 分层的目的:分层结构有助于建立时间同步的可靠性和稳定性。通过分层,NTP协议可以避免时间环路和错误传播,确保时间同步的准确性和可靠性。
- 分层时间精度:不同层级的时间源具有不同的精确度。Stratum 0时间源通常具有最高的精确度,因为它们直接从原子钟或卫星接收到高精度的时间信号。随着层级的增加,精确度可能会略微降低,但在整个NTP网络中,精确度通常仍然非常高。
- 时间同步过程:较低层级的服务器会定期向较高层级的服务器发送时间请求。较高层级的服务器使用自己的时钟和与更高级别的时间源的同步信息来响应这些请求。通过这种方式,时间信息从更高级别的时间源传播到较低级别的服务器,实现整个网络中的时间同步。
注: 互联网主机通常会同步到Stratum 2或Stratum 3级别的时间服务器。这是因为Stratum 2和Stratum 3级别的时间服务器已经通过Stratum 1级别的时间服务器与高精度的时间源进行了同步,提供了足够准确的时间信息,满足大多数应用的需求。
实践 应用 NTP (centos7)
### 安装NTP
yum install ntp -y
### 配置ntp
[root@docker03 ~]# cat /etc/ntp.conf | grep -Ev '^#|^$'
driftfile /var/lib/ntp/drift
# 记录系统时钟的漂移(drift)用于补偿本地时钟的误差NTP 守护进程会定期更新这个文件以保持时间精度。
restrict default nomodify notrap nopeer noquery
# 这是 NTP 的访问控制配置,表示对所有默认的 IP 地址应用以下限制:
# nomodify:阻止远程主机修改本地 NTP 服务器的配置,但允许查询时间。
# notrap:不允许远程主机设置捕获模式。
# nopeer:防止该主机与远程主机形成对等伙伴关系。
# noquery:不允许远程主机查询 NTP 服务,防止信息泄露。
restrict 127.0.0.1
restrict ::1
# 允许本地回环接口(IPv4 127.0.0.1 和 IPv6 ::1)不受限制访问 NTP 服务。这样本地系统可以与本地 NTP 守护进程自由通信。
server 0.centos.pool.ntp.org iburst #### 时间服务器地址 修改为阿里的 ntp1.aliyun.com
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
includefile /etc/ntp/crypto/pw
# 包含一个外部文件,该文件用于存放 NTP 加密密钥的密码。主要用于 NTP 的加密认证。
keys /etc/ntp/keys
# 指定密钥文件的位置。这个文件存储 NTP 的密钥,用于在 NTP 客户端和服务器之间进行认证。
disable monitor
# 关闭 NTP 的监控功能,防止 NTP 服务收集和存储关于客户端的信息。这可以提高隐私性,减少 NTP 服务器的负载。
[root@docker03 ~]# cat /etc/ntp.conf | grep -Ev '^#|^$'
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server ntp1.aliyun.com iburst
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
### 启动 ntp
systemctl start ntpd.service
systemctl enable ntpd.service
### 检查
[root@docker03 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
120.25.115.20 10.137.53.7 2 u 12 64 1 32.510 9.359 0.398
配置文件详解
[root@docker03 ~]# cat /etc/ntp.conf | grep -Ev '^#|^$'
driftfile /var/lib/ntp/drift
# 记录系统时钟的漂移(drift)用于补偿本地时钟的误差NTP 守护进程会定期更新这个文件以保持时间精度。
restrict default nomodify notrap nopeer noquery
# 这是 NTP 的访问控制配置,表示对所有默认的 IP 地址应用以下限制:
# nomodify:阻止远程主机修改本地 NTP 服务器的配置,但允许查询时间。
# notrap:不允许远程主机设置捕获模式。
# nopeer:防止该主机与远程主机形成对等伙伴关系。
# noquery:不允许远程主机查询 NTP 服务,防止信息泄露。
restrict 127.0.0.1
restrict ::1
# 允许本地回环接口(IPv4 127.0.0.1 和 IPv6 ::1)不受限制访问 NTP 服务。这样本地系统可以与本地 NTP 守护进程自由通信。
server 0.centos.pool.ntp.org iburst #### 时间服务器地址 修改为阿里的 ntp1.aliyun.com
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
includefile /etc/ntp/crypto/pw
# 包含一个外部文件,该文件用于存放 NTP 加密密钥的密码。主要用于 NTP 的加密认证。
keys /etc/ntp/keys
# 指定密钥文件的位置。这个文件存储 NTP 的密钥,用于在 NTP 客户端和服务器之间进行认证。
disable monitor
# 关闭 NTP 的监控功能,防止 NTP 服务收集和存储关于客户端的信息。这可以提高隐私性,减少 NTP 服务器的负载。
[root@docker03 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
120.25.115.20 10.137.53.7 2 u 12 64 1 32.510 9.359 0.398
remote: NTP 服务器地址 (120.25.115.20)。
refid: 服务器的参考时钟地址(10.137.53.7),表明这个 NTP 服务器从哪个上级服务器获取时间。
st(Stratum):表示 NTP 服务器的层级(Stratum)。值为 2,说明该服务器与原始时间源之间有一个中继服务器。这是正常且有效的。
t: 表示连接类型,u 表示使用的是 unicast 模式(单播)。
when: 距离上一次与 NTP 服务器通信的时间(秒)。这里是 12,表示 12 秒前有一次通信。
poll: 当前的轮询间隔(秒),表示客户端与服务器的通信间隔时间。当前为 64 秒。
reach: 表示最近 8 次与服务器的通信情况。1 表示成功了一次,这表明这是初次通信。
delay: 与 NTP 服务器之间的往返延迟(毫秒)。当前值为 32.510 ms,表示与服务器通信的延迟。
offset: 本地时间与 NTP 服务器时间的偏差(毫秒)。9.359 ms 表示本地时间比服务器快或慢 9.359 毫秒。
jitter: 时间同步中的抖动量(毫秒),表示时间偏差的波动。0.398 ms 是抖动值,越小越好。
配置NTP 时间服务器
###### 配置NTP服务器
## 安装 ntp
yum install ntp -y
## 编辑ntp配置文件
vim /etc/ntp.conf
# 设置上层ntp服务器
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
# 设置允许本地时间同步
restrict 172.16.1.0 mask 255.255.255.0 nomodify notrap
driftfile /var/lib/ntp/drift
disable monitor
includefile /etc/ntp/crypto/pw
disable monitor
客户端配置
## 安装ntpdate 时间同步
yum install ntpdate -y
## 测试
[root@docker01 ~]# ntpdate 172.16.1.104
12 Sep 15:00:47 ntpdate[1706]: step time server 172.16.1.104 offset 0.635936 sec
## 写入定时任务
# Sync System Time (每分钟同步一次)
* * * * * /usr/sbin/ntpdate 172.16.1.104 &>/dev/null