一、NTP 是什么?
  NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步网络设备【如计算机、手机】之间的系统时钟。
 
二、NTP 实现什么目的?
  目的很简单,就是为了提供准确时间,保障业务系统间的时间的一致性。因为我们的手表、手机、电脑等电子设备,经常会跑着跑着时间就出现了误差,或快或慢的少几秒,时间长了甚至误差过分钟。这对系统数据的准确性、有效性非常重要,同时对于后期运维工作也起着举足轻重的作用。

三、NTP服务的部署

NTP服务是采用 Server/Client 的模式进行时间的同步,也就是说需要区分为NTP服务端和NTP客户端。另外,默认情况下所有需要进行时间同步的服务器,都要求安装NTP服务。其中需要一台作为内部NTP服务端,其它的作为NTP客户端。

如果客户端不安装NTP,就只能通过ntpdate来手工同步时间,而使用ntpdate,大部分时候搭配crond定时任务来进行校时。
使用ntpd服务,要好于ntpdate加cron的组合。因为,ntpdate同步时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响。比 如sleep,timer等。而且,ntpd服务可以在修正时间的同时,修正cpu tick。理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。
要注意的是,ntpd 有一个自我保护设置: 如果本机与上源时间相差太大, ntpd 不运行. 所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务 运行后, 先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间, 随着误差减小, 逐步增加同步的间隔. 每次跳动, 都会重复这个调整的过程.

在安装NTP服务前,我们需要检查当前系统是否有启动NTP服务

[root@localhost ~]# ps -ef | grep ntpd
 root     21284 17818  0 15:30 pts/0    00:00:00 grep --color=auto ntpd#查看是否安装了ntp服务
 [root@localhost ~]# rpm -qa | grep ntp
 ntpdate-4.2.6p5-25.el7.centos.2.x86_64#如果安装了ntp,则会显示如下:
 [root@localhost etc]# rpm -qa | grep ntp
 ntp-4.2.6p5-28.el7.centos.x86_64
 ntpdate-4.2.6p5-28.el7.centos.x86_64

一般情况下,NTP服务包括三个rpm包:
1: autogen-libopts-5.18-5.el7.x86_64.rpm
2: ntpdate-4.2.6p5-28.el7.centos.x86_64.rpm
3: ntp-4.2.6p5-28.el7.centos.x86_64.rpm
注:版本号会根据源服务端包的实际版本变化,以服务端版本为准。

在开始安装NTP服务前,建议最好先查看下本机系统的时区信息,并且保证所有关联的设备时区信息保持一致。
在Centos7下使用timedatectl命令可以查询和更改系统时钟和设置,你可以使用此命令来设置或更改当前的日期,时间和时区,或实现与远程NTP服务器的自动系统时钟同步。具体的可查阅timedatectl文档。

#查看当前系统时区及其它关联信息
[root@localhost ~]# timedatectl status
       Local time: 二 2019-01-22 17:11:33 CST
   Universal time: 二 2019-01-22 09:11:33 UTC
         RTC time: 二 2019-01-22 09:11:33
        Time zone: Asia/Shanghai (CST, +0800)
      NTP enabled: yes/no
 NTP synchronized: yes/no
  RTC in local TZ: no
       DST active: n/a

其中Time zone即为时区数据。

NTP服务的安装其实非常简单,使用yum指令进行安装即可。

#通过yum安装NTP服务
 [root@localhost ~]# yum install -y ntp

在配置及启动服务前,建议先对本机进行校时。这里采用的是阿里的NTP服务器,毕竟阿里的还是比较稳定。

[root@localhost ~]# ntpdate ntp1.aliyun.com
 22 Jan 16:38:28 ntpdate[2938]: adjust time server 120.25.115.20 offset 0.243404 sec

内部网络在没有时同设备的情况下,需要指定一台NTP服务器与外网授时中心连接,进行时间同步。其它NTP客户端将服务端指向到这台内部NTP服务进行时间同步。

四、内部NTP服务端的配置
NTP安装完成后,首先需要查看NTP安装在哪里。根据查询,大部分时候,NTP都默认安装在/etc目录下。

[root@localhost ~]# whereis ntp
 ntp: /etc/ntp /etc/ntp.conf

NTP的配置文件默认是ntp.conf,文件存储目录在/etc目录下,没有在/etc/ntp目录里。
该配置文件主要需要注意的是两个参数:restrict 和server
restrict 主要用于配置访问权限,即哪些IP可以访问本机NTP服务,server主要用于配置本机访问的上层NTP服务器IP。
1)访问权限配置

权限的设定主要以 restrict 这个参数来设定,主要的语法为:

