3、NTP协议基础:NTP层次结构(Stratum)、客户端-服务器模式、对称模式
聊到分布式系统的时间同步,NTP(网络时间协议)是绕不开的基础设施。说实话,我最早接触NTP是在维护一个跨地域的数据库集群时,那时候节点间的时间差动不动就几百毫秒,事务冲突搞得我焦头烂额。后来才意识到,不是NTP不好用,而是我没搞懂它的层次结构和工作模式。
今天咱们就把NTP的底裤扒一扒。你想想看,全球几十亿台设备都在用NTP对时,它凭什么这么稳?
3.1 NTP层次结构(Stratum)
NTP把时钟源分成了层级,这个层级就叫Stratum。说白了,就是给时钟排了个座次。
核心概念:Stratum 0 是原子钟、GPS时钟这类硬件设备,它们直接跟物理世界打交道。Stratum 1 直接连 Stratum 0,Stratum 2 连 Stratum 1,以此类推。层级越低,精度越高。
我个人习惯把Stratum理解成「距离真理的距离」。Stratum 0 就是真理本身,每往下传一层,误差就会累积一点。
| 层级 | 来源 | 典型精度 | 备注 |
|---|---|---|---|
| Stratum 0 | 原子钟、GPS、北斗 | 纳秒级 | 不直接连网络,通过串口等物理接口输出 |
| Stratum 1 | 连接Stratum 0的服务器 | 微秒级 | 也叫主时间服务器 |
| Stratum 2 | 连接Stratum 1的服务器 | 毫秒级 | 大多数企业级NTP服务器都在这个层级 |
| Stratum 3及以下 | 逐级向下同步 | 几毫秒到几十毫秒 | 层级越深,抖动越大 |
注意:Stratum 16 被NTP定义为「不同步」状态。我曾经排查过一个诡异的问题,某台服务器的时间总是跳变,一看日志,Stratum值变成了16——它失去了所有上游时钟源,进入了所谓的「疯狂模式」。
这里有个关键点:NTP不会使用比自己层级还低的服务器作为时钟源。比如Stratum 2的服务器,只会从Stratum 1或Stratum 0同步,绝不会去问Stratum 3要时间。这是防止循环依赖的基本保障。
3.2 客户端-服务器模式
这是最常用的模式,也是大多数人第一次配置NTP时的选择。客户端主动向服务器发起请求,服务器回复当前时间。
流程其实很简单:
- 客户端发送一个NTP请求包,记录下发送时间戳 t1
- 服务器收到请求,记录下接收时间戳 t2
- 服务器回复时,带上t2和发送回复的时间戳 t3
- 客户端收到回复,记录下接收时间戳 t4
有了这四个时间戳,就能算出网络延迟和时钟偏移。公式我就不列了,你记住一句话:NTP通过四次握手,把网络延迟和时钟偏差解耦了。
避坑指南:我曾经在生产环境遇到过一个问题——客户端和服务器之间的网络延迟不对称。比如去程10ms,回程50ms。这种情况下,NTP算出来的时间偏差会有系统性误差。解决办法?要么用对称模式,要么保证网络路径对称。嗯,这里要注意,很多云环境下的虚拟网络,延迟不对称是常态。
客户端-服务器模式的配置也很简单。在Linux上,一行命令就够了:
# 编辑 /etc/ntp.conf
server ntp.aliyun.com iburst
server time.google.com iburst
# 启动服务
systemctl start ntpd
systemctl enable ntpd
iburst参数是我个人比较推荐的,它会在启动时快速发送几个请求包,让客户端在几秒内完成初始同步,而不是慢慢等。
3.3 对称模式
对称模式,说白了就是「互相校准」。两台服务器互为客户端和服务器,谁的时间更准,谁就当老大。
这种模式在什么场景下用?我举个例子:你有一个数据中心,里面有两台核心路由器,它们都需要精确时间,但又不能都去公网NTP服务器同步(万一公网断了呢?)。这时候让它们俩互相做对称同步,再各自去同步内网的其他设备,可靠性就上来了。
对称模式的报文格式和客户端-服务器模式几乎一样,唯一的区别是报文头里的模式字段不同:
- 客户端-服务器模式:模式字段 = 3(客户端) / 4(服务器)
- 对称模式:模式字段 = 1(主动端) / 2(被动端)
配置上也很简单:
# 在路由器A上配置
peer 192.168.1.2
# 在路由器B上配置
peer 192.168.1.1
这样配置后,两台设备会持续交换时间信息。NTP内部会运行一个选择算法,选出精度更高的那个作为参考源。
关键区别:客户端-服务器模式是单向依赖,客户端死了不影响服务器。对称模式是双向依赖,任何一方出问题,另一方也会受影响。所以我的建议是——能用客户端-服务器模式就别用对称模式,除非你有高可用方面的特殊需求。
3.4 核心知识结构图
下面这张图是我手绘的NTP核心逻辑,帮你把今天讲的内容串起来:
这张图把Stratum层级和两种工作模式放在了一起。你注意看,从Stratum 0到Stratum 3,精度是逐级下降的,但覆盖范围是逐级扩大的。Stratum 1的服务器全球也就几百台,而Stratum 3的设备数以亿计。
个人经验:我建议你在生产环境中,至少配置两个不同层级的NTP服务器。比如一个Stratum 2的阿里云NTP,再加一个Stratum 1的Google NTP。这样即使其中一个挂了,另一个还能顶上。我曾经就因为只配了一个NTP源,结果那个源宕机了,整个集群的时间都开始漂移——那叫一个惨。
好了,NTP的基础就这些。Stratum层级决定了你的时间精度上限,客户端-服务器模式适合大多数场景,对称模式则是高可用的利器。搞懂了这些,你再去配置NTP,心里就有底了。
公众号:蓝海资料掘金营,微信deep3321