时间同步---chrony

本文介绍了时间同步的重要性,特别是在分布式系统中的角色。文章对比了ntpd和chrony时间服务,重点讲述了chrony的优势,如更快的同步速度、更好的稳定性。还详细展示了在CentOS7.x上安装和配置chrony服务的步骤,包括服务端和客户端的配置,并通过chronyc命令检查时间同步状态,确保集群时间的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间同步—chrony

一.时间服务概述

1>.为什么需要时间服务器

事实上,我们各种电子设备它们都是靠时钟驱动的,在分布式场景当中,更多主机的协作也是靠时钟驱动的。因此,多节点的主机时间必须要一致。

以Linux为例,Linux的时间是系统启动时,内核会从主板的硬件资源读取时间并设置为内核中的时钟。接下来系统时间和硬件的内核时间是各自分开独立运行的。

由于操作系统在运行过程中CPU繁忙等各种原因,久而久之很可能会导致系统时钟不精确的显现,这种不精确反应在同一个集群的多台主机上其实就是集群时间不一致。

我们大家都知道虚拟机并获得的CPU是虚拟机产品虚拟出来的CPU,并不是我们真正物理机上的CPU,因此出现时间误差的概率是相当的大,所以在我们普遍使用云计算的虚拟机上,必须要配置一个时间服务器,否则可能各个虚拟机的时间出现不一致的情况。

2>.ntpd时间服务

以RedHat的Linux发行版为例,早期用来解决时间服务器(CentOS 6.x版本之前)的程序包是ntpd,该程序包既可以用作服务端又可以用作客户端。ntpd是基于NTP(Network Time Protocal)实现时间同步的。

ntdp的实现同步时间的逻辑:
    它的思想是把时间的周期缩短,举个例一个比较极限的例子,假设一台服务器两台服务器时间相差1小时,它的思想就是将自己现有的时间周期缩短,从而间接追上时间服务器的时间。比如时间服务器跑一分钟需要60秒,而ntpd的思想是跑一分钟使用30秒甚至1秒实现跑一分钟的的时间周期,这样随着时间的推移一定会追上服务器时间的。这种方式的确是可以追到服务器时间,但是为了追到服务器时间会付出一定时间的代价,这也是ntpd之所以被淘汰的根本原因。
    生产环境中,你是否也发现了这样的现象呢?明明在部署集群时时间配置是正确的,可能过了2三个月后,你会发现集群中总有那么几台及其出现时间不同步的情况。这里的根本问题在于ntpd在和时间服务器进行时间同步的核心逻辑问题,因此CentOS7.x版本将CentOS6.x版本的ntpd替换为chronyd服务啦。

配置ntpd作为时间服务器案例(博主推荐使用使用chronyd作为服务端,尽管我之前也分效果使用ntpd作为服务端的比较):
    https://www.cnblogs.com/yinzhengjie/p/9480665.

3>.chrony时间服务

chrony是网络时间协议(NTP)的通用实现。它可以将系统时钟与NTP服务器、参考时钟(例如GPS接收器)和使用手表和键盘的手动输入同步。它还可以作为NTPv4(RFC 5905)服务器和对等服务器运行,为网络中的其他计算机提供时间服务。

它被设计成在各种条件下都能很好地运行,包括断续的网络连接、严重拥挤的网络、不断变化的温度(普通的计算机时钟对温度很敏感),以及不连续运行或在虚拟机上运行的系统。

chrony是ntpd的替代方案。在互联网上同步的两台机器之间的典型精度在几毫秒内;在局域网上,精度通常在几十微秒内。使用硬件时间戳或硬件参考时钟,可以达到亚微秒精度。

chrony中包含两个程序,chronyd是一个可以在启动时启动的守护程序,chronyc是一个命令行接口程序,可用于监视chronyd的性能,并在运行时更改各种操作参数。

如果非要把NTP和chrony做一个对比的话,我们就以手动调整手表时间为例,我们假设手表时间和实际服务器时间相差3小时:
    ntpd的解决思路就是飞速的转动秒针,以最快的速度调准时间,可想而是,我们需要非常快的速度转动180圈秒针才能追上时间服务器的时间,真个转动过程是相当费时间的。
    chrony的解决思路就是直接调整时针,可想而知,我们挑拨时针不到一圈就能把问题解决掉了,这就是为什么生产环境中大家使用的时间服务器基本上都是chrony啦。

和ntpd一样,chronyd程序包既可以做服务端也可以做客户端,实际上chrony服务本身是兼容ntpd服务的,我们直到123/UDP是传统的NTP服务所默认监听的端口,而323/UDP是chrony所默认监听的端口。因此我们使用chronyd做服务端后,我们既可以使用ntpd做客户端也可以使用chronyd做客户端。

chrony的官方网站:
    https://chrony.tuxfamily.org/

4>.chrony的优势

chrony是网络时间协议(NTP)的另一种实现,与网络时间协议后台程序(ntpd)不同,它可以更快地且更准确地同步系统时钟,请注意,ntpd仍然包含其中以供需要运行NTP服务的客户使用。

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

