在生产环境经常会因为时间的问题出现很多问题,有个客户机内网DCS时间比正常时间慢了两分钟,数据到了SIS也是慢了两分钟,然而SIS本身的服务器时间也是慢了1分钟,业务能够正常使用,所以客户也是漠不关心,但是我们部署的系统数据采集需要实时数据,就只能自己修正时间。

1.时间同步的重要

多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等, 利用NTP(NetworTime Protocol) 协议使网络中的各个计算机时间达到同步。目前NTP协议属于运维基础架构中必备的基本服务之一

在现在不管是公有云、私有云还是混合云等在建设过程中,都首先需要群集中的每台服务器时间调节一致,这就需要使用一台服务器作为时间服务器来维护时间。chrony就是现在群集的选择方案之一!

2.Chrony和NTP

2.1 NTP

NTP将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大多数的地方精度可以达到1-50ms,项目官网:http://www.ntp.org

2.2 Chrony

Chrony实现NTP协议的的自由软件。可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表和键盘的手动输入进行同步。还可以作为NTPv4(RFC 5905)服务器和对等体运行,为网络中的计算机提供时间服务。设计用于在各种条件下良好运行,包括间歇性和高度拥挤的网络连接,温度变化(计算机时钟对温度敏感),以及不能连续运行或在虚拟机上运行的系统。通Internet同步的两台机器之间的典型精度在几毫秒之内,在LAN上,精度通常为几十微秒。利用硬件时间戳或硬件参考时钟,可实现亚微秒的精度chrony

3.Chrony简介

chrony是一款开源的软件,它能帮助你保持系统时钟与时钟服务器(NTP)同步,因此让你的时间保持精确。它由两个程序组成,分别是chronyd和chronyc。chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

3.1 Chrony 的优势

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

3.2 Chrony程序

3.2.1 主要程序

chrony两个主要程序chronyd和chronyc

  • chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿
  • chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可在一台不同的远程计算机上工作

3.2.2 服务unit 文件

/usr/lib/systemd/system/chronyd.service

3.2.3 监听端口

323/udp,123/udp

3.2.4 配置文件

  /etc/chrony.conf

  • server
    可用于时钟服务器,iburst 选项当服务器可达时,发送一个八个数据包而不是通常的一个数据包。 包间隔通常为2秒,可加快初始同步速度,这个可以添加外网服务器或者内网服务器,域名或者IP都可以。

  • driftfile
    根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟作出补偿

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

  • rtcsync
    启用内核模式,系统时间每11分钟会拷贝到实时时钟(RTC)

  • allow / deny
    指定一台主机、子网,或者网络以允许或拒绝访问本服务器

  • cmdallow / cmddeny
    可以指定哪台主机可以通过chronyd使用控制命令

  • bindcmdaddress
    允许chronyd监听哪个接口来接收由chronyc执行的命令

  • makestep
    通常chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时调整系统时钟

  • local stratum 10
    即使server指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其它客户端chronyc命令

3.2.5 chronyc命令

help                命令可以查看更多chronyc的交互命令
accheck             检查是否对特定主机可访问当前服务器
activity            显示有多少NTP源在线/离线
sources [-v]        显示当前时间源的同步信息
sourcestats [-v]    显示当前时间源的同步统计信息
add server          手动添加一台新的NTP服务器
clients             报告已访问本服务器的客户端列表
delete              手动移除NTP服务器或对等服务器
settime             手动设置守护进程时间
sracking            显示系统时间信息

4.部署Chrony

部署的案例采用在搭建openstack的基础环境来同步时间。在controller上作为时间服务器,其他的都从controller上面同步时间。

4.1 controller部署Chrony

在controller控制节点执行以下操作。

4.1.1 安装组件chrony。

yum -y install chrony

4.1.2 设置时区

在所有节点上设置统一的时间区域,本文中将其设置为亚洲时区,用户可自行定义。
timedatectl set-timezone Asia/Shanghai

4.1.3 配置chrony

将控制节点设置为内部NTP Server,编辑“/etc/chrony.conf”文件。

vim /etc/chrony.conf

按下面配置,设置为controller为时间服务器,禁止了外网服务器。

# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server 192.168.10.20 iburst
allow 192.168.10.0/24
local stratum 10

image.png

在openstack中这块是采用主机名来指明服务器,但是我在测试发现有的网络环境主机名始终无法同步,采用IP地址更加可靠。

4.1.4 Firewalld设置

firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload

因NTP使用123/UDP端口协议,所以允许NTP服务即可。但是我一般都会把防火墙和selinux禁止。

4.1.5 启动Chrony

启动chrony服务并将其配置为在系统引导时启动。

systemctl enable chronyd.service
systemctl start chronyd.service

4.1.6 启用NTP同步。

timedatectl set-ntp yes

4.2 在其他安装chrony

4.2.1 安装chrony。

yum -y install chrony

4.2.2 配置chrony

编辑“/etc/chrony.conf”文件,添加“server controller iburst”并且删除或者注释掉其余server的选项。

vim /etc/chrony.conf
server 192.168.10.20 iburst

image.png

4.2.3 启动chrony

服务并将其配置为在系统引导时启动。

systemctl enable chronyd.service
systemctl restart chronyd.service

4.2.4 验证时间同步。

chronyc sources

其他节点显示192.168.10.20为时钟源。

image.png

5.常用时间命令和chrony命令

5.1 配置时区命令

查看当前系统时区:

timedatectl

image.png

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

查看所有可用的时区:

timedatectl list-timezones

筛选式查看在亚洲S开的上海可用时区:

timedatectl list-timezones |  grep  -E "Asia/S.*"

Asia/Sakhalin
Asia/Samarkand
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk

设置当前系统为Asia/Shanghai上海时区:

timedatectl set-timezone Asia/Shanghai

设置完时区后,强制同步下系统时钟:

chronyc -a makestep
200 OK

5.2 chrony命令

查看时间同步源:

chronyc sources -v

image.png

查看时间同步源状态:

chronyc sourcestats -v

image.png

设置硬件时间

硬件时间默认为UTC:

timedatectl set-local-rtc 1

启用NTP时间同步:

timedatectl set-ntp yes

校准时间服务器:

chronyc tracking

image.png

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

只有把抱怨环境的情绪,化为上进的力量,才是成功的保证!