Keepalived + ntp高可用时间同步服务器

1 ntp简介

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。
在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要求就非常地高,是按照A这台计算机的时间,还是按照B这台计算机的时间?NTP就是用来解决这个问题的,NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的地方其精度可以达到1-50ms。
它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)进行时间同步,它可以提供高精准度的时间校正,而且可以使用加密确认的方式来防止病毒的协议攻击。

2 ntp原理

在这里插入图片描述
0层的服务器采用的是原子钟、GPS钟等物理设备,stratum 1与stratum 0 是直接相连的,

往后的stratum与上一层stratum通过网络相连,同一层的server也可以交互。

ntpd对下层client来说是service server,对于上层server来说它是client。

ntpd根据配置文件的参数决定是要为其他服务器提供时钟服务或者是从其他服务器同步时钟。所有的配置都在/etc/ntp.conf文件中。

stratum根据上层server的层次而设定(+1)。

对于提供network time service provider的主机来说,stratum的设定要尽可能准确。

而作为局域网的time service provider,通常将stratum设置为10

3 常见使用架构

3.1 使用ntpd服务

1)现在在内网配置2台ntpd服务(ntp-server),上级同步的时间服务是cn.pool.ntp.org。使用Keepalived保证高可用,提供一个对外的虚IP:172.16.159.140。启动ntpd服务。service ntpd start
2)配置所有的内网服务启动,上级服务器是:172.16.159.140。启动ntpd服务。service ntpd start

在这里插入图片描述

3.2 crontab+ntpdate

1)现在在内网配置2台ntpd服务(ntp-server),上级同步的时间服务是cn.pool.ntp.org。使用Keepalived保证高可用,提供一个对外的虚IP:172.16.159.140。启动ntpd服务。service ntpd start
2)配置所有的内网加上定时任务,每隔一个小时执行一下ntpdate 172.16.159.140。(这里虚IP,也可以考虑缓存一个域名:time.clevercode.com => 172.16.159.140。然后ntpdate time.clevercode.com)
在这里插入图片描述

3.3 ntpd、ntpdate的区别

使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。

ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,

并非ntpdate立即同步,在生产环境中慎用ntpdate,也正如此两者不可同时运行。

时钟的跃变,对于某些程序会导致很严重的问题。

许多应用程序依赖连续的时钟——毕竟,这是一项常见的假定,即,取得的时间是线性的,

一些操作,例如数据库事务,通常会地依赖这样的事实:时间不会往回跳跃。

不幸的是,ntpdate调整时间的方式就是我们所说的”跃变“:在获得一个时间之后,ntpdate使用settimeofday(2)设置系统时间,

3.3.1 ntpd的优点:

【一】这样做不安全。

ntpdate的设置依赖于ntp服务器的安全性,攻击者可以利用一些软件设计上的缺陷,拿下ntp服务器并令与其同步的服务器执行某些消耗性的任务。

由于ntpdate采用的方式是跳变,跟随它的服务器无法知道是否发生了异常(时间不一样的时候,唯一的办法是以服务器为准)。

【二】这样做不精确。

一旦ntp服务器宕机,跟随它的服务器也就会无法同步时间。

与此不同,ntpd不仅能够校准计算机的时间,而且能够校准计算机的时钟。

【三】这样做不够优雅。

由于是跳变,而不是使时间变快或变慢,依赖时序的程序会出错

(例如,如果ntpdate发现你的时间快了,则可能会经历两个相同的时刻,对某些应用而言,这是致命的)。

因而,唯一一个可以令时间发生跳变的点,是计算机刚刚启动,但还没有启动很多服务的那个时候。

其余的时候,理想的做法是使用ntpd来校准时钟,而不是调整计算机时钟上的时间。

NTPD在和时间服务器的同步过程中,会把BIOS计时器的振荡频率偏差——或者说Local Clock的自然漂移(drift)——记录下来。

这样即使网络有问题,本机仍然能维持一个相当精确的走时。

3.3.2 ntpd的缺点:

我们使用的是crontab+ntpdate,和运维的同事交流,没有用ntpd服务的原因是
1)ntpd更新是时间,是有梯度的,比如第一次更新是60秒,下次可能就是3600秒,下次可能会更久。
2)虚拟机关机的时候ntpd记录的是关机的时间,如果开机的时候不执行ntpdate命令,启动后的时间还是开机的时候。所以对一键开机和关机的不是特别友好。

4 ntp安装

CentOS 6.6系统已经自带了NTPD服务,一般默认是按照了的,如果没有安装,先检查下,然后配置好yum仓库,yum方式安装下就OK,具体如下:

# rpm -q ntp
[root@localhost ~]# rpm -q ntp
ntp-4.2.6p5-15.el6.centos.x86_64
[root@localhost ~]#

// 这表示已安装了,如果没有安装,这是空白。

如果没有安装,我们按照下