二.安装并配置chrony服务

节点说明:

角色主机名ip
时间服务器time-server(node99)172.16.1.99
客户机node01172.16.0.21
客户机node02172.16.0.21
客户机node03172.16.0.21

1>安装chrony (服务端,客户端如果没有也需要安装)

[root@time-server ~]# yum install -y chrony

2>.查看chrony是否已经安装

[root@time-server ~]# yum info chrony
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name        : chrony
Arch        : x86_64
Version     : 3.4
Release     : 1.el7
Size        : 491 k
Repo        : installed     # 表示安装成功
From repo   : local_yum
Summary     : An NTP client/server
URL         : https://chrony.tuxfamily.org
License     : GPLv2

3>.查看chrony服务安装的文件

[root@time-server ~]# rpm -ql chrony
/etc/NetworkManager/dispatcher.d/20-chrony
/etc/chrony.conf        # 主配置文件
/etc/chrony.keys
/etc/dhcp/dhclient.d/chrony.sh
/etc/logrotate.d/chrony
/etc/sysconfig/chronyd
/usr/bin/chronyc        
#chronyc是一个命令行交互式接口程序,可用于监视chronyd的性能,并在运行时更改各种操作参数
/usr/lib/systemd/ntp-units.d/50-chronyd.list
/usr/lib/systemd/system/chrony-dnssrv@.service
/usr/lib/systemd/system/chrony-dnssrv@.timer
/usr/lib/systemd/system/chrony-wait.service
/usr/lib/systemd/system/chronyd.service     
#CentOS 7.x版本对应的unit file
/usr/libexec/chrony-helper
/usr/sbin/chronyd       
#chronyd是一个可以在启动时启动的守护程序,它既可以充当服务端进程也可以充当服务端进程
/usr/share/doc/chrony-3.4
/usr/share/doc/chrony-3.4/COPYING
/usr/share/doc/chrony-3.4/FAQ
/usr/share/doc/chrony-3.4/NEWS
/usr/share/doc/chrony-3.4/README
/usr/share/man/man1/chronyc.1.gz
/usr/share/man/man5/chrony.conf.5.gz
/usr/share/man/man8/chronyd.8.gz
/var/lib/chrony
/var/lib/chrony/drift
/var/lib/chrony/rtc
/var/log/chrony

4>.查看chrony的帮助手册


[root@time-server ~]# man chrony.conf          #查看chrony的配置文件帮助信息

[root@time-server ~]# man chronyd            #查看chrony的守护进程帮助信息

5>.服务端的配置文件(标记为粉红色字体需要注意,其它使用默认参数即可,对其它字段感兴趣的小伙伴可以参考上面的帮助信息哟)

[root@time-server ~]# cat /etc/chrony.conf 
#指定当前节点为服务器时间,生产环境中建议大家指定多个事件服务器哟,起到对时间服务器备份的效果
server node99.up.com iburst iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

#指定允许的客户端网段来当前时间服务器节点同步时间,我们可以使用deny all拒绝所有客户端。
allow 172.16.0.0/16

#注意,如果主机位是0的话可以简写,比如下面的地址可以简写为"127/8",不过建议大家还是写完整,可读性更强。
allow 127.0.0.0/8

#如果上面使用server字段配置的时间服务器同步时间失败,默认情况下当前时间服务器是不会向客户端同步时间的,
#这是因为担心当前节点的时间不准确(因为当前节点没有和定义中的server时间服务器进行同步),如果我们想要在
#server指定的时间服务器同步失败的情况下依旧返回当前时间服务器的时间给客户端,需要开启该参数,这一项参
#数配置在生产环境中还是相当危险的,因此建议大家在server字段中指定互联网的网络时间,否则可能会出现整个
#集群时间都错的的一致!
local stratum 10

# Specify file containing keys for NTP authentication.
#keyfile /etc/chrony.keys

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking
[root@time-server ~]#  systemctl start chronyd
[root@time-server ~]#  systemctl enable chronyd
[root@time-server ~]#  systemctl list-unit-files | grep chronyd
chronyd.service                               enabled 
[root@time-server ~]#  systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-07-16 11:20:22 CST; 41min ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 2860 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 2856 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2858 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─2858 /usr/sbin/chronyd

Jul 16 11:20:22 node99 systemd[1]: Starting NTP client/server...
Jul 16 11:20:22 node99 chronyd[2858]: chronyd version 3.4 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
Jul 16 11:20:22 node99 chronyd[2858]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift
Jul 16 11:20:22 node99 systemd[1]: Started NTP client/server.
Jul 16 11:20:26 node99 chronyd[2858]: Selected source 172.16.1.99


6>.客户端配置(标记为粉红色字体需要注意,其它使用默认参数即可,对其它字段感兴趣的小伙伴可以参考上面的帮助信息哟)

[root@node* ~]# egrep -v "^#|^$" /etc/chrony.conf
server master.up.com iburst         <----客户端只需要改这行
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 172.16.0.0/16
allow 127.0.0.0/8
local stratum 10
logdir /var/log/chrony

