在进入到我们的主题之前首先我们可以简单了解一下这几个名词

Atomic Clock: 现在计算时间最准确的是使用 原子震荡周期 所计算的物理时钟(Atomic Clock),因此也被定义为标准时间(International Atomic Time)

UTC(coordinated Universal Time): 协和标准时间 就是利用 Atomic Clock 为基准定义出来的正确时间

(世界统一时间,世界标准时间,国际协调时间)

硬件时钟: 硬件时钟是指嵌在主板上的特殊的电路, 它的存在就是平时我们关机之后还可以计算时间的原因

系统时钟: 就是操作系统的kernel所用来计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的值

NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。


 那么NTP对于我们来说有什么用呢?

          对于个人,当你的计算机时间不准了,你可以接入到互联网,从网上同步时间。

          对于企业来说,当你有成百上千的计算机,都不能直接连接互联网,时间不统一影响业务,如果一台一台的修改,那不得累死人啊。而且在项目中,我们常会遇到分析系统问题的时候需要查看系统日志。此时,若是一个Cluster集群或HA应用的话,会发现时间对于定位问题发生的先后和原因是非常重要的。所以,我们希望能有方法保证两服务器时间一样,最好可以做到是标准时间。这就是搭建NTP服务器的意义,它的优势!

 一、原理

 NTP是用来使系统和一个精确的时间源保持时间同步的协议。建议大家在自己管理的网络中建立至少一台时间服务器来同步本地时间,这样可以使得在不同的系统上处理和收集日志和管理更加容易,而且不会出错。
 官方网站是:http://www.ntp.org/
 从上面我们可以获得Linux下的源代码,以及互联网上的公开的NTP服务器,其地址列表如下:
http://ntp.isc.org/bin/view/Servers/NTPPoolServers
http://ntp.isc.org/bin/view/Servers/WebHome
 NTP协议是通过Server和Client的方式进行的,通讯的过程是:
1.首先,主机需要启动这个NTP服务 
2.Client 会向 NTP Server 发送出调校时间的 message 
3.然后 NTP Server 会送出目前的标准时间给 Client
4.Client 接收了来自 Server 的时间后,会据以调整自己的时间,以实现网络校时。
 虽然网络上有很多公开的NTP服务器,但在使用的时候需要注意。由于网络传输是有延时的,当Client对一个延时比较厉害的服务器发送请求后,直到最后Client获得时间,期间可能会出现一个由于网络延时导致的的时间差。所以,建议大家选择离自己最近的NTP服务器作为校验的标准。

注: 当然请在  CentOS 6.5下配置好相关的yum源,并确保你的ntp服务器是可以连网的 

那么在搭建 NTP 服务之前我们要做什么准备呢?

1.检查系统时区是否正确

在中国,正确的时区应为 CST(Chinese Standard Time),也就是我们通常所说的北京时间.

那么中国当地的时间晚上8点的话,我们可以有下面两种表示方式

20:00 CST

12:00 UTC

因为中国处在UTC+8时区,依次类推,在UTC标准时间,就是12:00了.

不管通过任何渠道我们想要同步系统的时间,通常提供方只会给出UTC+0的时间值而不会提供时区(因为它不知道你在哪里).所以当我们设置系统时间的时候,设置好时区是首先要做的工作

      # date
      Thu Oct 31 11:22:45 EDT 2013

如果发现时区不正确,修改时区,详见附录1


2.检查 NTP 是否安装

      # rpm -qa |grep ntp
      ntp-4.2.4p8-3.el6.centos.x86_64
      ntpdate-4.2.4p8-3.el6.centos.x86_64

如上所示就是正确安装了

       yum安装ntp服务   

       yum install -y ntp


3.检查上层 NTP 服务器是否正常连通

我们直接使用国家对时服务器

ch.pool.ntp.org

为了防止出现上层对时服务器故障,无法正确提供时间同步,一般建议配置两个或以上时间同步服务器.下面测试时钟服务是否正常可用

      01.# ntpdate -q 1.cn.pool.ntp.org
      02.server 202.112.10.36, stratum 2, offset -1.883582, delay 0.18350
      03.server 202.112.29.82, stratum 2, offset -1.860654, delay 0.23692
      04.server 202.112.31.197, stratum 2, offset -1.812637, delay 0.13278
      05.server 218.75.4.130, stratum 2, offset -1.837221, delay 0.04099
      06.31 Oct 09:07:03 ntpdate[1625]: step time server 218.75.4.130 offset -1.837221 sec

如上所示,就是正常的,如果上层服务器不可用,一般如下显示

       1.server 10.32.196.60, stratum 0, offset 0.000000, delay 0.00000
        2.26 Oct 15:01:17 ntpdate[23338]: no server suitable for synchronization found

4.手工校正当前时间

当系统时间与标准时间相差太大时,NTP 通常无法正常同步时间,因此我们一般要手工先对当前时间进行调整

       1.# ntpdate 1.cn.pool.ntp.org
       2.31 Oct 09:14:18 ntpdate[22563]: step time server 218.75.4.130 offset -1.830097 sec
        注意:如果NTPD服务已经运行了,这个命令使用不了,要先关闭NTPD服务,就可以了

