[TOC]

0x00 前言

简介:NTP 是网络时间协议 (Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。时区和时间一致性对于服务器非常重要,有时会直接影响到任务执行的结果,

例如:您在更新数据库或者分析日志时,时间顺序对结果有很大影响。为避免在实例上运行业务时出现逻辑混乱和网络请求错误等问题,您需要统一相关实例的时区设置。另外您还可以通过NTP服务同步网络中所有服务器的本地时间。

NTP服务的通信端口为UDP 123,设置NTP服务之前请确保您已经打开UDP 123端口;

在进行Linux运维以及同步的应用安装和使用都要求,双方的时间是需要保持一致的,而常常小型的服务器群是没有自己的NTP服务器的,这时候我们就需要采用外网的NTP服务器进行时间的同步和校对;

阿里云提供了内网和公网NTP服务器,用于同步各网络中ECS实例的本地时间。云服务器ECS为您提供了高精度的时间参考NTP服务器,其中ntp.cloud.aliyuncs.com服务器在地域级别上提供原子参考钟服务,适用于金融、通讯、科研和天文等以时间精度核心的生产行业

经典网络内网 专有网络VPC内网 公网
- ntp.cloud.aliyuncs.com ntp1.aliyun.com
ntp1.cloud.aliyuncs.com ntp7.cloud.aliyuncs.com ntp2.aliyun.com
ntp2.cloud.aliyuncs.com ntp8.cloud.aliyuncs.com ntp3.aliyun.com
ntp3.cloud.aliyuncs.com ntp9.cloud.aliyuncs.com ntp4.aliyun.com
ntp4.cloud.aliyuncs.com ntp10.cloud.aliyuncs.com ntp5.aliyun.com
ntp5.cloud.aliyuncs.com ntp11.cloud.aliyuncs.com ntp6.aliyun.com
ntp6.cloud.aliyuncs.com ntp12.cloud.aliyuncs.com ntp7.aliyun.com

0x01 NTP配置方法

Windows 服务器

为了保证NTP服务配置成功后能正常同步时间,实例中必须开启NTP服务,Windows Server操作系统默认开启Windows Time服务

1.选择 开始 > 所有程序 > 附件 > 运行,打开运行对话框,并运行命令services.msc

2.在服务对话框中,找到并双击Windows Time服务,十分重要否则报错同步连接超时。

3.在Windows Time的属性(本地计算机)对话框中,执行以下操作:将启动类型设置为自动,确认服务状态为已启动。如果不是,单击启动。

4.修改服务器默认NTP服务器地址为:ntp.aliyun.com

WeiyiGeek.

WeiyiGeek.

如何修改NTP服务时间同步间隔?

答:NTP服务的时间同步间隔默认是5分钟,您可以根据业务需求自定义同步间隔;

1
2
3
#注册表编辑器: 
HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > services > W32Time > TimeProviders > NtpClient
并双击SpecialPollInterval键值,填入的数值即是您需要的同步时间间隔(单位为秒)

在编辑 DWORD (32 位)值对话框中,在基数栏里选择十进制,并按需要填写数值数据。


Linux 服务器

前提条件设置NTP服务之前请确保您已经打开UDP 123端口;

在Linux系统中,您可以通过ntpdate和ntpd两种命令方式实现NTP时间同步两种方式的异同;

  • ntpdate ntp.aliyun.com为断点更新,在最新安装系统的时候或者没有业务运行的情况下;
  • ntpd ntp.aliyun.com为步进式地逐渐调整时间。对已经承载有运行中业务的实例,建议您使用ntpd同步时间

以root身份打开并编辑时区配置文件

1
2
3
4
5
6
7
sudo rm /etc/localtime  #删除系统里的当地时间链接
ls /usr/share/zoneinfo #查询时区列表Shanghai为列表条目之一。
sudo vi /etc/sysconfig/clock #用vim打开并编辑配置文件/etc/sysconfig/clock。
输入i添加时区城市。例如添加Zone=Asia/Shanghai,按下Esc键退出编辑并输入:wq保存并退出。
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #更新时区修改内容。
hwclock -w #更新硬件时钟(RTC)。
#验证执行命令date -R查看时区信息是否生效,未生效可按照上述步骤重新操作一遍。

启用NTP服务

  1. 执行命令ntpstat查看是否启用了NTP服务。
  2. 执行命令sudo vi /etc/ntp.conf用vim打开并编辑NTP服务配置文件。
  3. 新添加一行NTP服务器信息格式为:server 您需要添加的NTP服务器 iburst
  4. 执行命令sudo service ntpd start运行NTP服务。
  5. 执行命令chkconfig ntpd on启用NTP服务。
  6. 可选: 执行命令ntpq -p可查看NTP服务对等端的列表信息;执行命令sudo chkconfig --list ntpd可查看NTP服务的运行级别。


快速配置阿里巴巴 OPSX NTP服务编辑文件 “/etc/ntp.conf”,根据情况修改文件内容为:

1
2
3
4
5
6
7
8
9
10
driftfile  /var/lib/ntp/drift
pidfile /var/run/ntpd.pid
logfile /var/log/ntp.log
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
server 127.127.1.0
fudge 127.127.1.0 stratum 10
server ntp.aliyun.com iburst minpoll 4 maxpoll 10
restrict ntp.aliyun.com nomodify notrap nopeer noquery

对于使用 chrony 客户端的 linux 主机 ,配置 ‘/etc/chrony.conf’ 文件的内容为:

1
2
3
4
5
6
7
8
9
10
11
12
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony

0x02 Chrony时间同步

描述:由于Redhat8系列的发行版本默认采用Chrony而废弃了ntpd,所以下面主要讲解一下chrony相关的配置;
Chrony是NTP(Network Time Protocol,网络时间协议,服务器时间同步的一种协议)的另一种实现与ntpd不同,它可以更快且更准确地同步系统时钟,最大程度的减少时间和频率误差。

chrony有三个时间参考:硬件时钟、实时时钟以及手动同步

Chrony包括两个核心组件:

  • chronyd:一个后台运行的守护进程,用于调整内核中运行的系统时钟与NTP服务器同步(它确定服务器增减时间的比率,并对此进行调整补偿)
  • chronyc:提供用户界面,用于监控性能并进行多样化的配置(它可以在chronyd实例控制的服务器上工作,也可以在一台不同的远程服务器上工作)

需求分析与环境:
内网有一台NTP Server向阿里云提供的公网NTP服务器同步时间,并且作为内网NTP Server内网中的其它NTP Client服务器向其同步时间;

IP 主机名 时间同步方式
192.168.1.146 ntp-server chronyd服务平滑同步
192.168.1.147 ntp-client1 chronyd服务平滑同步
<!– 192.168.1.148 ntp-client2 crontab+ntpdate强制同步 –>

补充说明:

  • 以上基于Cent7.7以上的发行版本
  • 使用chronyd服务平滑同步时间的方式要优于crontab + ntpdate原因如下:
    • 因为ntpdate同步时间会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响,例如sleep、timer等,且chronyd服务可以在修正时间的过程中同时修正CPU tick。
  • 默认开放端口127.0.0.1:323-UDP 注意NTP服务器的开放端口为UDP-123

基础配置流程:

  • Step1.内网NTP Server相关配置

    1
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #1.主机名设置
    hostnamectl set-hostname ntp-server
    echo "192.168.1.146 ntp-server" >> /etc/hosts

    #2.重新登录终端并查看当前时间
    hostname && date

    #3.安装chrony由于我的机器已安装和centos8自带,则可以不用自行安装
    #yum -y install chrony

    #4.备份原始/etc/chrony.conf文件并修改
    mv /etc/chrony.conf{,.bak}

    #5.配置文件修改与说明
    cat >/etc/chrony.conf<<'EOF'
    # 指定上层NTP服务器为阿里云提供的公网NTP服务器
    # Please consider joining the pool (http://www.pool.ntp.org/join.html).
    # server 0.centos.pool.ntp.org iburst #缺省默认
    server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp7.aliyun.com iburst minpoll 4 maxpoll 10

    # 记录系统时钟获得/丢失时间的速率至drift文件中
    driftfile /var/lib/chrony/drift

    # 如果系统时钟的偏移量大于10秒,则允许在前三次更新中步进调整系统时钟
    makestep 1.0 3

    # 启用RTC(实时时钟)的内核同步
    rtcsync

    # Allow NTP client access from local network.
    # 允许同步时间的客户端网段
    allow 192.168.1.0/24

    # Serve time even if not synchronized to a time source.
    # 当阿里云提供的公网NTP服务器不可用时,采用本地时间作为同步标准
    local stratum 10

    # 指定包含NTP验证密钥的文件:Specify file containing keys for NTP authentication.
    keyfile /etc/chrony.keys

    # 指定存放日志文件的目录:Specify directory for log files.
    logdir /var/log/chrony

    # Enable hardware timestamping on all interfaces that support it.
    # 在支持它的所有接口上启用硬件时间戳。
    #hwtimestamp *

    # Increase the minimum number of selectable sources required to adjust the system clock.
    # 增加调整系统时钟所需的可选源的最小数目。
    #minsources 2

    # 记录信息的选择:Select which information is logged.
    #log measurements statistics tracking
    EOF
    备注:详细指令参数可以使用命令# man chrony.conf查看


    #6.启动与查看chronyd服务
    systemctl enable chronyd.service && systemctl restart chronyd.service && systemctl status chronyd.service
    ss -tunlp | grep chronyd
    WeiyiGeek.chronyd

    WeiyiGeek.chronyd

    1
    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
    34
    #7.查看时间同步源:
    chronyc sources -v
    # 210 Number of sources = 2 #来源数量
    # .-- Source mode(模式) '^' = server, '=' = peer, '#' = local clock.
    # / .- Source state(状态) '*' = current synced, '+' = combined , '-' = not combined,
    # | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
    # || .- xxxx [ yyyy ] +/- zzzz
    # || Reachability register (octal) -. | xxxx = adjusted offset,
    # || Log2(Polling interval|轮询间隔) --. | | yyyy = measured offset,
    # || \ | | zzzz = estimated error.
    # || | | \
    # MS Name/IP address Stratum Poll Reach LastRx Last sample
    # ===============================================================================
    # ^* 120.25.115.20 (正常) 2 4 17 1 -118us[+2986us] +/- 17ms
    # ^- 203.107.6.88 (正常) 2 4 17 1 -7270us[-7270us] +/- 33ms
    备注:120.25.115.20为ntp1.aliyun.com域名解析后的地址,203.107.6.88为ntp2.aliyun.com~ntp7.aliyun.com域名解析后的地址


    #8.查看时间同步源状态:
    chronyc sourcestats -v
    # 210 Number of sources = 2 #来源数量
    # .- Number of sample points in measurement set.
    # / .- Number of residual runs with same sign.
    # | / .- Length of measurement set (time).
    # | | / .- Est. clock freq error (ppm).
    # | | | / .- Est. error in freq.
    # | | | | / .- Est. offset.
    # | | | | | | On the -.
    # | | | | | | samples. \
    # | | | | | | |
    # Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
    # ==============================================================================
    # 120.25.115.20 16 11 201 -1.609 17.452 +1817us 1128us
    # 203.107.6.88 16 10 201 +4.291 31.560 -3671us 2106us

    备注:可直接输入命令chronyc进入交互式模式详细使用方法可以使用命令# man chronyd和# man chronyc查看

    1
    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
    #常用指令说明
    - help:查看完整的命令帮助列表
    - tracking:显示系统时间信息
    - activity:检查多少NTP源在线/离线
    - add server:手动添加一台新的NTP服务器
    - delete:手动移除NTP服务器或对等服务器
    - accheck:检查NTP访问是否对特定主机可用
    - clients:在客户端报告已访问到的服务器

    $ chronyc
    # chronyc> tracking
    # Reference ID : 78197314 (120.25.115.20)
    # Stratum : 3
    # Ref time (UTC) : Thu May 14 08:19:56 2020
    # System time : 0.000818836 seconds slow of NTP time
    # Last offset : -0.000368672 seconds
    # RMS offset : 0.000605058 seconds
    # Frequency : 12.746 ppm fast
    # Residual freq : -0.245 ppm
    # Skew : 6.550 ppm
    # Root delay : 0.030892739 seconds
    # Root dispersion : 0.001810989 seconds
    # Update interval : 64.4 seconds
    # Leap status : Normal
    # chronyc> accheck
    # Could not read address
    # chronyc> clients
    # Hostname NTP Drop Int IntL Last Cmd Drop Int Last
    # ===============================================================================
  • Step2.NTP Client配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #安装chrony
    yum -y install chrony && mv /etc/chrony.conf /etc/chrony.conf.bak

    #配置chrony.cnf
    cat >/etc/chrony.conf<<'EOF'
    server 192.168.10.254 iburst
    server ntp1.aliyun.com iburst
    driftfile /var/lib/chrony/drift
    makestep 1.0 3
    local stratum 10
    rtcsync
    logdir /var/log/chrony
    #keyfile /etc/chrony.keys
    #stratumweight 0.05
    #noclientlog
    #logchange 0.5
    EOF

    #启动chronyd服务
    systemctl enable chronyd.service && systemctl restart chronyd.service && ss -tunlp | grep chronyd

    #查看时间同步源以及同步状态
    chronyc sources -v && chronyc sourcestats -v
    WeiyiGeek.Client

    WeiyiGeek.Client

  • Step3.测试是否配置成功
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #Client
    $ date -s '-1year'
    $ date 012000002019.00
    2019年 01月 20日 星期日 00:00:00 CST
    $ systemctl restart chronyd #重启后大约三秒进行时间同步
    $ date
    2019年 01月 20日 星期日 00:00:55 CST
    $ date
    2019年 01月 20日 星期日 00:00:57 CST
    $ date
    2019年 01月 20日 星期日 00:00:58 CST
    $ date
    2020年 05月 14日 星期四 16:58:20 CST
    $ date

    #上面是手动下面我们可以将该命令写入timesync.sh加入到crond中每三分钟同步一次
    crond -e
    */3 * * * * sh timesync.sh

0x03 参考来源