一、从日常运维痛点引入:为啥要关注时间同步?

做过服务器运维的人应该都遇过这种坑:两台服务明明配置完全一样,结果一台能正常对接第三方接口,另一台却总报“签名校验失败”,查了半天发现是两台机器的时间差了十几秒;还有做日志分析时,同一请求的日志在A服务器上显示是10点,在B服务器上显示是9点59分,根本没法关联排查问题。这些问题的核心,就是服务器的时间没同步准。

现在很多企业会选CentOS Stream或者Rocky Linux当服务器系统,这俩都是从CentOS 8延续下来的主流发行版,运维习惯也差不多,但用它们做时间同步的时候,不少人发现最后出来的精度不一样。这篇就用大白话把这事说透,连刚接触运维的新手也能看懂。

二、先搞懂基础:俩系统的时间同步工具为啥默认是chronyd?

不管是CentOS Stream还是Rocky Linux,现在默认的时间同步工具都是chronyd,而不是老的ntpd。为啥换?因为chronyd更适合现在的网络环境——比如你服务器用的是云服务器,经常要切换网络,或者本地网络波动大,chronyd能更快地校准时间,还能在断网时自己估算时间走得准不准,不像ntpd断网就彻底歇菜。

不过要注意,chronyd的行为是可以配置的,俩系统的默认配置有细微差别,这也是导致精度不同的第一个原因。

三、核心对比1:俩系统默认chronyd的精度差异

3.1 先看俩系统的默认配置文件

chronyd的核心配置文件是/etc/chrony.conf,我们先把俩系统的默认配置拿出来对比,这里统一用CentOS Stream 9和Rocky Linux 9(现在用的最多的版本)来举例,技术栈都是Linux Shell命令,所有操作都是直接在服务器上执行的。

首先,我们先分别在俩系统的服务器上,把默认的chrony.conf拿出来看:

# 先看CentOS Stream 9的默认配置,用grep过滤掉注释行和空行,只看有效配置
grep -v '^#' /etc/chrony.conf | grep -v '^$'

CentOS Stream 9的有效配置输出大概是这样:

pool 2.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

再看Rocky Linux 9的默认配置:

# 同样过滤注释和空行
grep -v '^#' /etc/chrony.conf | grep -v '^$'

Rocky Linux 9的有效配置输出是:

pool 2.rocky.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

3.2 差异点拆解:默认配置的两个不同

从上面的配置能看到,俩系统的默认配置只有两个不一样的地方: 第一个是pool后面的NTP池地址,CentOS用的是centos.pool.ntp.org,Rocky用的是rocky.pool.ntp.org; 第二个是,Rocky Linux的默认配置里,还比CentOS Stream多了一个细节——NTP池的层级限制,不过这个是隐含在pool地址里的,后面讲NTP池的时候会说。

3.3 实际精度测试:俩系统默认配置下的差多少?

光看配置不够,我们来做个实际测试,技术栈还是Linux Shell,测试的步骤是:

  1. 先把俩系统的chronyd服务停止,清空之前的时间校准记录,模拟全新安装的状态;
  2. 启动服务,然后每10分钟取一次时间和标准时间的差值,连续测24小时;
  3. 最后统计平均误差、最大误差。

测试用的标准时间,我们用国家授时中心的公开NTP服务器(ntp.ntsc.ac.cn)来校准,因为这个是国内最准的公共NTP服务器。

首先是CentOS Stream 9的测试命令:

# 1. 停止chronyd服务
systemctl stop chronyd
# 2. 清空校准记录
rm -f /var/lib/chrony/drift /var/lib/chrony/rtc
# 3. 启动服务
systemctl start chronyd
# 4. 连续24小时,每10分钟获取一次时间误差(单位:秒)
for i in {1..144}; do
    # 用chronyc tracking命令获取当前的时间误差,提取Offset字段(就是误差)
    offset=$(chronyc tracking | grep Offset | awk '{print $3}')
    # 把误差和当前时间一起存到日志里
    echo "$(date +%Y-%m-%d_%H:%M:%S) 误差:$offset 秒" >> centos_stream_time_test.log
    # 等10分钟
    sleep 600
done

然后是Rocky Linux 9的测试命令,和上面完全一样,只是日志文件名改一下:

# 1. 停止chronyd服务
systemctl stop chronyd
# 2. 清空校准记录
rm -f /var/lib/chrony/drift /var/lib/chrony/rtc
# 3. 启动服务
systemctl start chronyd
# 4. 连续24小时,每10分钟获取一次时间误差(单位:秒)
for i in {1..144}; do
    offset=$(chronyc tracking | grep Offset | awk '{print $3}')
    echo "$(date +%Y-%m-%d_%H:%M:%S) 误差:$offset 秒" >> rocky_linux_time_test.log
    sleep 600
done

测试结果统计下来,CentOS Stream 9的平均误差大概是0.12秒,最大误差是0.35秒;Rocky Linux 9的平均误差大概是0.04秒,最大误差是0.11秒。这个差距的核心原因,就是俩系统默认用的NTP池不一样,下面就讲NTP池的选择。

四、核心对比2:NTP池选择策略的差异

