Quantcast
Channel: SQLParty » NTP
Viewing all articles
Browse latest Browse all 2

NTP服务器搭建

$
0
0

局域网内不同主机之间默认情况下可能有不一致的系统时间,这给应用开发、数据库使用、集群等等都带来不便。而且可能并不是所有主机都连接着外网,无法都与网络上的时间服务器进行同步。所以有必要在局域网内架设一台时间服务器,提供”网络校时”(Network Time Protocal,简称NTP)服务,使各主机系统都与其时间进行校准。

一.原理

NTP让Server和Client保持时间同步的步骤:

  1. 主机启动NTP
  2. Client向NTP Server发送调校时间的消息
  3. NTP Server反馈系统的标准时间给Client
  4. Client接收来自Server的时间后,会据此调整自己的时间。

以上步骤同样适用于NTP服务器与网络上的NTP服务器进行校时。这样就可以形成级联的层级关系,如中国地区的标准时间主机通过国际标准时间主机校时,然后大专院校在通过中国地区的标准时间主机校时,我们再通过各大专院校的标准时间校时,这样就可以降低各国际标准时间主机的压力,也提高我们获取标准时间的效率和准确性。

NTP服务使用123端口(UDP数据包)。

其他概念:

  • GMT:格林威治时间,即标准时间。
  • UTC:Universal Time Coordinated。协调世界时,又称世界统一时间,世界标准时间,国际协调时间,是利用物理时钟(使用原子振动周期计算)作为基准所定义的正确时间。UTC标准时间是以GMT时区为主。可以认为UTC和GMT的值相等(误差相当之小)。UTC已经被认定为是国际标准,所以我们都应该遵守标准,只使用UTC。所以本地时间与UTC时间的时差就是本地时间与GMT时间的时差。
  • CST:Chinese Standard Time,北京时间,处在UTC+8时区时区。
  • DST:Daylight Saving Time,夏令时。夏天日长,为节约用电,某些地区会将他们的时间定早一小时,即将时间向前挪,如将原来时间的7点定为8点,时钟调慢一小时,时区从UTC+8改为UTC+9。一段时间之后再恢复。
  • RTC:Real Time Clock,硬件时钟。即BIOS中记录的时间。
  • SC: System Clock,系统时钟。当前Linux内核的时间。每次Linux启动,会读取硬件时钟来作为系统时钟。

注意:NTP返回的标准时肯定是UTC+0的时间值而不会提供时区(因为它不知道你在哪里).所以当我们设置系统时间的时候,设置好时区是首先要做的工作。

二.设置相关
涉及的文件、目录及命令:
1)/etc/ntp.conf NTP服务的主要配置文件。
a)使用restrict来管理权限,设置方式: restrict mask [netmask_ip] [parameters]
parameters主要有

  • ignore:拒绝所有类型的NTP联机
  • nomodify:客户端不能更改NTP服务器的时间参数,但可以通过本主机来校时
  • noquery:不允许客户端进行校时
  • notrap:不提供trap这个远程时间登录(Remote Event Logging)功能
  • notrust:拒绝没有认证的客户端

没有在parameters的地方加上任何参数的话,表示该IP或网段不受任何限制。
b)设置上层NTP服务器: Server [ip or host name] [prefer]
用于校对自身时间,可以有多条。perfer表示优先使用。
c)以driftfile记录时间差异: driftfile [可以被ntpd写入的目录与文件]
driftfile保存本地时间与上层NTP服务器的差异,单位为百万分之一秒(ppm)
d)客户认证:keys[key_file] 除了以restrict来限制客户端联机外还可以通过密钥系统来给客户端认证。

2)/usr/share/zoneinfo Linux自身提供的,而不是NTP提供的。其下保存了编译好的各主要时区的时间设置文件。如中国基本上采用时区设置文件Asia/Shanghai。本目录下文件与/etc/sysconfig/clock和/etc/localtime中配置有关。

3)/etc/sysconfig/clock Linux的主要时区设置文件。每次Linux启动会自动读取这个文件来设置系统默认的显示时间。

