如何实现多台机器(系统)时间的同步

Apr 03, 2014

某直辖市的高速公路固定测速系统项目的架构

路上每隔一段距离将有一个执法站,执法站附件将有一排摄像头,实时对过往车辆照相,将摄像结果及收集的车速数据传至工控机(执·法站的服务器),然后由工控机定时将数据提交至中转服务器,最后到达管理平台和数据库。

上述得到的数据一般为车辆的瞬时车速,也是如今常见的监管依据。我们实施的区间速度处于实验阶段,其原理

   区间速度 v = 距离L / (时间B-时间A)

为满足结果,需要获取各个执法站之间的距离,以及来往车辆经过执法站的时间。距离将采用人工维护的方式输入,车辆经过时间需要工控机上传上来,然后就可以再管理平台计算。具体实现的代码另写文章总结,但是项目实施后,发现比较严重的问题是,工控机由于环境复杂,常常出现时间不同步的现象,经常相差几十分钟之多。要知道有时车辆经过两个点花费的时间不过十几分钟而已。故这里我们要解决的是服务器群同步时间的问题。

解决问题

为什么日常使用的个人电脑不会有时间的烦恼,大家想过没,答案是Network Time Protocol(NTP)。百度百科的定义是

   Network Time
   Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。

回到问题,是不是有一台NTP服务器,然后使用NTP的客户端程序去同步就OK了呢。Let‘s go

NTP时间服务器的三种方式

一、Internet可用的时间服务器

   国家授时中心ip地址:210.72.145.44、202.112.10.60

由于在内网环境,所以我们需要安装一台内网的NTP时间服务器

二、windows搭建NTP时间服务器

具体操作如下

   首先进入注册表regedit

   1.修改注册表子项:
   HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Parameters\\Type,编辑值"**NTP**"

   2.修改注册表子项:
   HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\Config\\AnnounceFlags
   ,编辑时选择类型DWORD,输入值"**5**"

   3.修改注册表子项:
   HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\TimeProviders\\NtpServer\\Enabled,编辑时选择类型DWORD,输入值"**1**"

完成后重新启动windows time服务即可。

三、linux搭建NTP时间服务器

默认linux都已安装了ntpd与ntpdate工具

   修改NTP服务器上的/etc/ntp.conf,加上以下的配置:

   server \*.\*.\*.\* fudge \*.\*.\*.\* stratum 5

重启ntpd:

service ntpd restart

等五六分钟,让ntpd完成自身的时间同步,这期间可以用:

watch ntpq -p

查看状态,第6列达到17时就可以了。等待的时间是第5列poll的秒数乘以5。

NTP客户端

windows

w32tm /config /manualpeerlist:10.148.70.166,0x5 /syncfromflags:MANUAL /update

linux

service ntpd stop           #客户端一定要先关闭ntpd服务,并确认ntpdate是否安装
ntpdate x.x.x.x(服务器IP)

验证

客户端时间

修改服务器时间

在客户端执行同步

查看客户端的时间

OK