调整好后,用 date 命令检查一下,时间是否正确了

       1.# date
       2.Thu Oct 31 09:14:50 CST 2016

配置 NTP 的配置文件

NTP服务端的配置比较简单,只有一个配置文件:/etc/ntp.conf。

注:

restrict IP mask 掩码 参数
IP是允许或不允许访问的地址,配合掩码可以对一段网段使用;
参数包括:
ignore:关闭所有NTP联网服务
nomodify:客户端不能修改服务端的时间,但可以作为客户端的校正服务器
notrust:除通过认证外,否则指定的网段为不信任网段
noquery:不提供时间查询


(若不设置参数,表示对该IP或网段没有任何限制)
 而配置文件中有几个是默认设置好的,包括:

restrict default nomodify notrap noquery
#default就是0.0.0.0,也就是关闭所有
restrict 127.0.0.1
#这是允许本级查询


      方法:

server [IP|FQDN] [prefer]
IP|FQDN就是给出作为你服务端同步的基准NTP服务器
prefer是用于指定主次服务器的,有标识的就是主要服务器咯


而配置文件默认的包括了:

server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org


这些都是比较公开的、常用的NTP服务器,也可以改为你指定的服务器,如:

server cn.pool.ntp.org prefer

 server 210.72.145.44 prefer    (网上提供的外网时间服务器同步地址)

     有关网上提供的时间服务器大家可以去网上找一找,有很多国家提供的时间服务器


       其他:

server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay  0.008


要注意的就是driftfile定义,driftfile 规定我们的主机在与Time Server沟通时所花费的时间,时间记录在 driftfile 后面接的文件内
       

          另:
这里就添加上允许访问这台服务器的IP或网段,在配置文件上增加:

restrict 192.168.1.0 mask 255.255.255.0 nomodify

这样,在192.168.1.0/24网段内的服务器就可以通过这台NTP Server进行时间同步了!(restrict 0.0.0.0 mask 0.0.0.0 nomodify notrap 允许任何地址与该事件服务器同步)


设置同步更新本地hwclock

在Linux下系统时间在开机的时候会和硬件时间同步(synchronization),之后也就各自独立运行了那么既然两个时钟独自运行,那么时间久了必然就会产生误差了,而NTP默认又只更新系统时间,因此我们需要设置硬件时钟进行同步调整

      1.# vim /etc/sysconfig/ntpd
      2.# Drop root to id 'ntp:ntp' by default.
      3.OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"
      4.SYNC_HWCLOCK="yes"

添加SYNC_HWCLOCK="yes"


启动NTP服务

1.# service ntpd start
2.Starting ntpd:                                             [  OK  ]

    注:

     1.重启ntp服务

    service ntpd restart

    2.个人建议之前关掉防火墙 

    service iptables stop 或者 chkconfig --level 3 iptables off

     3.等待大概十分钟左右,在客户端测试

     ntpdate  ntp服务器地址(如果过早的测试 会报错提示  no server suitable for synchronization found )

      最后时间同步完成。



启动后的观察

1.确认端口监听启动

ntpd启动 123 端口 通过UDP协议对外提供服务

         1.# netstat -nlpu |grep ntpd
         2.udp        0      0 192.168.0.3:123            0.0.0.0:*                               22816/ntpd      
         3.udp        0      0 127.0.0.1:123               0.0.0.0:*                               22816/ntpd      
         4.udp        0      0 0.0.0.0:123                 0.0.0.0:*                               22816/ntpd      
         5.udp        0      0 fe80::20c:29ff:fed4:315f:123 :::*                                    22816/ntpd      
         6.udp        0      0 ::1:123                     :::*                                    22816/ntpd      
         7.udp        0      0 :::123                      :::*                                    22816/ntpd

3.确认已进行时间同步

该命令执行,通常要等10到15分钟,才会显示同步成功

       1.# ntpstat
       2.synchronised to NTP server (202.112.31.197) at stratum 3
       3.time correct to within 80 ms
       4.polling server every 128 s

4.查看与上层服务器连接情况

    1.# ntpq -p

     2.remote           refid      st t when poll reach   delay   offset  jitter
    3.=====================================================================
    4.+dns1.synet.edu. 202.118.1.46     2 u   13   64   77  567.019  132.808  32.883
    5.*dns2.synet.edu. 202.118.1.46     2 u   58   64   37  209.322  -47.016  36.082

remote 远程主机的主机名或IP

*目前正在使用的上层NTP

+已连线,可提供时间更新的候补服务器

refid 上级NTP的IP

st 就是stratum 上层NTP的层级

when 几秒钟前曾做过时间同步更新

poll 下一次更新在几秒后

reach 已经向上层服务器要求更新的次数

delay 网络传输过程中的延迟时间

jitter linux 系统时间与bios硬件时钟之间的差异