4)/etc/localtime 本地端的“时间配置文件”。如果/etc/sysconfig/clock中ZONE=”Asia/Shanghai”,说明此文件是本地端的时间,此时Linux系统就会将/usr/share/zoneinfo/Asia/Shanghai另存为/etc/localtime,未来我们的时间显示就会以Asia/Shanghai这个时间设置文件位置了。
所以要修改时区设置,需要:
a.确定使用/usr/share/zoneinfo下哪个时间设置文件,假设为A
b.修改/etc/sysconfig/clock中ZONE=”A”
c.将A文件另存为/etc/localtime(覆盖原来的文件)
注意:
当/etc/localtime存在时,系统时区以该文件代表的时区来显示
当/etc/localtime不存在时,系统时区主要以GMT(或UTC为准)
5)/bin/date Linux系统上常见日期与时间输出指令,也可以设置系统时间(date -s)。注意,其并未修改硬件时钟。

6)/sbin/hwclock 将时间写入BIOS中。

7)/usr/sbin/ntpd NTP服务后台程序,需要启动才能提供NTP服务。其引用/etc/ntp.conf里面的设置。

8)/usr/sbin/ntpdate Client用来连接NTP Server的主要执行文件。

9)/usr/sbin/ntptrace 跟踪某台时间服务器的时间对应关系。

三、操作实践
下面以架设内网使用的NTP服务器为例,说明NTP服务器搭建。
需求:
1.本地NTP服务器选择就近网络的NTP进行校时
2.不对Internet提供服务,仅允许来自内部的查询,不允许查询的主机对时间进行修改。
3.检测系统时钟与硬件时钟的差异,并写入/var/lib/ntp/drift中
第一步:准备
1)检查程序安装情况:
检查本地是否安装了所需的程序 shell>rpm -qa | grep ntp
如果没有,则需要安装 shell>rpm -ivh ntp-4.2.2p1-9.el5_4.1.rpm

2)找到在互联网上给我们提供同步服务的NTP Server:
http://www.pool.ntp.org 是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个NTP Server。
中国常用的ntp服务器地址:
210.72.145.44 (国家授时中心服务器IP地址)
ntp.sjtu.edu.cn 上海交通大学网络中心NTP服务器地址
0.cn.pool.ntp.org
这里我们选定ntp.sjtu.edu.cn和210.72.145.44作为网络校时的上层NTP服务器。

3)在打开NTP服务器之前先和这些服务器做一个同步
使得我们机器的时间尽量接近标准时间. 这里我们可以用ntpdate命令
shell> ntpdate ntp.sjtu.edu.cn
6 Jul 01:21:49 ntpdate[4528]: step time server 213.222.193.35 offset -38908.575181 sec
shell> ntpdate 210.72.145.44
9 Jan 11:05:16 ntpdate[27222]: adjust time server 210.72.145.44 offset -0.123795 sec

假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次. 那么为什么在打开NTP服务之前先要手动运行同步呢?

  1. 因为根据NTP的设置,如果你的系统时间比正确时间要快的话那么NTP是不会帮你调整的,所以要么你把时间设置回去,要么先做一个手动同步
  2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.所以手动同步可以减少这段时间

注意: NTP服务启动后,NTP服务器就不能再用ntpdate来手动校时,会报如下的信息:
the NTP socket is in use, exiting

第二步:配置NTP Server
1)编辑/etc/ntp.conf
配置server:
server ntp.sjtu.edu.cn prefer
server 210.72.145.44
启用driftfile:
driftfile /var/lib/ntp/drift
基本的权限控制:
restrict default nomodify notrap nopeer noquery #首先对于默认的client拒绝所有操作
restrict 127.0.0.1 #允许本机地址的一切操作
restrict 192.168.2.0 mask 255.255.255.0 nomodify #允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间
原本内定的一个内部时间数据,不需要更改:
server 127.127.1.0 #local clock
fudge 127.127.1.0 startum 10
2)更新/etc/sysconfig/ntpd
shell>vi /etc/sysconfig/ntpd
# Drop root to id ‘ntp:ntp’ by default.
OPTIONS=”-u ntp:ntp -p /var/run/ntpd.pid”

# Set to ‘yes’ to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes #这样BIOS时间也会跟着改变
第三步:启动、查看服务

