部署场景
在有些机房部署服务器的时候,服务器是处于无网络区域的。此时,每台服务器的时钟并不准确,各自运行时间。
这样的情况会导致服务端或者数据库获取本地时间的时候出错,导致部分工单时间信息有误。这样的后果是比较严重的。
那么如何去解决这个问题呢?
可以部署一台ntp的服务端,然后其他服务器编写shell脚本定时同步即可
实现同步拓扑如下
好了,根据拓扑图,首先需要实现搭设的就是Ntp服务器
了。
安装ntp服务
yum install ntp ntpdate -y
不管是作为ntp服务器还是客户端,只要需要时钟同步,都进行安装。
安装完毕之后,可以查看一下服务的状态:
代码语言:javascript复制
[root@yingyong1 ntp_setup]# service ntpd status
Redirecting to /bin/systemctl status ntpd.service
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@yingyong1 ntp_setup]#
部署Ntp服务器
安装好了ntp服务器之后,那么就开始来配置相关的参数了。
查看当前的时区
使用timedatectl status
,可以查看当前服务器运行的时区。 从下面返回的结果来看,当前的运行时区就是上海时区(Time zone: Asia/Shanghai (CST, 0800)
),这个正确的。
代码语言:javascript复制
[root@yingyong1 ~]# timedatectl status
Local time: Fri 2019-01-04 09:54:06 CST
Universal time: Fri 2019-01-04 01:54:06 UTC
RTC time: Fri 2019-01-04 01:54:06
Time zone: Asia/Shanghai (CST, 0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@yingyong1 ~]#
如果时区不是东八区,那么需要设置为东八区的时间(设置北京、上海、中国香港等时区)
首先查看一下服务器是否有上海时区、中国香港时区,从结果来看是有的。 timedatectl list-timezones | grep Shanghai
代码语言:javascript复制
[root@yingyong1 ~]# timedatectl list-timezones | grep Shanghai
Asia/Shanghai
[root@yingyong1 ~]# timedatectl list-timezones | grep Hong_Kong
Asia/Hong_Kong
[root@yingyong1 ~]#
设置服务器的时区为中国香港时区,如下: timedatectl set-timezone Asia/Hong_Kong
代码语言:javascript复制
[root@yingyong1 ~]# timedatectl set-timezone Asia/Hong_Kong
[root@yingyong1 ~]#
## 查看修改时区后的状态
[root@yingyong1 ~]# timedatectl status
Local time: Fri 2019-01-04 10:07:11 HKT
Universal time: Fri 2019-01-04 02:07:11 UTC
RTC time: Fri 2019-01-04 02:07:11
Time zone: Asia/Hong_Kong (HKT, 0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
## 输入date,查看当前时间
[root@yingyong1 ~]# date
Fri Jan 4 10:08:03 HKT 2019
[root@yingyong1 ~]#
好了,修改了时区之后,就有两个选择要操作,一种是有网络的情况下,设置时钟与网络时钟同步;另一种则是设置不与网络同步。
因为当前的状态是无网络的,那么先来讲述一下如何配置无网络下以自身作为时钟服务。
完全无网络环境ntp服务端配置自身作为时钟服务
配置
/etc/ntp.conf
,配置使用本地时间,不与网络同步。
代码语言:javascript复制
# 使用本地时间
# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
在配置之前,首先备份配置文件。
代码语言:javascript复制
[root@yingyong1 etc]# cp ntp.conf ntp.conf.bak
首先将请求网络时钟服务的部分注释(
/etc/ntp.conf
)
配置使用本地时间,不与网络同步。
代码语言:javascript复制
# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
本地设置时间,并提供ntpd局域网服务
代码语言:javascript复制
## 停止ntpd时钟服务
[root@yingyong1 etc]# service ntpd stop
Redirecting to /bin/systemctl stop ntpd.service
[root@yingyong1 etc]#
## 设置不与网络服务同步
[root@yingyong1 etc]# timedatectl set-ntp no
[root@yingyong1 etc]#
## 手动配置当前时间
[root@yingyong1 etc]# timedatectl set-time "2019-01-04 10:45:10"
[root@yingyong1 etc]#
## 确认看看当前时间
[root@yingyong1 etc]# date
Fri Jan 4 10:45:15 HKT 2019
[root@yingyong1 etc]#
## 开启ntp服务
[root@yingyong1 etc]# service ntpd start
Redirecting to /bin/systemctl start ntpd.service
[root@yingyong1 etc]#
## 查看ntp服务状态
[root@yingyong1 etc]# service ntpd status
Redirecting to /bin/systemctl status ntpd.service
● ntpd.service - Network Time Service
Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2019-01-04 10:46:00 HKT; 3s ago
Process: 25620 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 25621 (ntpd)
Tasks: 1
CGroup: /system.slice/ntpd.service
└─25621 /usr/sbin/ntpd -u ntp:ntp -g
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listen normally on 2 lo 127.0.0.1 UDP 123
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listen normally on 3 bond0 134.****.110 UDP 123
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listen normally on 4 virbr0 192.****.1 UDP 123
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listen normally on 5 lo ::1 UDP 123
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listen normally on 6 bond0 fe80::6e62:4867:5e...123
Jan 04 10:46:00 yingyong1 ntpd[25621]: Listening on routing socket on fd #23 for int...tes
Jan 04 10:46:00 yingyong1 ntpd[25621]: 0.0.0.0 c016 06 restart
Jan 04 10:46:00 yingyong1 ntpd[25621]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Jan 04 10:46:00 yingyong1 ntpd[25621]: 0.0.0.0 c011 01 freq_not_set
Jan 04 10:46:01 yingyong1 ntpd[25621]: 0.0.0.0 c514 04 freq_mode
Hint: Some lines were ellipsized, use -l to show in full.
[root@yingyong1 etc]#
## 查看启动服务后的当前时间
[root@yingyong1 etc]# date
Fri Jan 4 10:46:05 HKT 2019
[root@yingyong1 etc]#
## 配置开机自启动
[root@yingyong1 etc]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
[root@yingyong1 etc]#
好了,到了这一步已经配置搭设好了局域网的ntp时钟服务器了。下一步就是要在客户机配置同步时钟服务。
配置客户机向ntp服务器同步时间
首先每台客户机安装好ntp工具,如下:
yum -y install ntp ntpdate
配置服务器的时区
代码语言:javascript复制
## 查看当前的时间
[root@yingyong2 ~]# date
Fri Jan 4 10:34:40 CST 2019
[root@yingyong2 ~]#
## 查看当前的时区状态
[root@yingyong2 ~]# timedatectl status
Local time: Fri 2019-01-04 10:34:42 CST
Universal time: Fri 2019-01-04 02:34:42 UTC
RTC time: Fri 2019-01-04 02:34:43
Time zone: Asia/Shanghai (CST, 0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@yingyong2 ~]#
## 查看是否存在上海时区
[root@yingyong2 ~]# timedatectl list-timezones | grep Shanghai
Asia/Shanghai
[root@yingyong2 ~]#
## 修改为中国香港时区
[root@yingyong2 ~]# timedatectl set-timezone Asia/Hong_Kong
[root@yingyong2 ~]#
## 查看当前时区状态已经是中国香港时区了,此时可以看到NTP enabled:no(没有与ntp服务同步)
[root@yingyong2 ~]# timedatectl status
Local time: Fri 2019-01-04 10:35:02 HKT
Universal time: Fri 2019-01-04 02:35:02 UTC
RTC time: Fri 2019-01-04 02:35:04
Time zone: Asia/Hong_Kong (HKT, 0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@yingyong2 ~]# date
Fri Jan 4 10:35:06 HKT 2019
[root@yingyong2 ~]#
在配置好了时区之后,只要写个简单的shell脚本就可以与局域网的ntp服务器同步时间了。
编写ntp客户端时钟同步脚本
代码语言:javascript复制
echo "`which ntpdate` ntp服务器IP地址;`which hwclock` -w" > ntpUpdate.sh`
代码语言:javascript复制
[root@yingyong2 sh]# echo "`which ntpdate` 134.78.194.110;`which hwclock` -w" > ntpUpdate.sh
[root@yingyong2 sh]#
[root@yingyong2 sh]# cat ntpUpdate.sh
/usr/sbin/ntpdate 134.78.194.110;/usr/sbin/hwclock -w
[root@yingyong2 sh]#
[root@yingyong2 sh]# chmod x ntpUpdate.sh
[root@yingyong2 sh]#
测试执行一下看看:
代码语言:javascript复制
[root@yingyong2 sh]# date
Fri Jan 4 10:43:41 HKT 2019
[root@yingyong2 sh]#
[root@yingyong2 sh]# ./ntpUpdate.sh
4 Jan 11:02:13 ntpdate[15950]: step time server 134.78.194.110 offset 1100.587184 sec
[root@yingyong2 sh]#
[root@yingyong2 sh]# date
Fri Jan 4 11:02:16 HKT 2019
[root@yingyong2 sh]#
好了,那么下面只要写一个crontab定时执行该脚本即可。
编写定时任务
代码语言:javascript复制
## 创建一个专门存放shell脚本的目录
[root@yingyong2 sh]# mkdir -p /sh
## 将刚才编写同步脚本复制到 /sh 目录
[root@yingyong2 sh]# cp ntpUpdate.sh /sh
[root@yingyong2 sh]# ls /sh/ntpUpdate.sh
/sh/ntpUpdate.sh
## 写入一个定时任务
[root@yingyong2 sh]# echo "1 * * * * /sh/ntpUpdate.sh" >> /var/spool/cron/`whoami`
[root@yingyong2 sh]#
## 查看写入的任务,确保OK
[root@yingyong2 sh]# crontab -l
1 * * * * /sh/ntpUpdate.sh
[root@yingyong2 sh]#
## 测试执行一下定时任务的脚本
[root@yingyong2 sh]# /sh/ntpUpdate.sh
4 Jan 11:11:48 ntpdate[15981]: adjust time server 134.78.194.110 offset -0.002369 sec
[root@yingyong2 sh]# date
Fri Jan 4 11:11:52 HKT 2019
[root@yingyong2 sh]#
到了这里已经完成了无网络局域网ntp时钟服务同步的相关内容了。