下一代时间同步服务 Chrony 详解

· · 2781 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Chrony 是一个多功能的 NTP (Network Time Protocol) 实现,类 Unix 系统上 NTP 客户端和服务器的替代品。它可以通过 NTP 服务或者类似 GPS 时钟接收器的硬件级参考时钟来同步系统时钟,具有更好的时钟准确度,并且对于那些间歇性互联网连接的系统很有帮助。Chrony 是免费开源的,并且支持 GNU/Linux 和 BSD 衍生版、Solaris 等。

下一代时间同步服务 Chrony 详解

Chrony 有两个核心程序:一个是 chronyd 守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。另一个是 chronyc,它提供一个用户界面,用于监控性能并进行多样化的配置。chronyc 可以在 chronyd 实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

Chrony 和 NTPD 精度对比测试

我们可以从 Chrony 的官方网站上可以看到与 NTPD 各维度详细对比:

下一代时间同步服务 Chrony 详解

从其测试结果上看似乎是各维度性能都可以吊打 NTPD。因此 Chrony 的整体评价还是比较高的。

Chrony 相较于 NTPD 服务的优势

  1. 更快的同步只需要数分钟而非数小时时间,从而最大程度的减少时间和频率误差,这对于并非全天运行的台式计算机或系统而言非常有用。
  2. 能够更好的响应时间频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率反复变化的节能技术而言非常有用。
  3. 在初始同步后,它并不会停止时钟,以防对需要系统时间保持单调的程序造成影响。
  4. 在应对临时非对称延迟时,(例如:大规模下载造成连接饱和时)提供了更好的稳定性。
  5. 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

安装 Chrony

从 Centos 7.x 开始的最小发行版中都已经预装并开启了 Chrony。如果你的系统上没有安装 Chrony,你也可以使用下面的命令轻松安装它。

$ apt -y install chrony    # [On Debian/Ubuntu]
$ yum -y install chrony    # [On CentOS/RHEL]

安装完成后,你可以使用以下命令来检查 chronyd 的状态。

$ systemctl status chronyd     # [On SystemD]
$ /etc/init.d/chronyd status   # [On Init]

如果要在开机引导时自动启用 Chrony 的守护程序,你可以使用以下命令来实现。

$ systemctl enable chrony       # [On SystemD]
$ chkconfig --add chronyd       # [On Init]

配置 Chrony

Chrony 的默认配置文件为 /etc/chrony.conf,下面将介绍一些常用的配置项。

  • server hostname [option]

server 指令用于指定要同步的 NTP 服务器。

server 0.centos.pool.ntp.org iburst

其中的 0.centos.pool.ntp.org 是 NTP 服务器的地址,默认有四组官方的 NTP 服务器。你也可以修改为自定义的时间服务器,例如:ntp1.aliyun.com

iburst 是参数, 一般用此参数即可。该参数的含义是在头四次 NTP 请求以 2s 或者更短的间隔,而不是以 minpoll x 指定的最小间隔,这样的设置可以让 chronyd 启动时快速进行一次同步。

其他的参数有 minpoll x 默认值是 6,代表 64smaxpoll x 默认值是 9,代表 512s

  • driftfile file

Chrony 会根据实际时间计算修正值,并将补偿参数记录在该指令指定的文件里,默认为 driftfile /var/lib/chrony/drift

与 ntpd 或者 ntpdate 最大的区别就是,Chrony 的修正是连续的,通过减慢时钟或者加快时钟的方式连续的修正。而 ntpd 或者 ntpdate 搭配 Crontab 的校时工具是直接调整时间,会出现间断,并且相同时间可能会出现两次。因此,请放弃使用 ntpdntpdate 来校时。

  • makestep threshold limit

此指令使 Chrony 根据需要通过加速或减慢时钟来逐渐校正任何时间偏移。例如:makestep 1.0 3,就表示当头三次校时,如果时间相差 1.0s, 则跳跃式校时。

  • rtcsync

启用内核时间与 RTC 时间同步 (自动写回硬件)。

  • logdir

该参数用于指定 Chrony 日志文件的路径。

  • stratum weight

该参数用于设置当 chronyd 从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下设置为 0,让 chronyd 在选择源时忽略源的层级。

基本上常用的参数就只有这几个了,通常默认的配置文件就可以直接使用了,下面我们来看一个修改完成后的配置文件内容。

server ntp1.aliyun.com iburstserver ntp2.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony

使用 Chrony 客户端程序进行管理

  • 检查 Chrony 是否实际同步

为了检查 Chrony 是否实际同步,我们将使用它的命令行程序 chronyc 来验证。

root@hk:~# chronyc tracking
Reference ID    : C200057B (any.time.nl)
Stratum         : 3
Ref time (UTC)  : Mon Jan 04 00:28:16 2021
System time     : 0.001607892 seconds slow of NTP time
Last offset     : -0.001619716 seconds
RMS offset      : 0.001619716 seconds
Frequency       : 2.047 ppm fast
Residual freq   : +6.159 ppm
Skew            : 1000000.000 ppm
Root delay      : 0.041321401 seconds
Root dispersion : 0.413354427 seconds
Update interval : 2.1 seconds
Leap status     : Normal

