0.前言 需求是这么来的,搭建了Storm集群进行协同过滤算法的计算性能测试,要求精度在毫秒(ms)级别。局域网内40个虚拟机节点,用 date 命令,精度上和效率上都不可行。所以,搭建了 NTP 服务器。 1.简介 简单的说是选择几部主要主机 (Primary server) 调校时间,让这些 Primary Servers 的时间同步之后,再开放网络服务来让 Client 端联机,后使Client 端调整自己的时间。NTP(Network Time Protocol)是实现这个过程的一个网络时间协议。它是一个跨越广域网或局域网的复杂的同步时间协议,可使得机器获得毫秒级的精度。NTP协议是OSI参考模型的高层协议,符合UDP传输协议格式,拥有专用端口(Port)123。随着时间的推移,计算机的时钟(硬件时钟)会倾向于漂移。网络时间协议(NTP)即可为路由器、交换机、工作站和服务器之间提供一种时间同步的机制。 详情:http://www.ntp.org/ (官网链接) 2.本次实验环境 操作系统: SUSE Linux Enterprise Server 11 (x86_64) NTP版本:ntpq 4.2.4p8@1.1612-o Sat May 8 09:39:49 UTC 2010 (1) (系统自带,也可自行下载安装) 局域网时间服务器IP:172.18.65.1 客户端同步机器IP:172.18.65.2~172.18.65.41 (40台) 3.服务器搭建步骤 1.选择局域网内一个机器作为时间同步服务器(172.18.65.1) 2.修改服务器端NTP的主要配置文件ntp.conf(默认路径为:/etc/ntp.conf) $vim /etc/ntp.conf server 127.127.1.0 # local clock (LCL) fudge 127.127.1.0 stratum 10 # LCL is unsynchronized ## ## Add external Servers using ## # rcntp addserver <yourserver> ## ## ## Miscellaneous stuff ## driftfile /var/lib/ntp/drift/ntp.drift # path for drift file logfile /var/log/ntp # alternate log file # logconfig =syncstatus + sysevents # logconfig =all # statsdir /tmp/ # directory for statistics files # filegen peerstats file peerstats type day enable # filegen loopstats file loopstats type day enable # filegen clockstats file clockstats type day enable # # Authentication stuff # keys /etc/ntp.keys # path for keys file trustedkey 1 # define trusted keys requestkey 1 # key (7) for accessing server variables # controlkey 15 # key (6) for accessing server variables增加OR修改以下内容: restrict default ignore restrict 172.18.65.0 mask 255.255.255.0 nomodify notrap #restrict [你的IP] mask [netmask_IP] [parameter] #其中 parameter 的参数主要有底下这些: ignore: 拒绝所有类型的 NTP 联机; nomodify: 客户端不能使用 ntpc 与 ntpq 这两支程序来修改服务器的时间参数, 但客户端仍可透过这部主机来进行网络校时的; noquery: 客户端不能够使用 ntpq, ntpc 等指令来查询时间服务器,等于不提供 NTP 的网络校时?; notrap: 不提供 trap 这个远程事件登录 (remote event logging) 的功能。 notrust: 拒绝没有认证的客户端。 3.配置文件ok了,启动NTP服务器 172.18.65.1下启动NTP服务器:service ntp start 或者 /etc/init.d/ntp start 4.手工发起同步(由于Suse Linux在11版本中摒弃了ntpdate命令,采用新的sntp命令进行操作) 在各个客户端机器上执行:sntp -P no -r 172.18.65.1 这样进行了各客户端与服务器的时间同步。 5.每隔一段时间,客户端自动同步 $crontab -e 添加一条如:* 2 * * * * sntp -P no -r 172.18.65.1 #每隔2个小时,客户端与服务器同步一次 6.查看NTP运行状态命令 $ntpq -q
ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态,上头的几个字段的意义为: remote:亦即是 NTP 主机的 IP 或主机名?~注意左边的符号 如果有『 * 』代表目前正在作用当中的上层 NTP。本实验中时间服务器是自身同步,所以显示为LOCAL(0) 如果是『 + 』代表也有连上线,而且可作为下一个提供时间更新的候选者。 refid:参考的上一层 NTP 主机的地址 st:是 stratum 阶层?! when:几秒钟前曾经做过时间同步化更新的动作; poll:下一次更新在几秒钟之后; reach:已经向上层 NTP 服务器要求更新的次数 delay:网络传输过程当中延迟的时间,单位为 10^(-6) 秒 offset:时间补偿的结果,单位与 10^(-3) 秒 jitter:Linux 系统时间与 BIOS 硬件时间的差异时间, 单位为 10^(-6) 秒。 7.实验接着做 按理说,照着这个步骤来,完全实现了这个41台机器的局域网时间同步。但是,我还是想知道在任意时刻, 各个客户端与服务器的时间误差到底是多少(实验要求,必须精确到毫秒级别,但是没有证据表明时间同步到毫秒级别了)。 考虑在使用ntpq -p命令查看状态时,有时间补偿的offset项,该项表明本时间服务器与上一级时间服务器的同步时间误差。 所以,将剩下的40个客户端均设置为服务器,且将172.18.65.1作为上级服务器。这样能通过ntpq -p命令查看时间同步误差了。 修改客户端的主要配置文件ntp.conf部分内容如下: restrict default ignore server 172.18.65.1 prefer #perfer表示优先将该Server IP 作为时间源 restrict 172.18.65.0 mask 255.255.255.0 nomodify notrap fudge 127.127.1.0 stratum 10 # LCL is unsynchronized #利用server设定上层NTP服务器,上层NTP服务器的设定方式为: #server [IP OR HOSTNAME] [PREFER] #参数说明: #ip or hostname :上层ntp服务器的ip地址或者域名 #prefer : 表示优先使用的主机 同步以及查看步骤如下: 172.18.65.1下启动NTP服务器:service ntp start 或者 /etc/init.d/ntp start 各客户端下启动服务器:service ntp start
可以看到时间同步误差为-0.479ms,在毫秒级别,完全符合实验要求。