5.确认无问题后,将服务设为开机启动

      1.# chkconfig --list ntpd
      2.ntpd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
      3.# chkconfig ntpd on
      4.# chkconfig --list ntpd
      5.ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off


客户端设置

NTP的客户端可以是Linux,也可以是通过软件在Windows上实现。
        1.Linux客户端

 同步的方法非常简单,运行一个命令即可:
           # ntpdate 192.168.228.153
            当然,这只是修改系统时间,你需要用hwclock -w把系统时间写入硬件时间中。也可以用计划任务做定时更新:

1.如果主机比较少,可以通过 cron 来同步时间

        1.# vim /etc/crontab 或  crontab -e
        2.*/1 * * * * root /usr/sbin/ntpdate 192.168.0.3;/sbin/hwclock -wgt;>>/dev/null

为了尽快看到执行效果,所以设置为每1分钟同步一次,实际生产中不用这么频繁,每天同步一次就差不多了

       1.# tail -f /var/log/cron
       2.Oct 31 11:37:01 CentOS2 crond[1522]: (*system*) RELOAD (/etc/crontab)
       3.Oct 31 11:39:01 CentOS2 CROND[1688]: (root) CMD (*/1 * * * * root /usr/sbin/ntpdate           192.168.0.3;/sbin/hwclock -wgt;>>/dev/null)

2.启动NTP服务自动同步

如果内网服务器比较多

可以通过架设NTP来实现时间同步

因为该NTP只需向上层来同步时间,而不需对下层提供对时服务,就比较简单了

只要重复上面NTP架设步骤,去除restrict 步骤即可

注:1 ntp服务启动后呀5到10分钟才会进行同步,所以别着急,,,,
               2 当你的时间设置和NTP服务器的时间相差很大的时候,NTP同步会失败

        2,Windows XP professional客户端
             可以用下面的命令进行:

         NET TIME /SETSNTP:192.168.228.153
          NET TIME /QUERYSNTP
          NET START w32time

             第一行是配置同步的服务器,第二行是察看设置结果,第三行是启动“Windows Time”服务。Windows Time服务默认是自动启动的,并会定时
             同步指定的服务器。
             若系统是Home版等,可以通过日期/时间属性里面的Internet同步服务器,指定服务器地址为192.168.228.153即可。


附1:

1.查看当前时区

1.# date
2.Thu Oct 31 09:37:09 EDT 2013

2.修改 /etc/sysconfig/clock

将原来的时区改为

1.# vi /etc/sysconfig/clock
2.ZONE="America/New_York"
3.#改为
4.ZONE="Asia/Shanghai"

3.覆盖 /etc/localtime

1.# cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.cp: overwrite `/etc/localtime'? y

4.查看修改后的时区

1.# date
2.Thu Oct 31 21:42:33 CST 2013


国内外常用ntp服务器列表

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

#210.72.145.44 (国家授时中心服务器IP地址)

#133.100.11.8 日本 福冈大学

#time-a.nist.gov 129.6.15.28 NIST, Gaithersburg, Maryland

#time-b.nist.gov 129.6.15.29 NIST, Gaithersburg, Maryland

#time-a.timefreq.bldrdoc.gov 132.163.4.101 NIST, Boulder, Colorado

#time-b.timefreq.bldrdoc.gov 132.163.4.102 NIST, Boulder, Colorado

#time-c.timefreq.bldrdoc.gov 132.163.4.103 NIST, Boulder, Colorado

#utcnist.colorado.edu 128.138.140.44 University of Colorado, Boulder

#time.nist.gov 192.43.244.18 NCAR, Boulder, Colorado

#time-nw.nist.gov 131.107.1.10 Microsoft, Redmond, Washington

#nist1.symmetricom.com 69.25.96.13 Symmetricom, San Jose, California

#nist1-dc.glassey.com 216.200.93.8 Abovenet, Virginia

#nist1-ny.glassey.com 208.184.49.9 Abovenet, New York City

#nist1-sj.glassey.com 207.126.98.204 Abovenet, San Jose, California

#nist1.aol-ca.truetime.com 207.200.81.113 TrueTime, AOL facility, Sunnyvale, California

#nist1.aol-va.truetime.com 64.236.96.53 TrueTime, AOL facility, Virginia

#ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)

#s1a.time.edu.cn 北京邮电大学

#s1b.time.edu.cn 清华大学

#s1c.time.edu.cn 北京大学

#s1d.time.edu.cn 东南大学

#s1e.time.edu.cn 清华大学

#s2a.time.edu.cn 清华大学

#s2b.time.edu.cn 清华大学

#s2c.time.edu.cn 北京邮电大学

#s2d.time.edu.cn 西南地区网络中心

#s2e.time.edu.cn 西北地区网络中心

#s2f.time.edu.cn 东北地区网络中心

#s2g.time.edu.cn 华东南地区网络中心

#s2h.time.edu.cn 四川大学网络管理中心

#s2j.time.edu.cn 大连理工大学网络中心

#s2k.time.edu.cn CERNET桂林主节点

#s2m.time.edu.cn 北京大学