zoukankan      html  css  js  c++  java
  • NTP时钟调整策略

    一、        问题背景

    天威视讯项目3月底发生了一次点播出现节目请求超时的情况,在查询故障的过程中,发现MAP服务器操作系统的时钟被向前调整了11秒,姑且不论是否是这个原因导致的故障,但每台服务器在安装了NTP的情况下,为什么还会一次修改达到11秒情况的时间差,是需要查清的一个事情。

    此文由博主徐徐原创,转载请指明出处欢乐世界http://www.happyworld.net.cn

     

    二、        问题分析

    1、       现象分析

    天威视讯项目目前部署的NTP服务是一台MYSQL服务器作为NSP系统的服务端,其他服务器如(IPGAAAMAP等)就同步这台服务器的时钟,而MYSQL则同步天威自己部署的一台NTP服务器。一个简单的三层的架构。

     NTP时钟调整策略 - 不死的蜗牛 - TOMORROW

     

    查看了8台MAP,每台MAP都有过调整11秒时钟的记录,且每台调整的时间都不一样,查看时钟源MYSQL的系统日志,发现是由于MYSQL1的时钟源调整了11秒的时间,进而引起NSP系统内所有服务器都做了一次同步操作。

     

    MYSQL1:  Mar 31 12:08:37 MYSQL1 ntpd[20241]: time reset -11.476554 s

    MAP1:    Mar 31 13:06:20 MAP1 ntpd[26731]: time reset -11.476079 s

    MAP2:    Mar 31 12:57:42 MAP2 ntpd[25106]: time reset -11.476056 s

    IPG1:     Mar 31 12:51:26 IPG1 ntpd[4426]: time reset -11.476588 s

    AAA1:    Mar 31 13:14:33 AAA1 ntpd[8932]: time reset -11.476668 s

     

    从上面日志可以看出,在MYSQL时间修改后,其他服务器陆续进行了时钟校正。我们这里暂不讨论天威源头NTP时钟是否有过11秒的调整,这里讨论为何架设了NTP服务之后,时间会一次校正这么大的值。

     

    2、       原因分析

    经过查询资料,NTP的时间同步有两种方式,一种是通过ntpdate进行手动调整(也可以做成定时任务);一种是通过ntpd服务进行自动调整。目前天威部署的NTP全是以第二种ntpd服务的方式配置的。

     

    ntpdate就是执行该命令的时候就将客户端的时钟与服务器端的时钟做下同步,不管差异多大,都是一次调整到位。

     

    ntpd服务的方式,又有两种策略,一种是平滑、缓慢的渐进式调整(adjusts the clock in small steps所谓的微调);一种是步进式调整(跳跃式调整)。两种策略的区别就在于,微调方式在启动NTP服务时加了个“-x”的参数,而默认的是不加“-x”参数。

     

    假如使用了-x选项,那么ntpd只做微调,不跳跃调整时间,但是要注意,-x参数的负作用:当时钟差大的时候,同步时间将花费很长的时间。-x也有一个阈值,就是600s,当系统时钟与标准时间差距大于600s时,ntpd会使用较大步进值的方式来调整时间,将时钟步进调整到正确时间。

     

    假如不使用-x选项,那么ntpd在时钟差距小于128ms时,使用微调方式调整时间,当时差大于128ms时,使用跳跃式调整。

     

    这两种方式都会在本地时钟与远端的NTP服务器时钟相差大于1000s时,ntpd会停止工作。在启动NTP时加了参数“-g”就可以忽略1000S的问题。

     

    以下是man ntpd里关于加参数“-x”的描述:


    -x 

    Normally, the time is slewed if the offset is less than the step threshold, which is 128 msby default, and stepped if above the  threshold.  This option  sets the threshold to 600 s, which is well within the accuracy window to set the clock manually. Note: Since the slew rate of typical Unix kernels is limited to 0.5 ms/s, each second of adjustment requires an amortization interval of  2000 s. Thus, an adjustment as much as 600 s  will take  almost  14  days to complete. This option can be used with the -g and -q options. See the tinker command for other options. Note: The kernel time discipline is disabled with this option.

     

    Offset(与服务器的时间差)

    0-128ms

    128ms-600s

    600s-1000s

    1000s以上

    使用-X参数

    微调

    微调(速度大约是0.5ms/s,调整600秒要14天左右)

    跳跃

    退出(加-g参数可忽略)

    不使用-X参数

    微调

    跳跃

    跳跃

    退出(加-g参数可忽略)

     

    只有对于跳跃式的校正时间,系统日志才会记录。

     

    天威视讯项目由于是按照跳跃式配置,所以就会一次有修改11秒的情况出现。

    3、       验证测试

    针对这两个策略,我们做了几个测试验证:

    1、 未加参数“-x”时,如何调整:

    将一台测试服务器的时钟,向前修改了大约6秒钟左右

    [root@AAA3 ~]# date -s 16:15:28

    2012年 04月 06日 星期五 16:15:28 CST

    同时在NTP服务器端和客户端执行查询时间操作,两者相差6秒。

    NTP客户端

    NTP服务端

    [root@AAA3 ~]# date
    2012年 04月 06日 星期五 16:15:34 CST

    [root@MYSQL1 ~]# date
    2012年 04月 06日 星期五 16:15:40 CS

     

    然后一直查看NTP客户端服务器的时钟同步效果:

     

    刚开始,未检测到时间异常,下一次同步要512秒一个周期。

    [root@AAA3 ~]# ntpq -p

         remote           refid      st t when poll reach   delay   offset  jitter

    ==============================================================================

    *CC1           172.18.245.1  3  u  132  512  377    1.206    0.806   0.278

     

    检测到与远端服务器的时间差offset 6289.10单位:ms

    [root@AAA3 ~]# date -R

    Fri, 06 Apr 2012 16:30:44 +0800

    [root@AAA3 ~]# ntpq -p

         remote           refid      st t when poll reach   delay   offset  jitter

    ==============================================================================

     CC1             172.18.245.1  3 u   1  512  377    1.208  6289.10 4446.22

     

    经过几次时间的同步,客户端发现与服务器端时钟的确是有差异,不是偶然一次的行为,客户端须得进行相应的调整,于是就进行了一次step的跳跃式时间校正。同步周期poll也由之前的512秒一次,变成每64秒一次(同步不等于就立即调整时间)。同步完后,与服务器的时间差offset 为0ms。

         remote           refid      st t when poll reach   delay   offset  jitter

    ==============================================================================

    *CC1             172.18.245.1   3 u  513  512  377  1.208  6288.98   0.771

    [root@AAA3 ~]# ntpq -p

         remote           refid      st t when poll reach   delay   offset  jitter

    ==============================================================================

     CC1             .STEP.       16 u  225  64    0   0.000   0.000   0.001

    此时再同时查询服务器端和客户端的时间:

    NTP客户端

    NTP服务端

    [root@AAA3 ~]# date -R
    Fri, 06 Apr 2012 16:56:24 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 16:56:24 +0800

    目前时间已经同步正常,查看客户端的系统日志,可以发现:

    [root@AAA3 ~]# tail -f /var/log/messages

    Apr  6 16:39:01 AAA3 ntpd[2576]: synchronized to 172.16.100.81, stratum 3

    Apr  6 16:56:16 AAA3 ntpd[2576]: time reset +6.288863 s

    Apr  6 16:59:49 AAA3 ntpd[2576]: synchronized to 172.16.100.81, stratum 3

     

    由此可以验证,在默认情况下,未加参数“-X”的情况下,NTP在时差大于128ms的情况,是进行的step跳跃式的时间同步。

    2、 加参数“-x”时,如何调整:

    将一台测试服务器的时钟,向前修改了大约10秒钟左右

    1502分修改时间

    [root@AAA1 ~]# date -s 15:02:16

    2012年 04月 06日 星期五 15:02:16 CST

     

    查询时间

    NTP客户端

    NTP服务端

    offset

    15:18

    [root@AAA1 ~]# date
    2012年 04月 06日 星期五 15:18:28 CST

    [root@MYSQL1 ~]# date
    2012年 04月 06日 星期五 15:18:38 CST

    10秒

    [root@AAA1 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u   61   64  377    0.094  9895.33  81.311

     

     

    15:33

    [root@AAA1 ~]# date
    2012年 04月 06日 星期五 15:33:15 CST

    [root@MYSQL1 ~]# date
    2012年 04月 06日 星期五 15:33:24 CST

    9秒

    [root@AAA1 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u  102  128  377    0.098  8737.38 225.355

     

     

    15:43

    [root@AAA1 ~]# date -R
    Fri, 06 Apr 2012 15:43:05 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 15:43:13 +0800

    8秒

    [root@AAA1 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u   97  128  377    0.099  8125.89 508.792

    中间一直是微调状态

    18:09

    [root@AAA1 ~]# date -R
    Fri, 06 Apr 2012 18:09:04 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 18:09:05 +0800

    1秒

    [root@AAA1 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u  260  512  377    1.325  1241.99 220.343

    可以看出,NTP一直在同步时钟,且进行很小的微调,9895.33ms的时间差,调整到1809分还有1241.99ms,之间用了大概3小时来同步8秒多的时间,大概每秒调整0.7ms时间。

     

    3、 加参数“-x”时,如何调整(时间差比较偏大,但是小于600s的情况):

    我们第二步测试的是10秒时间差的情况,对于更大的时间差,这种微调策略是什么效果呢,我们再进行一个测试验证:

     

    将一台测试服务器的时间修改偏差了70几秒(1726修改):

    [root@AAA3 ~]# date -s 17:26:00

    2012年 04月 06日 星期五 17:26:00 CST

     

     

    查询时间

    NTP客户端

    NTP服务端

    offset

    17:35

    [root@AAA3 ~]# date -R
    Fri, 06 Apr 2012 17:35:19 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 17:36:32 +0800

    73秒

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     CC1             172.18.245.1     3 u    6   64  377    0.123  73676.1   9.785

     

     

    第二天
    10:43

    [root@AAA3 ~]# date -R
    Sat, 07 Apr 2012 10:43:26 +0800

    [root@MYSQL1 ~]# date -R
    Sat, 07 Apr 2012 10:43:42 +0800

    16秒

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u   31   64  377    0.122  16137.3 218.643

     

     

    第二天
    17:27

    [root@AAA3 ~]# date -R
    Sat, 07 Apr 2012 17:27:38 +0800

    [root@MYSQL1 ~]# date -R
    Sat, 07 Apr 2012 17:27:38 +0800

    5ms

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *CC1             172.18.245.1     3 u   43  256  377    0.135    5.182   0.589

     

    这次73秒的时间差,用了大概1天的时间,平均每秒调整0.5ms

    由此可以验证,对于小于600s的情况,加了参数“-x”的,不管是10秒还是70秒,500秒,都是进行着这种微调式的时钟同步策略,NTP服务将这种时间差通过分散到每一秒去逐步进行微调,让系统基本感觉不到时间上的变化。这样能保证某些对时间跳动敏感的系统里,能很好的保证业务的安全。

     

    4、 加参数“-x”时,如何调整(时间差大于600s):

    对于大于600s时间差的情况,我们也做了测试验证:

     

    将时钟往前调十几分钟:

    查询时间

    NTP客户端

    NTP服务端

    offset

    17:08

    [root@AAA3 ~]# date -R
    Fri, 06 Apr 2012 16:55:16 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 17:08:09 +0800

    将时间改为提前13分钟

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     CC1             172.18.245.1     3 u    -   64    1    0.130    0.077   0.001

     

     

     

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     CC1             172.18.245.1     3 u    2   64  377    0.124  772789. 292086.

    772秒

     

     

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     CC1             172.18.245.1     3 u    2   64  377    0.124  772789. 292086.

     772秒

     

     

     

     

    0秒 

    [root@AAA3 ~]# ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     CC1             172.18.245.1     3 u   31   64    1    0.136    8.067   0.001

     

    17:17

    [root@AAA3 ~]# date -R
    Fri, 06 Apr 2012 17:17:36 +0800

    [root@MYSQL1 ~]# date -R
    Fri, 06 Apr 2012 17:17:36 +0800

    0秒

     

    NTP服务大概过了5分钟后,就将相差的700多秒时间差,一步到位的进行了校正。

    查询系统日志:

    Apr  6 17:02:53 AAA3 ntpd[24511]: synchronized to 172.16.100.81, stratum 3

    Apr  6 17:15:45 AAA3 ntpd[24511]: time reset +772.789372 s

     

     

    Mar 19 10:44:12 yunwei-002 ntpd[3433]: 0.0.0.0 c61c 0c clock_step +763.773061 s

     

    三、        问题处理

     

    对于VOD点播系统,MAPMYSQLORACLE等模块都会对一些时间比较敏感(比如节目调度时的定时计划、时移时的时间差等等,数据库中可能造成某些记录的创建时间晚于修改时间等等),如果时间不是连续的,而是跳动的,必然对业务有较大的影响。建议后期对NTP策略进行调整。

     

    [root@AAA3 ~]# cat /etc/sysconfig/ntpd

    # Drop root to id 'ntp:ntp' by default.

    OPTIONS="-u ntp:ntp -x  -p /var/run/ntpd.pid"

     

    # Set to 'yes' to sync hw clock after successful ntpdate

    SYNC_HWCLOCK=no

     

    # Additional options for ntpdate

    NTPDATE_OPTIONS=""

    /etc/sysconfig/ntpd文件中的OPTIONS里增加“-x”参数,重启ntpd服务即可。

    [root@AAA3 ~]# service ntpd restart

  • 相关阅读:
    FastAPI WebSockets
    FastAPI 进阶知识(五) 子应用
    FastAPI 基础学习(十五) 直接使用Request
    FastAPI 安全机制(四) OAuth2 scopes
    FastAPI 依赖注入系统(六) 可参数化的依赖项
    FastAPI Response(四) 高级定制的Response
    FastAPI Response(三) 定制化的Response
    FastAPI Response(二) 直接返回Response对象
    FastAPI 进阶知识(四) 后台任务
    python全栈开发目录
  • 原文地址:https://www.cnblogs.com/jjmcao/p/9102778.html
Copyright © 2011-2022 走看看