centeros8的时间同步chrony

为什么要做时间同步?

分布式服务在调用本地时间做数据处理时时间问题显得尤为重要

centeros8 中使用chrony

CentOS8上使用Chrony配置NTP服务器,用于同步时间。 它有两个程序,chrony和chronyd, chronyd是守护进程 ,chrony是一个命令行界面程序,可以用来监控chronyd的性能,并修改各种操作参数。

系统会默认安装并启动,如果系统不存在则需要安装此工具库。

1
dnf -y install chrony

关于配置项的描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 使用pool.ntp.org项目中的公共服务器。
# 请考虑加入该池(http://www.pool.ntp.org/join.html)。
pool ntp.aliyun.com iburst

# 记录系统时钟获取/失去时间的速率。
driftfile /var/lib/chrony/drift

# 如果系统时钟的偏差大于1秒,则允许在前三次更新中进行 步进调整。
makestep 1.0 3

# 启用内核对实时时钟(RTC)的同步。
rtcsync

# 启用所有支持硬件时间戳的接口。
#hwtimestamp *

# 增加调整系统时钟所需最小可选源的数量。
#minsources 2

# 允许来自本地网络的NTP客户端访问。
#allow 0.0.0.0/0

# 即使未与时间源同步,也提供时间服务。
#local stratum 10

# 指定包含 NTP 认证密钥的文件。
# keyfile /etc/chrony.keys

# 从系统 tz 数据库获取 TAI-UTC 偏移量和闰秒。
leapsectz right/UTC

# 指定日志文件的目录。
logdir /var/log/chrony

# 选择要记录哪些信息。
#log measurements statistics tracking

服务端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
server ntp.aliyun.com iburst


# 如果时间差超过0.1秒,就在前三次的时钟更新时,启动大步跨方式
## chronyd根据需求减慢或加速时间调整,
## 在某些情况下系统时钟可能漂移过快,导致时间调整用时过长。
## 该指令强制chronyd调整时期,大于某个阀值时步进调整系统时钟。
## 只有在因chronyd启动时间超过指定的限制时(可使用负值来禁用限制)没有更多时钟更新时才生效。
makestep 0.1 3


# 允许哪些网段的客户端访问
allow 0.0.0.0/0

# 允许访问哪些时间服务器
## all表示允许本机访问所有时间服务器
allow all

# 服务器绑定ip和端口
bindaddress 0.0.0.0


local stratum 10

客户端配置

1
2
3
4
allow all
server 192.168.30.11 iburst
makestep 0.1 3

一些常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    查看时间同步源:
  $ chronyc sources -v
  立即手工同步
  $chronyc -a makestep
  查看时间同步源状态:
  $ chronyc sourcestats -v
  设置硬件时间
  硬件时间默认为UTC:
  $ timedatectl set-local-rtc 1
    查看时间配置信息
    timedatectl
  启用NTP时间同步:
  $ timedatectl set-ntp yes
  校准时间服务器:
  $ chronyc tracking
    #实时打印当前时间
    
  最后需要注意的是,配置完/etc/chrony.conf后,需重启chrony服务,否则可能会不生效。
    使用systemctl start chronyd.service  启动chrony服务
    使用systemctl enable chronyd.service  设置开机同步时间
    使用systemctl status chronyd.service  查看服务状态

一个未验证过的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# 配置chrony 作为时间同步的 服务端 和 客户端。

# 服务端IP(内网)地址。
server_ip="192.168.30.11"
# 服务端允许哪个IP段访问。
server_allow_ip="192.168.30.0/24"
# 服务端使用的时间源。
server_source="pool ntp.aliyun.com iburst"

# 服务端配置
ntp_server_conf() {
sed -i 's/^pool/#pool/' /etc/chrony.conf
sed -i 's/^server/#server/' /etc/chrony.conf
echo -e "${1}\nallow ${2}\nlocal stratum 10" >> /etc/chrony.conf
systemctl restart chronyd
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.30.0/24" port port="123" protocol="udp" accept"
firewall-cmd --reload
}

# 客户端配置
ntp_client_conf() {
sed -i 's/^pool/#pool/' /etc/chrony.conf
sed -i 's/^server/#server/' /etc/chrony.conf
echo "server $1 iburst" >> /etc/chrony.conf
systemctl restart chronyd
}

# 判断运行该脚本的是服务端还是客户端。
ip addr | grep "$server_ip" &> /dev/null
if [ "$?" -eq 0 ];then
ntp_server_conf "${server_source}" "${server_allow_ip}"
else
ntp_client_conf "${server_ip}"
fi