网络时钟同步协议-- NTP, PTP


这篇文章介绍一下两个时钟同步的网络协议:NTP和PTP。
这里不涉及协议的原理和具体实现(想了解的可自行Google),重点是如何搭建起这两个服务。

1. NTP及PTP简介


NTP(Network Time Protocol)是用于不同计算机之间同步时钟的网络协议。
它的设计目标是使所有的互连的机器之间的时钟与UTC时间只相差若干毫秒

目前NTP协议已经是有第4版了,如果不需要了解NTP太多细节的话,看看这个wiki页面应该就足够了。需要注意的就是它有clock strata的概念。

PTP(Precision Time Protocol)看名字就知道是一个比NTP更精确的时钟同步协议了,PTP的设计目标是使机器之间的时钟偏差在sub-microsecond范围—这是wiki页面上提到的,有其他的地方说的是偏差若干微秒,本文搭建的环境中测量到的偏差也在微秒级别,没有到sub-microsecond级别。在使用PTP协议时,需要了解的主要概念点就是它的master/slave机制。

接下来我们就介绍我搭建NTP和PTP环境的过程,所用到的操作系统是CentOS6.5,内核版本是3.10。其他软件的版本会在用到时提及。

2. 搭建NTP服务


配置环境:两台服务器,一台做NTP服务器,一台做NTP的客户端。同时这两台机器都未联网。
NTP服务器地址:192.168.0.11
NTP客户端地址:192.168.0.22

A. 在192.168.0.11中启动NTP服务

$ service iptables stop  // 首先把防火墙关了  
$ yum list |grep ntp     // 看下yum源中是否有ntp软件    
$ yum install -y ntp    
$ ntpd --version  
    ntpd 4.2.6p5  
$ vim /etc/ntp.conf      // 修改配置文件  
    restrict 192.168.0.11 mask 255.255.255.0 nomodify nostrap  // 限制作为局域网NTP服务器
    // 下面两句很关键。含义是如果这台NTP服务器的server地址无法访问,  
    // 则将本地时间作为NTP服务时间,这个IP地址也是固定的,不要修改  
    server 127.127.1.0  
    fudge  127.127.1.0 stratum 10   
$ ntpd -p /var/run/ntpd.pid  // 启动ntpd  
$ service ntpd start          // 第二种启动ntpd服务的方法  
// 等待5分钟  
$ ntpstat // 从这条命令应该能看到NTP时钟同步好了,正常的显示结果应该与下面类似  
    synchronised to local net at stratum 11
        time correct to within 11 ms  
        polling server every 64 s

B. 在192.168.0.22上启动NTP服务,选择192.168.0.11为NTP服务器

$ service iptables stop
$ yum install -y ntp
$ vim /etc/ntp.conf  // 添加下面这个server地址,把其他的都注释掉  
    server 192.168.0.11  
$ service ntpd start
$ netstat  // 等待若干时间应该就能够显示同步成功了  

我的这两台实验机器是在同一个Rack的,结果显示差不多同步的偏差在30ms左右。
每个版本的ntpd配置文件可能有少许的差别,不过好在注释都做的不错,所以别的细节就不啰嗦了。

3. 搭建PTP服务


List of PTP implementations可以看到PTP的实现有很多很多种,可以是硬件实现的,可以是软件实现的也可以是软硬件结合实现的。本文中搭建的PTP服务是基于软件PTPd。如果没有特殊的硬件的话,这算是一种非常方便的方法了。

$ service iptables stop // 关掉防火墙  
$ yum list |grep ptp    // 检查yum源  
$ yum install -y ptpd
$ ptpd2 --version  
    ptpd2 version 2.3.0  
// 弄一个管理脚本,从serverfault找来的 :)    
// http://serverfault.com/questions/329127/ptp-time-synchronization-on-centos6-rhel
$ vim ptpd.sh  // 将PTPADRGS 改为 PTPD_EXTRA_OPTIONS  
$ chmod +x ptpd.sh 
$ vim /etc/ptpd2.conf  // 修改配置文件  
    ptpengine:preset=masterslave    // 对于master主机,不要选masteronly,具体原因请查看help  
    ptpengine:preset=slaveonly      // 对于slave主机  
    // 其他选项也可以根据需要进行调整,比如log是否开启,是否绑定CPU。这些看配置文件的注释就好了  
$ vim /etc/sysconfig/ptpd2  // 修改启动命令,主要就是指定PTPD的配置文件  
    PTPD_EXTRA_OPTIONS="-c /etc/ptpd2.conf"  
// 现在就可以使用下面三个命令来启动,查看和关闭ptpd服务了  
$ ./ptpd.sh start  
$ ./ptpd.sh status  
$ ./ptpd.sh stop  

如果遇到任何问题,首先一定要看看help,使用-H选项的话还能看到非常详细的配置(虽然大多我可看不懂,不过不能不看,理解的越多,遇到的问题就会越少)。
如果log里面的信息看不懂,可以把代码下下来,一个grep搞定。

经测试,在我的机器上使用PTPD软件搭建的服务,时钟偏移的平均值能够达到5us左右。这个粒度基本能满足我们的需求了。

参考资料

Network Time Protocol
CentOS 6.3搭建NTP服务器
Why is IEEE 1588 so accurate?
Precision Time Protocol
List of PTP implementations
ptpd source code
ptpd manage scripts
PTP技术介绍 by H3C
PTP FAQ
More: NTP vs PTP