# yum –y install ntp

5 配置ntpd服务端

5.1 资源信息

VIPIPKeepalivedntpdCentOS默认主从
172.16.159.140172.16.159.142keepalived-1.2.12.tar.gzntp-4.2.6p5(使用123端口)CentOS release 6.6 (Final)MASTER
172.16.159.140172.16.159.143keepalived-1.2.12.tar.gzntp-4.2.6p5(使用123端口)CentOS release 6.6 (Final)BACKUP

5.2 配置ntpd

1)在172.16.159.142和172.16.159.143,编辑如下配置
vi /etc/ntp.conf

# 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. 上层主机的设定 
#  要设定上层主机主要以 server 这个参数来设定,语法为:
#  server [IP|HOST Name] [prefer]
#  Server 后面接的就是上层 Time Server,而如果 Server 参数

# 后面加上 perfer 的话,那表示我们的 NTP 主机主要以该部主机来

# 作为时间校正的对应。另外,为了解决更新时间封包的传送延迟动作,

#  所以可以使用 driftfile 来规定我们的主机 
#  在与 Time Server 沟通时所花费的时间,可以记录在 driftfile  
#  后面接的文件内,例如下面的范例中,我们的 NTP server 与  
#  cn.pool.ntp.org联机时所花费的时间会记录在 /etc/ntp/drift文件内 
server 0.pool.ntp.org

server 1.pool.ntp.org

server 2.pool.ntp.org

server cn.pool.ntp.org prefer

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

server  127.127.1.0     # local clock

fudge   127.127.1.0 stratum 10

driftfile /var/lib/ntp/drift
broadcastdelay  0.008

keys /etc/ntp/keys
  1. 配置防火墙或者关闭防火墙
    #修改防火墙配置: 
    # vi + /etc/sysconfig/iptables
    #添加配置项 
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 123 -j ACCEPT
    #重启防火墙 
    # service iptables restart
  1. 首次校验时间
    在启动NTP服务前,先对提供服务的这台主机手动的校正一次时间(因为启动服务器,端口会被服务端占用,就不能手动同步时间了)。
[root@localhost etc]# ntpdate cn.pool.ntp.org
20 Sep 10:39:41 ntpdate[3875]: adjust time server 111.230.189.174 offset 0.041223 sec
[root@localhost etc]#

4)启动ntpd

# /etc/init.d/ntpd start

说明:停止命令是 /etc/init.d/ntpd stop
5)查看同步状态

[root@localhost etc]# ntpstat
synchronised to local net at stratum 11
   time correct to within 3948 ms
   polling server every 64 s

ntpstat 命令查看时间同步状态,这个一般需要5-10分钟后才能成功连接和同步。所以,服务器启动后需要稍等下。

[root@localhost etc]# ntpstat
synchronised to NTP server (193.182.111.141) at stratum 3
 time correct to within 269 ms
 polling server every 128 s
[root@localhost etc]#

6)查看ntpd服务

[root@localhost etc]#  netstat -tlunp | grep ntp
udp        0      0 172.16.159.140:123          0.0.0.0:*                               43290/ntpd
udp        0      0 172.16.159.141:123          0.0.0.0:*                               43290/ntpd
udp        0      0 172.16.159.143:123          0.0.0.0:*                               43290/ntpd
udp        0      0 127.0.0.1:123               0.0.0.0:*                               43290/ntpd
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               43290/ntpd
udp        0      0 fe80::250:56ff:fe29:315c:123 :::*                                    43290/ntpd
udp        0      0 ::1:123                     :::*                                    43290/ntpd
udp        0      0 :::123                      :::*                                    43290/ntpd
[root@localhost etc]#

7)ntpq -p 查看网络中的NTP服务器,同时显示客户端和每个服务器的关系

[root@localhost etc]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+119.28.206.193  100.122.36.4     2 u   22  128  377   51.598   -1.978   3.481
+electabuzz.feli 91.121.157.10    3 u    4  128  377  297.452    5.164  23.134
*ntp6.flashdance 194.58.202.148   2 u   65  128  377  266.386   48.422  27.544
 LOCAL(0)        .LOCL.          10 l  62m   64    0    0.000    0.000   0.000
[root@localhost etc]#

在这里插入图片描述

5.3 配置ntpd高可用

可以通过Keepalived,使用虚IP:172.16.159.140。配置详细过程,请参考:《Keepalived + Nginx高可用(主从+双主模式)》:https://blog.csdn.net/CleverCode/article/details/100975642

6 配置ntp客户端

6.1 方式一:启动ntpd方式

1)在172.16.159.144或者其他的客户端机器的IP上面,配置如下。其中server 172.16.159.140。配置到172.16.159.140这个虚IP。
vi /etc/ntp.conf

driftfile /var/lib/ntp/drift

restrict 127.0.0.1
restrict -6 ::1

server 172.16.159.140