# restrict IP mask netmask_IP parameter
     # 其中 IP 可以是软件地址,也可以是 default ,default 就类似 0.0.0.0
     # 至于 paramter 则有:
     # ignore :关闭所有的 NTP 联机服务
     # nomodify:表示 Client 端不能更改 Server 端的时间参数,不过,
     # Client 端仍然可以透过 Server 端来进行网络校时。
     # notrust :该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域
     # noquery :不提供 Client 端的时间查询
     # notrap :不提供trap这个远程事件登入
     # 如果 paramter 完全没有设定,那就表示该 IP (或网域)“没有任何限制”    restrict default nomodify notrap noquery # 关闭所有的 NTP 要求封包
     restrict 127.0.0.1 #这是允许本级查询
     restrict 192.168.0.1 mask 255.255.255.0 nomodify
     #在192.168.0.1/24网段内的服务器就可以通过这台NTP Server进行时间同步了

2)上层NTP服务配置

要设定上层NTP服务器主要以 server 这个参数来设定,语法为:

# server [IP|HOST Name] [prefer]
     # server 参数后面的 perfer,表示主要以该IP来作为时间校正。
     # 为了解决更新时间封包的传送延迟动作,可以使用 driftfile 来定义当前NTP服务主机在与外部NTP服务校时所花费的时间
     # 而与外部通信的信息记录在 driftfile 后面接的文件内
     # 例如下面的范例中,内部NTP服务与外部NTP服务联机时所花费的时间会记录在 /etc/ntp/drift文件内
     server ntp1.aliyun.com
     server ntp2.aliyun.com
     server cn.pool.ntp.org preferdriftfile /etc/ntp/drift

   末尾参数说明:

   perfer:表示优先级最高,主要以该IP来作为时间校正。
   burst :当一个运程NTP服务器可用时,向它发送一系列的并发包进行检测。
   iburst :当一个运程NTP服务器不可用时,向它发送一系列的并发包进行检测。

其他设置值,以系统默认值即可。

五、NTP客户端的配置

首先确定客户端已经正确安装NTP服务(如上第三节 NTP服务的部署)。

然后,我们开始对客户端进行配置。客户端的配置很简单,也是对/etc/ntp.conf文件进行编辑,主要修改server参数,将server指定为内部NTP服务端的IP即可。

如果在同步时,提示异常,可先检查服务端防火墙是否开放了相应端口。

[root@localhost ~]# ntpdate 192.168.61.188
 23 Jan 15:16:31 ntpdate[16810]: no server suitable for synchronization found

六、NTP基本操作指令

#启动NTP服务
 systemctl start ntpd
 #开机自启
 [root@localhost ~]# systemctl enable ntpd
 Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.#查看NTP服务是否已正常占用指定端口
 netstat -ln|grep 123#验证NTP同步上层NTP服务状态
 ntpq –p

特别提醒:在启动NTP服务前,先对提供服务的这台主机手动的校正一次时间。如前所述,如果NTP发现时间差不多,不会更新本地时间,可能导致时间有误差,对于时间一致要求非常高的应用场景非常不利。

如何确认我们的NTP服务器已经更新了自己的时间呢?

#没有启动NTP或NTP配置异常时   
 [root@localhost ~]# ntpstat
 Unable to talk to NTP daemon. Is it running?#使用ntpstat来查看同步状态
 [root@localhost etc]# ntpstat
 synchronised to NTP server (120.25.115.20) at stratum 3
    time correct to within 37 ms
    polling server every 256 s[root@localhost ~]# timedatectl status
       Local time: 二 2019-01-22 17:11:33 CST
   Universal time: 二 2019-01-22 09:11:33 UTC
         RTC time: 二 2019-01-22 09:11:33
        Time zone: Asia/Shanghai (CST, +0800)
      NTP enabled: yes/no
 NTP synchronized: yes/no
  RTC in local TZ: no
       DST active: n/a

查看系统时间状态时,其中NTP enabled参数的控制指令为:

timedatectl set-ntp yes/no

在没开启NTP enabled情况下,NTP synchronized参数一般为no,表示还没有进行过时间同步,在时间同步后会由no变为yes。当然,如果使用过ntpdate手工同步过,该参数也会是yes状态。

#如果时区不对,还需要使用timedatectl设置时区
timedatectl set-timezone Asia/Shanghai

 七、常用外部NTP服务地址

cn.pool.ntp.org
 cn.ntp.org.cn   //IP:110.75.186.249
 pool.ntp.org    //IP:110.75.190.198
 ntp.sjtu.edu.cn //IP:202.120.2.101
 来自阿里云的 NTP 服务器:
     ntp1.aliyun.com
     ntp2.aliyun.com
     ntp3.aliyun.com
     ntp4.aliyun.com
     ntp5.aliyun.com
     ntp6.aliyun.com
     ntp7.aliyun.com