配置 ntp 服务来达成集群内时间同步

NTP

NTP (Network Time Protocol),是一个用于同步各个节点上时间的协议。随着互联网的发展和数据量的增大,网络上节点越来越多,由于各种各样的原因,时间并不是一致的,有的时区不同,有的快,有的慢。这种不一致一方面给人分析日志带来了麻烦,另一方面,很多集群应用都依赖于节点间的时间同步,如Hadoop等等。这就要求采取一些措施来保持各个节点间的时间一致。

此外,调整时间幅度过大也会带来一些问题,如服务器认为收到了“未来”的包,处于安全等考虑会选择丢弃。NTP协议中时间的同步是平滑的,即慢慢微调直至时间的最终同步。

需要说明的是,网络环境很复杂,多么先进的时间同步协议也无法在理论上保证每个节点上的时间是严格一致的,只能说,差值越小越好。

调整时区

由于服务器系统安装时间不同,所在区域不同等各种因素,很多节点上时区设置不同,尽管在对于程序而来问题不大,但是对于人来说可读性不高,所以尽量是把集群内的所有节点设置成一样的时区。

1
2
3
4
5
# 删除当前本地时区软链接
rm /etc/localtime

# 设置当前本地时区为 Asia/Shanghai
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

部署 ntp 服务端

首先同步一次 ntp 服务端节点的时间,避免跟真实时间相差太多

1
date -s "$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

1
2
# 安装 ntp 相关服务
yum install ntp ntpdate -y

因为 ntp 流量较大,目前国内的可靠 ntp 服务器较少,而且实际上我们并不是要将时间跟真实时间同步,最大的目的还是为了保持各个节点间时间的一致性,所以修改配置文件,优先取本地时间。

1
2
# 删除原配置文件中 ntp 服务器(可选)
sed -i '/iburst/d' /etc/ntp.conf
1
2
3
4
5
# 在末尾添加本地时间配置
bash -c "cat >> /etc/ntp.conf <<EOF
server 127.0.0.1 # local clock
fudge 127.0.0.1 stratum 10
EOF"
1
2
3
4
5
# 开启启动 ntp 服务
systemctl enable ntpd

# 启动 ntp 服务
systemctl restart ntpd

可以使用 ntpstat 命令来查看当前的同步状态。

部署 ntp 客户端

假设 ntp 服务端节点的 IP 是 192.168.1.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装 ntp 相关服务
yum install ntp ntpdate -y

# 删除原配置文件中 ntp 服务器(可选)
sed -i '/iburst/d' /etc/ntp.conf

# 配置 192.168.1.1 为优先 ntp 上游服务器,并允许它修改本地时间
bash -c "cat >> /etc/ntp.conf <<EOF
server 192.168.1.1 prefer
restrict 192.168.1.1 nomodify notrap noquery
EOF"

# 开启启动 ntp 服务
systemctl enable ntpd

# 启动 ntp 服务
systemctl restart ntpd

可以使用 ntpstat 命令来查看当前的同步状态。

参考

CentOS7搭建NTP服务器及客户端同步时间

linux ntp 时间服务器及客户端安装配置