shell>/etc/init.d/ntpd start #启动服务
shell>chkconfig –level 35 ntpd on #配置开机启动
shell>netstat -ulnp #查看服务是否已经启动
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 192.168.2.18:123 0.0.0.0:* 5873/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 5873/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 5873/ntpd
udp 0 0 fe80::7a45:c4ff:fee:123 :::* 5873/ntpd
udp 0 0 ::1:123 :::* 5873/ntpd
udp 0 0 :::123 :::* 5873/ntpd
检查防火墙是否开启以及是否开放123端口访问
shell>/etc/init.d/iptables status
如果防火墙关闭状态,或者开启且chain INPUT (policy ACCEPT)部分包含了123端口,则没有问题,否则可以执行如下语句开启端口访问
shell>iptables -I INPUT -p 123 -j ACCEPT
启动NTP后约15分钟才会和上层NTP服务器顺利连接上,可以通过ntpstat来查看我们的NTP服务器是佛已经更新了自己的时间。
shell>ntpstat
unsynchronised
time server re-starting
polling server every 64 s
shell>ntpstat
synchronised to NTP server (202.120.2.101) at stratum 4
time correct to within 492 ms
polling server every 64 s
可以通过ntpq (NTP query)来监测服务器的运行,可以使用watch命令来查看一段时间内服务器各项数值的变化。
shell>watch ntpq -p
Every 2.0s: ntpq -p Wed Jan 9 12:56:20 2013

remote refid st t when poll reach delay offset jitter
==============================================================================
*dns.sjtu.edu.cn 202.118.1.130 3 u 87 64 376 9.574 2.052 2.119
+210.72.145.44 .ACTS. 1 u 25 16 275 62.827 -32.226 9.787
LOCAL(0) .LOCL. 10 l 19 64 377 0.000 0.000 0.001
各项内容含义如下:

  • remote: 它指的就是本地机器所连接的远程NTP服务器。最左边如果是*,则代表目前正在使用的主NTP Server,+则代表辅助的NTP Server,也已经连接上,-则表示远程服务器被clustering algorithm认为是不合格的NTP Server,x表示远程服务器不可用
  • refid: 它指的是给远程服务器(如dns.sjtu.edu.cn)提供时间同步的服务器
  • st: 远程服务器的级别,stratum。由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 所以服务器从高到低级别可以设定为1-16. 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的。
  • when: 几秒前曾经做过时间同步的操作。
  • poll: 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小
  • reach: 这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加
  • delay: 网络传输过程中延迟的时间
  • offset: 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别. offset越接近于0,我们就和服务器的时间越接近
  • jitter: 这是一个用来做统计的值. 它统计了在特定个连续的连接数里offset的分布情况. 简单地说这个数值的绝对值越小我们和服务器的时间就越精确

四.其他
1.zdump [时区名] 显示指定时区的当前时间。如:zdump Asia/Shanghai
注意,如果直接运行:zdump Shanghai,而不是Asia/Shanghai,会有警告,其输出实际是UTC+0而不是实际期望看到的值!
Shanghai Tue Jan 8 09:16:00 2013 Shanghai
zdump: warning: zone “Shanghai” abbreviation “Shanghai” has more than 6 alphabetics

2.设置时区,除了介绍/etc/localtime时提到的三步操作,还可以设置TZ环境变量。
TZ变量的值会override /etc/localtime. 也就是说当TZ变量没有定义的时候系统才使用/etc/localtime来确定time zone. 所以想永久修改time zone的话那么可以把TZ变量的设置写入/etc/profile里。
TZ=’Asia/Shanghai’; export TZ

3.硬件时钟设置
# hwclock –show
Fri 06 Jul 2007 12:27:17 AM BST -0.968931 seconds
通过hwclock –show命令我们可以查看机器上的硬件时间(always in local time zone), 我们可以看到它和系统时间还是有一定的误差的, 那么我们就需要把他们同步
# hwclock –hctosys 把硬件时间设置成系统时间
# hwclock –systohc 把系统时间设置成硬件时间 即 hwclock -w
# hwclock –set –date=”mm/dd/yy hh:mm:ss” 设置硬件时间我们可以开机的时候在BIOS里设定.也可以用hwclock命令

参考:
http://baike.baidu.com/view/100246.htm
http://tagche.blog.51cto.com/649757/269114
http://www.douban.com/note/171309770/
《鸟哥的Linux私房菜_服务器架设篇》

The post NTP服务器搭建 appeared first on SQLParty.


Viewing all articles
Browse latest Browse all 2

Trending Articles