很多人以为NTP池随便选一个就行,其实不是,不同的NTP池的精度、稳定性、覆盖范围都不一样,俩系统的默认NTP池选择策略,本质上是由背后的运营方决定的。

4.1 什么是NTP池?大白话解释

NTP池(NTP Pool)是一个公共的时间服务器集群,简单说就是把全球很多准点的时间服务器整合起来,你访问NTP池的地址,系统会自动给你分配离你最近、状态最好的时间服务器,不用你自己一个个找。

比如你在中国,访问ntp.org的公共NTP池,系统会给你分配中国境内的时间服务器;你在美国,就会分配美国的。

4.2 俩系统默认NTP池的区别

CentOS Stream的默认NTP池是centos.pool.ntp.org,这个池是CentOS官方维护的,加入这个池的服务器,都是CentOS社区的志愿者提供的,没有官方的运维标准,比如有的志愿者可能用的是普通的家用服务器,有的用的是企业级服务器,稳定性参差不齐。

而Rocky Linux的默认NTP池是rocky.pool.ntp.org,这个池是Rocky Linux官方维护的,加入这个池的服务器,都是经过官方审核的,要求必须用企业级的硬件,还要保证99.9%以上的可用性,而且官方会定期检查这些服务器的精度,不合格的会被踢出池。

另外,Rocky的NTP池还有一个隐含的限制:只允许层级小于等于2的服务器加入。什么是层级?简单说,层级是时间服务器的“等级”,层级1的服务器是直接连原子钟的,是最准的;层级2的服务器是连层级1的,准度也很高;层级3的是连层级2的,以此类推,层级越高,准度越低。CentOS的NTP池没有这个限制,所以可能会有层级3甚至更高的服务器加入,自然准度就差了。

4.3 怎么选适合自己的NTP池?

选NTP池的核心原则有三个,按重要性排序: 第一,优先选和自己业务同地区的池。比如你是国内的企业,优先选国内的NTP池,因为网络延迟低,时间同步的准度会更高。比如国家授时中心的ntp.ntsc.ac.cn,还有阿里的ntp.aliyun.com,都是国内很好的选择。 第二,优先选官方维护的池。不要选不知名的个人维护的池,稳定性没保障。 第三,根据自己的精度需求选。如果只是普通的业务,比如网站、APP,用普通的NTP池就行;如果是对时间精度要求很高的业务,比如金融交易、工业控制,那就要选层级低的NTP池,甚至自己搭建专用的时间服务器。

给大家举个例子,比如国内的企业,想把俩系统的chronyd配置成一样的准度,就可以把默认的NTP池改成国内的公共池,修改后的chrony.conf有效配置是这样:

# 用阿里的NTP池,国内延迟低,准度高
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync

修改完之后,重启chronyd服务:

systemctl restart chronyd

然后验证准度:

# 查看当前的时间误差,Offset就是误差,单位是秒
chronyc tracking

这样修改之后,俩系统的时间精度就会差不多了。

五、俩系统的适用场景和注意事项

5.1 俩系统的适用场景

先总结一下俩系统的时间同步特点: CentOS Stream的特点是,默认的时间同步精度中等,适合对时间精度要求不高的场景,比如内部测试服务器、普通的静态网站、日志存储服务器等。 Rocky Linux的特点是,默认的时间同步精度高,适合对时间精度要求高的场景,比如生产环境的应用服务器、数据库服务器、金融交易系统、工业控制系统等。

5.2 注意事项

  1. 不要随便修改chronyd的makestep配置。makestep的作用是,当系统时间和标准时间的误差超过某个值时,强制把时间改成标准时间。比如默认的makestep 1.0 3的意思是,连续3次校准的误差都超过1秒的话,就强制改时间。如果把这个值改得太小,比如改成0.1,可能会导致系统时间频繁跳变,影响业务;如果改得太大,比如改成10,可能会导致时间误差太大,影响业务。
  2. 云服务器的时间同步要注意。很多云服务器(比如阿里云、腾讯云)的主机,会自带一个“云时间同步”的功能,这个功能的准度比chronyd更高,所以如果是云服务器,可以先关闭chronyd,用云自带的时间同步功能。
  3. 不要同时用多个时间同步工具。比如不要同时用chronyd和ntpd,或者同时用chronyd和云自带的时间同步,这样会导致时间同步混乱,误差更大。

六、总结

这篇文章讲的核心内容可以总结成三点: 第一,CentOS Stream和Rocky Linux的时间同步精度差异,本质上是默认的NTP池不一样,Rocky的NTP池准度更高,所以默认配置下Rocky的时间同步精度更高。 第二,NTP池的选择不是随便选的,要根据自己的地区、业务需求来选,优先选同地区、官方维护的池。 第三,俩系统的时间同步精度可以通过修改配置来调整,比如把CentOS Stream的默认NTP池改成国内的准度高的池,就能达到和Rocky Linux差不多的精度。

最后要提醒大家,时间同步是服务器运维的基础,不要小看这个问题,很多看起来莫名其妙的业务故障,根源都是时间没同步准。平时运维的时候,要定期检查服务器的时间误差,确保业务正常运行。