7>.客户端 将chrony服务设置开机自启动

[root@node*~]# systemctl start chronyd
[root@node* ~]# systemctl enable chronyd

8>.查看chrony服务的监听端口

[root@time-server ~]# ss -untlp
Netid State      Recv-Q Send-Q             Local Address:Port                            Peer Address:Port              
udp   UNCONN     0      0                              *:60386                                      *:*                   users:(("dhcpd",pid=932,fd=20))
udp   UNCONN     0      0                              *:67                                         *:*                   users:(("dhcpd",pid=932,fd=7))
udp   UNCONN     0      0                              *:69                                         *:*                   users:(("xinetd",pid=907,fd=5))
udp   UNCONN     0      0                              *:123                                        *:*                   users:(("chronyd",pid=2280,fd=7))
udp   UNCONN     0      0                      127.0.0.1:323                                        *:*                   users:(("chronyd",pid=2280,fd=5))
udp   UNCONN     0      0                             :::47179                                     :::*                   users:(("dhcpd",pid=932,fd=21))
udp   UNCONN     0      0                            ::1:323                                       :::*                   users:(("chronyd",pid=2280,fd=6))
tcp   LISTEN     0      128                            *:80                                         *:*                   users:(("nginx",pid=986,fd=6),("nginx",pid=983,fd=6))
tcp   LISTEN     0      128                            *:22                                         *:*                   users:(("sshd",pid=906,fd=3))
tcp   LISTEN     0      32                            :::21                                        :::*                   users:(("vsftpd",pid=910,fd=3))
tcp   LISTEN     0      128                           :::22                                        :::*                   users:(("sshd",pid=906,fd=4))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvhTjY1v-1621582438918)(en-resource://database/2140:1)]

三。查看服务器和客户端时间是否同步完成

1>.以交互式方式(支持命令不全)查看时间同步资源

[root@time-server ~]# chronyc
chrony version 3.4
Copyright (C) 1997-2003, 2007, 2009-2018 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> sources
210 Number of sources = 0
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* node99.up.com                10   6   377    10     -1ns[-2550ns] +/- 5262ns
chronyc> 

(我操作试验的时候这里没有显示,客户端也同步成功了.后来查明原因,是我的主机名为node99,我把hosts域名写成master.up.com)

2>.以交互式方式(支持命令补全)查看时间同步正常是否正常

[root@node02 ~]# chronyc
chrony version 3.2
Copyright (C) 1997-2003, 2007, 2009-2017 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> sourcesstats
Unrecognized command
chronyc> sourcestats
210 Number of sources = 2
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
(time-server)node99                     12   6   587     +0.000      0.183     +1ns    32us

3>.以非交互式方式(注意,不支持命令补全哟)查看时间同步资源详细信息

[root@node03 ~]# chronyc sources -v
210 Number of sources = 1

  .-- 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               
===============================================================================
^* node99                       10   6   377    76   +673ns[+1129ns] +/-  150us

4>.通过chronyc交互式接口配置chrony访问可参考帮助信息(不推荐使用,建议直接修改"/etc/chrony.conf"配置文件)

[root@time-server ~]#  chronyc
chrony version 3.4
Copyright (C) 1997-2003, 2007, 2009-2018 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> help

批量查看时间同步状态

ansible mysql -i hosts -m shell -a "chronyc sources -v | grep '\^\*'"
Chrony是一个网络时间协议(NTP)的实现,它可以帮助您的计算机与标准时间保持同步。以下是使用Chrony的基本步骤: 1. **安装Chrony**:您需要确认您的系统是否已经安装了Chrony。可以通过运行`rpm -qa | grep chrony`来检查。如果尚未安装,可以使用`yum install chrony`命令进行安装。 2. **配置Chrony**:Chrony的配置文件位于`/etc/chrony.conf`。您可以编辑此文件以指定您希望与之同步的时间服务器。配置文件中的指令和选项可以让您微调同步行为。 3. **启动Chrony服务**:安装并配置完成后,您可以启动Chrony守护进程`chronyd`,它将负责维护系统时间的准确性。通常,Chrony会在系统启动时自动运行。 4. **使用Chronyc进行监控和调整**:`chronyc`是Chrony的命令行界面,它允许您查看当前的时间同步状态,并对Chrony进行配置和调整。 5. **安全性考虑**:如果您打算将Chrony配置为NTP服务器,以便其他计算机可以从您的服务器同步时间,确保考虑到安全性。例如,可能需要在防火墙中打开323/UDP端口以允许时间同步请求。 此外,在使用Chrony时,您可以参考以下问题: - Chrony与旧版ntpd相比有哪些优势? - 如何配置多个时间以提高时间同步的可靠性? - 如何在局域网内使用Chrony进行时间同步? 请注意,Chrony的配置和使用可能会根据您的具体需求和操作系统版本有所不同。建议您查阅官方文档或相关教程以获取更详细的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值