一、时间同步服务扩展总结
1. 时间同步的重要性
-
多主机协作需求:在分布式系统、集群、微服务架构中,时间一致性是日志排序、事务顺序、数据一致性的基础。
-
安全协议依赖:TLS/SSL证书、Kerberos认证等依赖时间有效性,时间偏差可能导致身份验证失败或中间人攻击漏洞。
-
故障排查:日志时间戳若不同步,跨节点问题定位将极其困难。
-
高精度场景:金融交易(毫秒级误差可能引发损失)、科学实验、5G网络同步(微秒级要求)等场景对时间精度要求极高。
2. NTP 协议核心机制
-
层级结构(Stratum):
-
Stratum 0:高精度物理设备(如原子钟、GPS卫星时钟),直接提供时间源。
-
Stratum 1:与Stratum 0设备直连的NTP服务器,作为主时间服务器。
-
Stratum 2:从Stratum 1同步的服务器,依次类推(最多15层)。
-
-
时钟漂移修正:通过算法(如Marzullo算法)计算网络延迟和时钟偏差,逐步调整系统时间,避免时间跳变。
-
闰秒处理:NTP协议支持在协调世界时(UTC)插入闰秒时平滑调整系统时间。
3. chrony 核心原理
-
设计目标
-
动态网络适应:自动调整轮询间隔(
minpoll
/maxpoll
),适应网络延迟和波动。 -
快速收敛:在初始同步或网络恢复时,通过
iburst
参数快速完成时间校准。 -
最小化时钟偏差:利用硬件时间戳(
hwtimestamp
)和实时时钟(RTC)补偿,减少累积误差。 -
离线模式支持:无网络时依赖本地时钟维持时间稳定性。
-
-
核心组件
-
chronyd 守护进程:后台服务,负责与时间源通信并调整系统时钟。
-
chronyc 命令行工具:用于监控和动态修改配置。
-
配置文件
/etc/chrony.conf
:定义时间源、策略、日志等参数。
-
4. NTP 服务(ntpd)
-
特点:
-
长连接模式:持续与时间服务器通信,适合长期稳定运行的环境。
-
资源占用低:适合嵌入式设备或低配置服务器。
-
成熟稳定:经过多年验证,兼容性广泛(旧系统、网络设备)。
-
-
局限性:
-
网络波动敏感:间歇性网络中断时同步效率下降。
-
启动速度慢:初次同步可能需要较长时间。
-
温度敏感性:物理服务器时钟易受环境温度影响,需频繁修正。
-
5. Chrony 服务
-
核心优势:
-
动态适应网络:在断线、高延迟网络中快速收敛,适合移动设备、虚拟机、云环境。
-
更小时间偏差:通过更精细的时钟频率调整算法(如RTC补偿),减少长期运行后的累积误差。
-
安全性增强:支持NTP的Autokey协议,防止中间人攻击。
-
-
关键特性:
-
硬件时间戳:利用网卡硬件记录数据包收发时间,消除操作系统调度延迟,显著提升精度(可达亚微秒级)。
-
隔离模式:无网络时,依赖本地时钟维持时间一致性,避免服务中断。
-
轻量级设计:服务进程资源占用更低,适合容器化环境。
-
二、时间同步服务器的使用
1.使用 timedatectl 命令进行系统时间与时区管理
timedatectl 基础命令与功能
命令 | 功能说明 |
---|---|
timedatectl | 查看当前时间、时区、NTP 同步状态等完整信息。 |
timedatectl set-time "YYYY-MM-DD HH:MM:SS" | 手动设置系统时间(需 root 权限)。 |
timedatectl list-timezones | 列出系统支持的所有时区名称(按 PageUp /PageDown 翻页)。 |
timedatectl set-timezone "时区名" | 设置系统时区(如 Asia/Shanghai )。 |
timedatectl set-local-rtc 0 | 将硬件时钟(RTC)视为 UTC 时间(推荐)。 |
timedatectl set-local-rtc 1 | 将硬件时钟(RTC)视为 本地时间(Windows 双系统场景可能需要)。 |
timedatectl set-ntp yes/no(true/false) | 启用/禁用 NTP 网络时间同步(启用后自动同步时间,覆盖手动设置)。 |
2.从公共 NTP 服务器中同步时间到本地机器
常用公共 NTP 服务器分类汇总表
服务商/项目 | NTP 服务器地址 | .地区/用途 | 备注 |
---|---|---|---|
NTP Pool Project | [0-3].asia.pool.ntp.org | 亚洲地区(动态分配最近节点) | 全球分布式集群,自动选择最优节点。支持多区域(如 europe.pool.ntp.org )。 |
pool.ntp.org | 全球(默认分配最近节点) | 主入口,推荐普通用户使用。 | |
阿里云 | ntp.aliyun.com | 中国大陆 | 阿里云公共 NTP,低延迟,国内推荐。 |
ntp1-7.aliyun.com | 中国大陆(多节点负载均衡) | 冗余设计,提升可靠性(如 ntp1.aliyun.com 至 ntp7.aliyun.com )。 | |
time.pool.aliyun.com | Windows 系统专用 | Windows 时间服务默认支持。 | |
国家授时中心 | ntp.ntsc.ac.cn | 中国大陆 | 中国科学院国家授时中心官方服务器,高精度、高可靠性。 |
腾讯云 | ntp.tencent.com | 中国大陆 | 腾讯云公共 NTP,适用于国内云服务器。 |
time.google.com | 全球 | 谷歌公共 NTP,支持 IPv4/IPv6,需网络可访问谷歌。 | |
Microsoft | time.windows.com | 全球 | Windows 默认时间服务器,兼容性强。 |
Apple | time.apple.com | 全球 | macOS 和 iOS 设备默认时间服务器。 |
Amazon | [0-3].amazon.pool.ntp.org | 全球(AWS 区域优化) | 亚马逊云 NTP 服务,适合 AWS 用户。 |
Cloudflare | time.cloudflare.com | 全球 | Cloudflare 提供的公共 NTP,低延迟。 |
CNNIC | cn.ntp.org.cn | 中国大陆 | 中国互联网络信息中心(CNNIC)维护的 NTP 服务器。 |
下图我们将NTP服务器的地址源改写成国家授时中心的NTP服务器地址。
然后使用 systemctl restart chronyd.service 重启chrony服务,使新的配置生效。
在RHEL9中,chrony
是 RHEL 9 中默认的 NTP 客户端,chronyc
是 chrony
的控制工具,可用于查看详细的时间同步信息。
-
查看 NTP 源状态:chronyc sources -v
-
查看时间同步统计信息:chronyc tracking
chronyc sources -v
输出字段详解
字段 | 说明 | 示例/可能值 |
---|---|---|
MS | 状态标记:表示源的状态,符号组合如下: - ^* :当前同步的源。- ^+ :候选源(备选)。- ^- :可接受的源。- ^? :未同步或不可信源。- ^x :被排除的源(误差过大)。 | ^* , ^+ , ^- , ^? , ^x |
Stratum | 层级:时间源的层级,范围 1-15,1 表示最高精度(如原子钟),层级逐级递增。 | 1 , 2 , 3 |
Poll | 轮询间隔:与源同步的时间间隔(秒),以 2 的幂表示(如 6 表示 2⁶=64 秒)。 | 6 (64秒), 10 (1024秒) |
Reach | 可达性:最近 8 次轮询的成功率,8 进制表示(377 表示 8 次全部成功)。 | 377 (全成功), 25 (部分成功) |
LastRx | 最后接收时间:距离最后一次接收到源响应的时间(格式:秒/分钟/小时/天)。 | 45s , 3h , 7d |
Last sample | 最后样本偏差:最后一次时间同步的偏差,包含: - 时间偏移( ±数值 ):本地与源的时间差。- 延迟( delay ):网络延迟。- 离散度( disp ):误差范围。 | +0.123ms ± 0.456ms , delay 12.3ms |
Source | 时间源地址:NTP 服务器的 IP 或域名。 | ntp.aliyun.com , 192.168.1.1 |
State | 源状态:详细状态描述,如同步状态、网络状态等。 | SYNC , INIT , WAIT |
Flags | 标志位:表示源的特性,如: - N :NTP 协议源。- P :PPS 信号源。- S :选择状态。- A :认证通过。 | N , NP , S , A |
Condition | 状态条件:源的健康状态,如: - OK :正常。- FALSETICK :检测到异常。- JITTER :抖动过大。 | OK , FALSETICK , JITTER |
3.时间同步服务器的搭建
时间同步测试服务器IP地址:192.168.52.200/24
时间同步测试主机IP地址:192.168.52.20/24
以下配置都在Chrony 的配置文件 /etc/chrony.conf
中进行。
netstat -antlupe各列参数含义
列 | 说明 |
---|---|
Proto | 协议类型(udp 、udp6 分别表示 IPv4 UDP 和 IPv6 UDP)。 |
Recv-Q | 接收队列大小(当前待处理的数据包数量,0 表示无积压)。 |
Send-Q | 发送队列大小(当前待发送的数据包数量,0 表示无积压)。 |
Local Address:Port | 本地监听的地址和端口: - 0.0.0.0:123 :监听所有 IPv4 接口的 NTP 服务端口(123)。- 127.0.0.1:323 :IPv4 本地回环地址的 chronyd 控制端口(323)。- ::1:323 :IPv6 本地回环地址的 chronyd 控制端口(323)。 |
Foreign Address:Port | 远端连接的地址和端口: - 0.0.0.0:* 或 :::* :表示未建立连接(监听状态)。 |
State | 连接状态(UDP 无状态,因此显示 * )。 |
UID | 进程所有者的用户 ID(0 表示 root 用户)。 |
PID/Program | 进程 ID 和程序名称: - 98619/chronyd :chronyd 守护进程的 PID。 |
其他扩展信息 | netstat -e 显示的额外信息(如网络统计,此处未显式展示)。 |
然后就发现测试主机可以同步到服务器端的时间了。