restrict 172.16.159.140 nomodify notrap noquery

server  127.127.1.0     # local clock

fudge   127.127.1.0 stratum 10

includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys

2)首次需要执行校验

[root@localhost etc]# ntpdate 172.16.159.140
20 Sep 10:34:53 ntpdate[1270]: adjust time server 172.16.159.140 offset -0.024903 sec
  1. 启动ntpd
#关闭防火墙
[root@localhost etc]# service iptables stop
# 启动ntpd
[root@localhost etc]# /etc/init.d/ntpd start
正在启动 ntpd:                                            [确定]
  1. 查看同步情况
# ntpq -p

如果ntpq -p,发现查询结果比显示比较慢。可以使用strace命令,看一下用户可内核的交互情况。发现出现了Timeout,原因是使用了dns配置了114.114.114.114。vi /etc/resolv.conf 注释掉nameserver 114.114.114.114.

# strace ntpq -p
.....
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("114.114.114.114")}, 16) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])
sendto(4, "\203-\1\0\0\1\0\0\0\0\0\0\003140\003159\00216\003172\7in-a"..., 45, MSG_NOSIGNAL, NULL, 0) = 45
poll([{fd=4, events=POLLIN}], 1, 5000)  = 0 (Timeout)
.....

再次查看结果正常。同步了172.16.159.140时间。

[root@localhost etc]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*172.16.159.140  139.199.215.251  3 u   34   64  377    0.577    5.043   1.776
 LOCAL(0)        .LOCL.          10 l  36m   64    0    0.000    0.000   0.000
[root@localhost etc]# ntpstat
synchronised to NTP server (172.16.159.140) at stratum 4
   time correct to within 94 ms
   polling server every 64 s
[root@localhost etc]#

5)查看ntpd日志。
默认日志放到 /var/log/messages
cat /var/log/messages

[root@localhost etc]# cat /var/log/messages

Sep 20 15:50:27 localhost ntpd[1833]: ntpd 4.2.6p5@1.2349-o Wed Dec 19 20:22:34 UTC 2018 (1)
Sep 20 15:50:27 localhost ntpd[1834]: proto: precision = 0.056 usec
Sep 20 15:50:27 localhost ntpd[1834]: 0.0.0.0 c01d 0d kern kernel time sync enabled
Sep 20 15:50:27 localhost ntpd[1834]: line 16 column 34 syntax error, unexpected T_String, expecting T_EOC
Sep 20 15:50:27 localhost ntpd[1834]: syntax error in /etc/ntp.conf line 16, column 34
Sep 20 15:50:27 localhost ntpd[1834]: getaddrinfo: "127.0.0.1   " invalid host address, ignored
Sep 20 15:50:27 localhost ntpd[1834]: restrict: error in address '127.0.0.1   ' on line 19. Ignoring...
Sep 20 15:50:27 localhost ntpd[1834]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listen and drop on 1 v6wildcard :: UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listen normally on 2 lo 127.0.0.1 UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listen normally on 3 eth0 172.16.159.144 UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listen normally on 4 eth0 fe80::250:56ff:fe3e:e5ec UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listen normally on 5 lo ::1 UDP 123
Sep 20 15:50:27 localhost ntpd[1834]: Listening on routing socket on fd #22 for interface updates
Sep 20 15:50:27 localhost ntpd[1834]: 0.0.0.0 c016 06 restart
Sep 20 15:50:27 localhost ntpd[1834]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Sep 20 15:50:27 localhost ntpd[1834]: 0.0.0.0 c011 01 freq_not_set
Sep 20 15:50:29 localhost ntpd[1834]: 0.0.0.0 c514 04 freq_mode
[root@localhost etc]#

6.1 方式二:crontab+ntpdate

在172.16.159.144或者其他的客户端机器的IP上面。这种方式比较简单了,添加一个定时任务可以。不需要启动ntpq服务。
1)首次校验

[root@localhost etc]# /usr/sbin/ntpdate 172.16.159.140
20 Sep 15:48:13 ntpdate[1825]: adjust time server 172.16.159.140 offset 0.000293 sec

2)添加定时任务

[root@localhost etc]# crontab -l
0 * * * * /usr/sbin/ntpdate 172.16.159.140
[root@localhost etc]#

7 参考文档

《Linux配置ntp时间服务器(全)》:
https://www.cnblogs.com/quchunhui/p/7658853.html

《Linux系统时间同步方法小结》:
https://blog.csdn.net/zyddj123/article/details/86560921

《Linux系统时间与硬件时间及时间同步》:
https://blog.csdn.net/qq_20663229/article/details/80812215

《NTP服务及时间同步(CentOS6.x)》
https://www.iteye.com/blog/acooly-1993484

技术交流

方式一:个人微信

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode个人微信号:clever_code
在这里插入图片描述

方式二:qq群

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师社区):517133582
在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页