这里主要关注 Update interval 这个参数, 说明最后两次更新的时间间隔是 64.1s。以上结果中的其它参数的含义分别是:

  • 引用 ID - 计算机当前同步的引用 ID 和名称。
  • Stratum - 连接参考时钟的计算机的跳数。
  • 参考时间 - 这是参考源的最后一次测量的 UTC 时间。
  • 系统时间 - 来自同步服务器的系统时钟延迟。
  • 最后一次偏移 - 上次时钟更新的估计偏移量。
  • RMS 偏移 - 偏移值的长期平均值。
  • 频率 - 如果 chronyd 没有纠正它,那么系统的时钟错误的速率。它以 ppm (百万分率)提供。
  • 残余频率 - 残余频率表示参考源的测量值与当前使用的频率之间的差异。
  • 偏斜 - 估计频率的误差界限。
  • 根延迟 - 网络路径延迟到计算机正在同步的层计算机的总和。
  • 跳跃状态 - 这是跳跃状态,可以具有以下值之一:正常、插入秒、删除秒或不同步。
  • 显示所有 NTP 源服务器的信息

这里需要注意的是第二个参数,* 代表当前同步的源,- 代表通过组合算法计算后排除的源。

root@hk:~# chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ time.cloudflare.com           3   6    17    20    +11ms[+8954us] +/-   68ms
^- 103.47.76.177                 2   6    17    20    +22ms[  +21ms] +/-  205ms
^* any.time.nl                   2   6    17    19  -6141us[-7761us] +/-   43ms
^+ 139.180.134.39.vultr.com      2   6    17    20  -3115us[-4735us] +/-   47ms
  • 查看 NTP 服务器的在线和离线状态
$ chronyc activity
  • 查看 Chrony 服务的日志
$ journalctl -u chronyd
  • 检查 NTP 访问是否对特定主机可用
$ chronyc accheck
  • 该命令会显示有多少 NTP 源在线/离线
$ chronyc activity
  • 手动添加一台新的 NTP 服务器
$ chronyc add server
  • 在客户端报告已访问到服务器
$ chronyc clients
  • 手动移除 NTP 服务器或对等服务器
$ chronyc delete
  • 手动设置守护进程时间
$ chronyc settime
  • 校准时间服务器,显示系统时间信息
$ chronyc tracking
  • 检查 NTP 访问是否对特定主机可用
$ chronyc accheck
  • 查看时间同步源
$ chronyc sources -v
  • 查看时间同步源状态
$ chronyc sourcestats -v

Chrony 客户端程序的功能非常强大,远不止上面介绍这些。不但支持命令行模式,而且还支持交互模式。如果你想了解更多 Chrony 客户端程序的使用方法,可以使用 man chronyc 命令获取更多帮助。

使用 Chrony 作为 NTP 服务器

要将 Chrony 作为一个 NTP 服务器,方法很简单。

首先,你需要修改 /etc/chrony.conf 文件,并添加以下配置即可。

# 对于安全要求比较高的,这里可以限制谁能访问本机提供的 NTP 服务。allow 192.168.0.0/16
# 设置 chronyd 监听在哪个网络接口bindcmdaddress 0.0.0.0
# 这个地方很重要,如果服务器本身也不能同步时间,那么就用本地时间替代,层级为 10local stratum 10

其次,重启 Chronyd 服务,以加载新的配置。

$ systemctl restart chronyd

Chronyd 服务启动成功后,会监听以下两个端口。

  • 端口 123/udp 为标准的 NTP 监听端口,如果要对外提供 NTP Server 功能,必须开启防火墙和监听地址为外部可访问地址。如需修改,你可以通过配置 port 参数来修改。
  • 端口 323/udp 为默认的管理端口。如需修改,你可以通过配置 cmdport 参数来修改。

最后,修改防火墙设置,以放行对 123/udp 的请求,这里以 Firewalld 为例。

# firewall-cmd --zone=public --add-port=123/udp --permanent
# firewall-cmd --reload

其他:一些设置时区和时间的命令

  • 查看当前系统时区
# 直接使用 timedatectl 命令也等同于以下命令
root@hk:~# timedatectl status
               Local time: Mon 2021-01-04 08:37:55 CST
           Universal time: Mon 2021-01-04 00:37:55 UTC
                 RTC time: Mon 2021-01-04 00:37:56
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no
  1. 设置当前系统时区

如果你当前的时区不正确,请按照以下操作设置。

# 设置系统时区为 Asia/Shanghai
$ timedatectl set-timezone Asia/Shanghai
# 设置完时区后,在强制同步下系统时钟
$ chronyc -a makestep
  • 修改当前日期时间
# 可以只修改其中一个
$ timedatectl set-time "2019-10-31 15:50:00"
  • 设置硬件时间
# 硬件时间默认为 UTC,下面两条命令效果等同
$ timedatectl set-local-rtc 1
$ hwclock --systohc --localtime
  • 启用或者禁止 NTP 时间同步
# yes 或 no,1 或 0 也可以
$ timedatectl set-ntp yes/no
$ timedatectl set-ntp true/flase

关注本站微信公众号(和以上内容无关)InfraPub ,扫码关注:InfraPub

2781 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传