ntpd建立本地时间服务器供所有本地linux服务器使用

最近在本地搭建了一套prometheus+grafana的监控系统,因为整个监控系统是基于时序数据(time series data)的,prometheus根据服务器时间统一保存为utc格式,然后grafana显示的时候会根据浏览器时间进行时区转换,所以时间同步就显得尤其重要。这一节我们看看如何将本地一台服务器变为时间同步服务器供本地所有其他设备用来同步时间。

NTP

NTP,Network Time Protocol,1985年创立,一个久经时间考验的时间同步协议。运行了ntp服务的设备既可以作为客户端从ntp服务器同步时间,也可以作为ntp服务器供别的ntp客户端来同步时间。

ntp vs ntpdate

ntp是一个协议,实现了这个协议的服务也叫做ntp。而ntpdate是ntp中带的一个工具(当然也可以单独下载),也可以用来从外部时间服务器同步时间,但是会造成时间的突变,对于线上环境不是一个很理想的方式;ntp则采用平滑的方式,但是缺点就是慢,而且对于超过17分钟的时间间隔会拒绝更新。

值得一提的是,因为ntpdate和ntp服务都使用udp123端口,同一时间只能有一个在跑。

所以通常的做法是开机的时候使用ntpdate进行一次时间校准,之后使用ntpd服务进行持续的对齐。当然也可以使用crontab每分钟进行一次ntpdate操作也是没问题的。

操作环境

  • CentOS Linux release 7.9.2009 (Core)

  • 本地时间同步服务器 - 172.16.141.22

  • 本地服务器 - 172.16.141.20,172.16.141.21

时间同步服务器

下面首先配置下本地的时间同步服务器。

安装ntp

直接yum安装即可,yum -y install ntp。ntp只有一个配置文件,安装完默认在/etc/ntp.conf,下面会详细说说配置文件的配置项。安装完之后默认会注册一个服务ntpd,下面将这个服务启动设置为开机自启动

systemctl enable ntpd
systemctl start ntpd

验证服务

查看udp的监听服务

[root@agent node_exporter]# netstat -nulp | grep ntpd
udp        0      0 172.17.0.1:123          0.0.0.0:*                           38646/ntpd
udp        0      0 172.16.141.22:123       0.0.0.0:*                           38646/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           38646/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           38646/ntpd
udp6       0      0 fe80::5e25:a384:b8c:123 :::*                                38646/ntpd
udp6       0      0 fe80::42:aff:fef3:f:123 :::*                                38646/ntpd
udp6       0      0 ::1:123                 :::*                                38646/ntpd
udp6       0      0 :::123                  :::*                                38646/ntpd

可以看到ntpd这个服务监听了所有网卡的udp123端口,这个端口会用来和远程时间服务器同步,也可以用来接收别的设备的同步请求。

配置文件

下面详细看看配置文件

less /etc/ntp.conf

有两个地方要注意的。一个是restrict语句部分,格式为restrict ip parameters,不带任何参数表示允许该ip修改和查询时间

restrict 127.0.0.1
restrict ::1

具体的参数不需要记,只需要修改下面这个地方,将允许从这台服务器同步时间的网段填进去即可

restrict 172.16.141.0 mask 255.255.255.0 nomodify notrap

这里就把另外两台的网段配置了进去。

还有一个是server语法部分,表示从哪个地址来同步本机的时间,通常用默认的地址就行

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 cn.pool.ntp.org prefer

这里的prefer表示优先选择,如果不可用再尝试其他server。

其余的配置项暂时不用管,感兴趣的可以在网上搜索各个配置项的解释。然后重启ntpd服务即可

systemctl restart ntpd

上面修改好了配置文件,并且也启动了ntpd服务,但是前面说过因为ntp是采用滑动窗口的方式去校准,最好是先通过ntpdate将时间做一次突变校准,然后再利用ntp来持续保持同步。并且时间间隔超过17分钟的话会同步失败,所以建议先进行强制同步一次

# 停掉ntpd服务,避免占用端口
[root@agent node_exporter]# systemctl stop ntpd
# 同步时间
[root@agent node_exporter]# ntpdate 0.centos.pool.ntp.org
25 Feb 14:44:12 ntpdate[39032]: step time server 84.16.73.33 offset 79.765356 sec
# 启动ntpd服务,既向远端服务器同步时间,又能接受配置文件中允许的网段服务器的时间同步请求
[root@agent node_exporter]# systemctl start ntpd

常用命令

下面两个命令可以用来检测ntpd服务的运行状态

[root@agent node_exporter]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
   time correct to within 63 ms
   polling server every 128 s

这里如果是显示synchronised表示已经同步上了。

[root@agent node_exporter]# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*203.107.6.88    100.107.25.114   2 u   80  128  377   30.547   -5.564   6.484
+193.182.111.141 192.36.143.130   2 u   72  128  365  379.450    7.514  21.465
 108.59.2.24     .INIT.          16 u    - 1024    0    0.000    0.000   0.000
+119.28.206.193  100.122.36.196   2 u   70  128  377   91.173  -31.012   6.692

星号开头的表示当前已经同步上的服务器。

[root@agent node_exporter]# date
2021年 02月 25日 星期四 15:20:13 CST

date是linux自带的命令,用来查当前时间的,也顺便放在这了。

持续同步

本地的时间同步服务器弄好了,接下来配置其余的机器从这台机器同步时间,有下面两种方式

ntp方式

跟上面的方式一样,只不过在配置文件里面需要配置本地的时间服务器为目标服务器即可

server 172.16.141.22

同样在使用ntpdate命令进行同步的时候也可以使用本地的服务器

ntpdate 172.16.141.22

crontab方式

还有一种方式,就是利用crontab每分钟利用ntpdate命令去做一次同步。

经过实际测试,直接编辑/etc/crontab文件并不会crontab生效,需要利用crontab -e命令。敲完crontab -e之后填入如下内容

*  *  *  *  * /sbin/ntpdate 172.16.141.22

直接生效

[root@grafana fuhanxiao]# crontab -l
*  *  *  *  * /sbin/ntpdate 172.16.141.22

可以通过crontab的日志查看时间同步状态

[root@grafana fuhanxiao]# tail -n 10 /var/log/cron
Feb 25 15:37:01 grafana CROND[12405]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:38:01 grafana CROND[12411]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:39:01 grafana CROND[12417]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:40:01 grafana CROND[12423]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:41:01 grafana CROND[12429]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:42:02 grafana CROND[12435]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:43:01 grafana CROND[12442]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:44:01 grafana CROND[12448]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:45:01 grafana CROND[12454]: (root) CMD (/sbin/ntpdate 172.16.141.22)
Feb 25 15:46:01 grafana CROND[12460]: (root) CMD (/sbin/ntpdate 172.16.141.22)

可以看到每分钟都成功进行了一次同步

其他

说个和操作本身无关的东西。

我是在Mac上通过vmware fusion开了几台虚拟机搭建的环境,比较头疼的是,每次锁屏一段时间之后本地时间服务器的时间就和mac上的不一样了,然后就需要用ntpdate重新来一遍同步。在寻找解决方法的时候发现虚拟机的设置中有一项是「同步时间」,给出的解释是「将虚拟机的时间与Mac当前显示的时间同步」,但是我勾选了还是没有解决问题,或许这个选项和ntp服务有冲突。但是因为只是测试环境,如果是线上环境建议将ntpdate命令加入rc.local或者/etc/profile,就不用有这种担忧了。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值