这篇文章介绍一下两个时钟同步的网络协议: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服务
Shell
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$serviceiptablesstop//首先把防火墙关了
$yumlist|grepntp//看下yum源中是否有ntp软件
$yuminstall-yntp
$ntpd--version
ntpd4.2.6p5
$vim/etc/ntp.conf//修改配置文件
restrict192.168.0.11mask255.255.255.0nomodifynostrap//限制作为局域网NTP服务器
//下面两句很关键。含义是如果这台NTP服务器的server地址无法访问,
//则将本地时间作为NTP服务时间,这个IP地址也是固定的,不要修改
server127.127.1.0
fudge127.127.1.0stratum10
$ntpd-p/var/run/ntpd.pid//启动ntpd
$servicentpdstart//第二种启动ntpd服务的方法
//等待5分钟
$ntpstat//从这条命令应该能看到NTP时钟同步好了,正常的显示结果应该与下面类似
synchronisedtolocalnetatstratum11
timecorrecttowithin11ms
pollingserverevery64s
B. 在192.168.0.22上启动NTP服务,选择192.168.0.11为NTP服务器
Shell
$ service iptables stop
$ yum install -y ntp
$ vim /etc/ntp.conf // 添加下面这个server地址,把其他的都注释掉
server 192.168.0.11
$ service ntpd start
$ netstat // 等待若干时间应该就能够显示同步成功了
1
2
3
4
5
6
$serviceiptablesstop
$yuminstall-yntp
$vim/etc/ntp.conf//添加下面这个server地址,把其他的都注释掉
server192.168.0.11
$servicentpdstart
$netstat//等待若干时间应该就能够显示同步成功了
我的这两台实验机器是在同一个Rack的,结果显示差不多同步的偏差在30ms左右。
每个版本的ntpd配置文件可能有少许的差别,不过好在注释都做的不错,所以别的细节就不啰嗦了。
3. 搭建PTP服务
从List of PTP implementations可以看到PTP的实现有很多很多种,可以是硬件实现的,可以是软件实现的也可以是软硬件结合实现的。本文中搭建的PTP服务是基于软件PTPd。如果没有特殊的硬件的话,这算是一种非常方便的方法了。
Shell
$ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$serviceiptablesstop//关掉防火墙
$yumlist|grepptp//检查yum源
$yuminstall-yptpd
$ptpd2--version
ptpd2version2.3.0
//弄一个管理脚本,从serverfault找来的:)
//http://serverfault.com/questions/329127/ptp-time-synchronization-on-centos6-rhel
$vimptpd.sh//将PTPADRGS改为PTPD_EXTRA_OPTIONS
$chmod+xptpd.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.shstart
$./ptpd.shstatus
$./ptpd.shstop
如果遇到任何问题,首先一定要看看help,使用-H选项的话还能看到非常详细的配置(虽然大多我可看不懂,不过不能不看,理解的越多,遇到的问题就会越少)。
如果log里面的信息看不懂,可以把代码下下来,一个grep搞定。
经测试,在我的机器上使用PTPD软件搭建的服务,时钟偏移的平均值能够达到5us左右。这个粒度基本能满足我们的需求了。
参考链接