共计 18113 个字符,预计需要花费 46 分钟才能阅读完成。
在上文 Linux 系统安装后的基础优化 - 基于 CentOS(5.8/6.4)中 http://www.linuxidc.com/Linux/2013-11/92274.htm,我们提到了如何定时自动更新服务器时间。同时也提到了,当内网机器数量巨大时,如果都去公网 ntp 服务器更新时间是会有延时。当然,这也不是仅仅是部署 ntp 服务器的唯一意义。
在生产环境中,当内网部署了集群时,我们会发现时间对于定位问题发生的先后和原因是非常重要的;而且很多时候,作为提供数据应用的服务器都不能直接连通互联网,此时,我们就需要在内网部署一台专用于时间同步的机器了,这样,服务器通过局域网对 ntp 进行时间同步即可。
本篇将带领大家先了解一下时间的相关概念和 ntp 的一些常识。
一、时间和时区
地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。因此,为了克服时间上的混乱,在 1884 年华盛顿的一次国际经度会议上,把全球划为了 24 个时区 (东、西各 12 个时区),规定了格林威治时间(GMT) 为 0 时区时间。而我国首都北京则为东 8 区,并且我国也将此时间作为全国统一时间,即为北京时间。因此,也就有了我们日常所说的时间的标准了。我们可以理解为,时间是基于时区给出的定义。
然而,我们在计算机中经常看到的是 (UTC+08:00)。UTC 是英文 Coordinated Universal Time 的缩写,翻译为协调世界时。而 UTC+08:00 则代表北京为东 8 区。因此可想而知 UTC +00:00 即为格林威治时间。
为什么要提这些呢?
第一,不论我们通过哪种渠道来更新系统的时间,通常公共 ntp 服务器只会给我们 UTC +00:00 的时间值,而不是我们当前时区的时间值,因为它也不知道我们在呢啊,所以当我们在安装系统的时候,选择时区那一步非常重要。
第二,我国是有夏令时的,也许哪天就会拨快 1 小时,让你从东 8 区变成东 9 区。当然,到时候还会再拨慢回来的。此时,如果我们设置了正确的时区,当需要改变时间的时候,系统就会自动替我们做出调整。
二、linux 的时区
在安装 linux 的时候,有一步是让你选择时区的,还记得吧。那么如果我们想更改时区,或者说安装的时候设置错了,怎么办呢?不用担心!因为在 linux 下 glibc 已经提供给我们了许多编译好的 timezone 文件,并且把他们存放在了 /usr/share/zoneinfo 目录下,这里面基本涵盖了大部分的国家和城市。
[root@c64ntp ~]# ls /usr/share/zoneinfo/
Africa Canada GB Indian Mexico ROC Zulu
America Chile GB-Eire Iran Mideast ROK iso3166.tab
Antarctica Cuba GMT Israel NZ Singapore posix
Arctic EET GMT+0 Jamaica NZ-CHAT Turkey posixrules
Asia EST GMT-0 Japan Navajo UCT right
Atlantic EST5EDT GMT0 Kwajalein PRC US zone.tab
Australia Egypt Greenwich Libya PST8PDT UTC
Brazil Eire HST MET Pacific Universal
CET Etc Hongkong MST Poland W-SU
CST6CDT Europe Iceland MST7MDT Portugal WET
当我们想查看某个时区的时间时,我们可以用 zdump 命令
[root@c64-client ~]# zdump Cuba
Sat Nov 2 08:42:13 CDT 2013 #古巴的时间已经出来了
可是当我们想更改时区的时候怎么办呢?
1、修改 /etc/localtime 文件
/etc/localtime 文件定义了我们所在的本地时区,我们可以通过从 /usr/share/zoneinfo/ 下复制我们需要的时区文件去替换 /etc/localtime 来达到更改时区的目的,例如,这里我们将时区更改为 Cuba 的时区
123 [root@c64-client ~]# /bin/cp /usr/share/zoneinfo/Cuba /etc/localtime
[root@c64-client ~]# date
Sat Nov 2 08:44:49 CDT 2013 #时区已经更改为了 Cuba 时区
当然,我们也可以用软连接的方法来进行时区更换,这次我们更换为 Canada 的时区
[root@c64-client ~]# ln -sf /usr/share/zoneinfo/Canada /etc/localtime
[root@c64-client ~]# date
Sat Nov 2 12:46:54 UTC 2013 #这样刚才 Cuba 的时区就又变成了 Canada 的时区了。
2、设置 TZ 环境变量的值
环境变量大家应该不陌生,时区也是有它自己的环境变量值的,并且很多程序和命令都要调用这个变量的值。这里我们通过 tzselect 命令来教大家如何设置 TZ 环境变量的值。本例以上海时间为例。
[root@c64-client ~]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean. #这里让你选择一个大陆或海洋
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none – I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country. #接下来让你选择一个国家或者城市
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions. #现在让你从以下时间区区域中做出选择。
1) east China – Beijing, Guangdong, Shanghai, etc. #因为我们要选择上海时区,所以选择这个。
2) Heilongjiang (except Mohe), Jilin
3) central China – Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
China
east China – Beijing, Guangdong, Shanghai, etc.
Therefore TZ=’Asia/Shanghai’ will be used.
Local time is now: Sat Nov 2 20:52:38 CST 2013.
Universal Time is now: Sat Nov 2 12:52:38 UTC 2013.
Is the above information OK?
1) Yes
2) No
#? 1
You can make this change permanent for yourself by appending the line
TZ=’Asia/Shanghai’; export TZ #它会在这里生成你更改这个环境变量的命令,下面执行这个命令即可更改时区
to the file ‘.profile’ in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
[root@c64-client ~]# TZ=’Asia/Shanghai’; export TZ
[root@c64-client ~]# date
Sat Nov 2 20:52:49 CST 2013 #可以看到我们的时间已经更改为了上海时间
我们知道如何设置 linux 的时区后,下面就是计算机的时间问题了。
三、计算机的时间
一台计算机上我们是有两个时钟的,一个是硬件时间时钟(Real Time Clock 简称 RTC),一个是系统时间(System Clock)。
硬件时钟是指嵌在主板上的特殊的电路。正因为有它存在,我们电脑在关机之后,还能保持正常进行计时。
系统时钟就是操作系统的 kernel 所用来计算时间的时钟。它是从 1970 年 1 月 1 日 00:00:00 的 UTC 时间到目前为止的秒数总和之值。在 Linux 下,系统时间在开机的时候会和硬件时间进行同步 (synchronization),之后就开始各自独立运行了。
那么既然两个时钟各自独自运行, 那么时间久了必然就会产生误差。下面我实时输出计算机的系统时间和硬件时间
[root@c64-client ~]# date #查看系统时间
Sat Nov 2 21:02:29 CST 2013
[root@c64-client ~]# hwclock –show #查看硬件时间
Sun Nov 3 05:02:22 2013 -0.126978 seconds
我们可以看出,硬件时间和系统时间是不相等的。我们可以通过下面两个命令,灵活的进行时间同步。
[root@c64-client ~]# hwclock –hctosys #将硬件时间设置成系统时间
[root@c64-client ~]# hwclock –systohc #将系统时间设置成硬件时间
知道了如何同步两个时间,那么如果如果想更改怎么做呢?
12 [root@c64-client ~]# hwclock –set –date=”mm/dd/yy hh:mm:ss” #修改硬件时间到指定时间
[root@c64-client ~]# date -s “dd/mm/yyyy hh:mm:ss” #修改系统时间到指定时间
现在我们知道了如何设置系统和硬件的时间,那么当两个时间都不准确了怎么办呢?
此时,我们就要用到文章开头提到的 NTP 服务器了。我们已经知道了 NTP 服务器是提供时间同步服务了。
那么 NTP 服务器是怎么工作的呢?
通过谷歌查阅文档,我们知道 NTP 服务器是基于 NTP 协议想客户端提供时间同步服务的。NTP(Network Time Protocol)是一种用来使系统和一个精确的时间源保持时间同步的协议。NTP 协议是通过 Server 和 Client 的方式进行的。
下面我们引入网络设备中的 NTP 工作原理,来让大家理解。
Device A 发送一个 NTP 报文给 Device B,该报文带有它离开 Device A 时的时间戳,该时间戳为 10:00:00am(T1)。
当此 NTP 报文到达 Device B 时,Device B 加上自己的时间戳,该时间戳为 11:00:01am(T2)。
当此 NTP 报文离开 Device B 时,Device B 再加上自己的时间戳,该时间戳为 11:00:02am(T3)。
当 Device A 接收到该响应报文时,Device A 的本地时间为 10:00:03am(T4)。
至此,Device A 已经拥有足够的信息来计算两个重要的参数:
NTP 报文的往返时延 Delay=(T4-T1)-(T3-T2)= 2 秒。
Device A 相对 Device B 的时间差 offset=((T2-T1)+(T3-T4))/2= 1 小时。
虽然 NTP 协议中有对往返时延的计算,但是在生产环境中还是会因为时延问题导致时间不同步,原因出在哪里呢?
时间延迟通常由 2 部分构成,一部分来自于外部网络传输上的延迟,一部分来自于内部协议层编解码时标的过程中。NTP 协议本身的计算就加入了网络传输延迟的因素,因此只要 NTP 从钟有优秀的同步计算能力,传输延时并不会对同步精度产生很大影响,此时内部协议层编解码时标的过程中产生的时间延迟是影响网络同步精度的主要因素。传统的 NTP 网络中,如果 NTP 从钟和 NTP 服务器之间间隔了多个 stratum,由于在每个节点编解码时标时都产生时延,因此这个 NTP 从钟所获得的时间精度较差。
综上所述,在生产环境中,我们受降低时延和解决后端数据应用服务器无法连接公网,却又必须进行时间同步这两方面的因素影响,促使我们必须在内网搭建一台或两台 NTP 服务器(实现负载均衡高可用)来实现我们企业内部的时间同步服务。
OK! 本文就讲到这里了,该讲的原理都讲的差不多了。由于时间在我们生产环境应用中非常重要,所以此篇幅略有点长。下篇我将详细讲解,如何在企业内网部署 NTP 服务器。更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2013-11/92275p2.htm
参考阅读:
时间服务器 NTP 搭建 http://www.linuxidc.com/Linux/2013-04/82112.htm
Ubuntu 搭建 NTP 服务器 http://www.linuxidc.com/Linux/2013-03/80285.htm
CentOS 6.3 下 NTP 服务安装和配置 http://www.linuxidc.com/Linux/2012-12/76836.htm
Linux 下的 NTP 服务器 http://www.linuxidc.com/Linux/2013-07/88030.htm
RHCE 认证之 Rsyslog 日志管理、NTP 和 Rsync 备份同步 http://www.linuxidc.com/Linux/2013-10/91456.htm
上篇 Linux 实战部署系列之 ntp 服务器 —- 理论篇为大家介绍时间的相关概念和 ntp 的原理(http://www.linuxidc.com/Linux/2013-11/92275.htm),本篇博文将带大家一起部署实现负载均衡和高可用的 NTP 服务器。
简易架构图:
环境:
CentOS6.4 x86_64
server-1 192.168.1.111 NTP 服务器 1
server-2 192.168.1.112 NTP 服务器 2
client 192.168.1.113 作为客户端的某台业务服务器
ntp-4.2.4p8-3.el6.centos.x86_64
一、ntp 服务端
1、检查并安装 ntp 服务
[root@c64-ntp-1 ~]# rpm -qa|grep ntp #如果出现下面两个就说明本机已经有了
ntpdate-4.2.4p8-3.el6.centos.x86_64
ntp-4.2.4p8-3.el6.centos.x86_64
如果没有,我们执行下面的命令进行安装
[root@c64-ntp-1 ~]# yum install ntp -y
2、同步 NTP 服务器时间
由于 NTP 的限制,如果系统时间比正确的时间要快的话,NTP 是不会帮你做调整的,而且当你的时间设置和正确的时间相差很大的时候,NTP 会花上很长一段时间进行同步调整,因此鉴于此,我们需要先做一个同步。
首先我们要先确定好自己的时区, 最好根据所在地点从新设置时区,本例以上海为例
[root@c64-ntp-1 ~]#/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #这样我们就将时区设置成上海了
[root@c64-ntp-1 ~]# date
Sat Nov 2 23:17:36 CST 2013 #可以看到我们的时区已经设置过来了
接下来就要向互联网上的 NTP 服务器进行时间同步了。这里你如果没有 NTP 服务器的地址,你可以到 http://www.pool.ntp.org(NTP 官网)去找离自己城市最近的 NTP 服务器。由于我用的是上海的地址,所以这里我将离上海最近的 3 个 NTP 服务器贴出来。
server 1.cn.pool.ntp.org
server 3.asia.pool.ntp.org
server 0.asia.pool.ntp.org
同步本机时间的命令是
[root@c64-ntp-1 ~]# /usr/sbin/ntpdate 1.cn.pool.ntp.org
2 Nov 23:05:34 ntpdate[11560]: adjust time server 218.75.4.130 offset -0.114499 sec
[root@c64-ntp-1 ~]# /usr/sbin/ntpdate 1.cn.pool.ntp.org #为了减少时延,我们最好执行两遍
2 Nov 23:05:41 ntpdate[11561]: adjust time server 218.75.4.130 offset -0.111105 sec
3、配置 NTP 服务器
其实,此时我们用 /usr/sbin/ntpd start 已经可以向客户端提供时间更新服务了。但是,这样是满足不了企业安全性需求的。下面将为大家讲解 ntp 的主配置文件设定。
1)解决 NTP 服务器校准时间时的传送延迟
使用 driftfile 参数设置: driftfile 文件名
用途: 将与上级时间服务器联系时所花费的时间,记录在 driftfile 参数后面指定的文件内
注意:driftfile 后面必须接完整的文件路径,不能是链接文件,并且必须要有 ntpd 守护进程可以写入的权限。
对应默认配置项:
1 driftfile /var/lib/ntp/drift
2)权限的控制主要靠 restrict 这个参数
要的语法为:restrict IP mask 掩码 参数
IP 规定了允许或不允许访问的地址(此处若为 default,即为 0.0.0.0 所有 ip),配合掩码可以对某一网段进行限制。
参数包括:
ignore:关闭所有 NTP 服务
nomodify:客户端不能修改服务端的时间,但可以作为客户端的校正服务器
noquery:不提供时间查询,即用户端不能使用 ntpq,ntpc 等命令来查询 ntp 服务器
nopeer:不与同一层的其他服务器进行时间同步
kod:kod 技术可以阻止“kiss of death”包(一种 DOS 攻击)对服务器的破坏
notrap:不提供 trap 远端事件登陆的功能
notrust:客户端除非通过认证,否则指定的网段为不信任网段 #ntp4.2 之后的版本,已经默认没有这个参数,如果你添加了,会报错的。
对应默认配置项:
restrict default kod nomodify notrap nopeer noquery #默认对所有 client 拒绝所有的操作
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1 #允许本机地址的一切操作
restrict -6 ::1
3)用 server 这个参数设定上级时间服务器
语法为:server IP 地址或域名 [prefer]
IP 地址或域名即为该 NTP 服务器指定的上级 NTP 服务器。当指定多个 NTP 服务器时,使用 prefer 参数的服务器优先级最高,如果都没有使用 prefer 参数,那么服务器的优先级则按从上到下的顺序依次由高到低。在指定上层服务器后,至少 15min 才会与上层 NTP 服务器进行时间校对。
对应默认配置项:
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
下面我们要对配置文件进行精简和更改,更改之后的配置文件如下:
[root@c64-server-1 ~]# cat /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery notrust #默认对所有 client 拒绝所有的操作
restrict 127.0.0.1 #允许本机地址的一切操作
restrict 192.168.1.0 mask 255.255.255.0 nomodify #允许局域网内所有 client 连接到这台服务器同步时间. 但是拒绝让他们修改服务器上的时间
server 1.cn.pool.ntp.org perfer #指定该上级 NTP 服务器为最优先
server 3.asia.pool.ntp.org #这个上级 NTP 服务器是在官网找到离上海最近的 NTP 服务器
server 0.asia.pool.ntp.org #这里我们也可以用上海交大之类提供的公益性 NTP 服务器
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
配置完成之后,我们就可以启动服务
12 [root@c64-ntp-1 ~]# /etc/init.d/ntpd start
Starting ntpd: [OK]
启动完成后,我们通过查看端口和进程来看服务是否真的起来了
[root@c64-ntp-1 ~]# netstat -lntup|grep ntp
udp 0 0 192.168.1.113:123 0.0.0.0:* 11992/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 11992/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 11992/ntpd
udp 0 0 fe80::20c:29ff:fe06:9c22:123 :::* 11992/ntpd
udp 0 0 ::1:123 :::* 11992/ntpd
udp 0 0 :::123 :::* 11992/ntpd
[root@c64-ntp-1 ~]# ps -ef |grep ntp|grep -v grep
ntp 11992 1 0 02:17 ? 00:00:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
加入开机启动项
[root@c64-ntp-1 ~]# echo ‘#ntp server boot configuration by sunsky in 20131020’ >>/etc/rc.local
[root@c64-ntp-1 ~]# echo ‘/etc/init.d/ntpd start start’ >>/etc/rc.local
[root@c64-ntp-1 ~]# tail -2 /etc/rc.local #检查配置结果
#ntp server boot configuration by sunsky in 20131020
/etc/init.d/ntpd start
四、负载均衡和高可用配置
为了保证实际生产环境中业务的可持续运作,一台 NTP 服务器有时间是不能满足需求了,因此这里我们需要做负载均衡和高可用,即平时分担两台 NTP 服务器的查询负载,即时一台 NTP 服务器挂掉,另外一台服务器还能照常提供时间同步服务。
由于上面我们已经配置出一台 NTP 服务器了,所以说这里我们只需要按照上面的部署方法,再部署一台即可。
五、客户端配置
1、测试时间同步
现在我们在客户端进行时间同步的测试,同时要注意将系统时间和硬件时间进行同步,同步命令可以用 hwclock systohc 或者 hwclock –w。
[root@c64-client /]# /usr/sbin/ntpdate 192.168.1.111&&hwclock -w
3 Nov 03:50:34 ntpdate[19587]: adjust time server 192.168.1.111 offset -0.046270 sec
[root@c64-client /]# /usr/sbin/ntpdate 192.168.1.112&&hwclock -w
3 Nov 03:50:48 ntpdate[19589]: adjust time server 192.168.1.112 offset -0.039505 sec
2、添加定时任务
因为我们不可能一直手动去同步时间,因此我们需要将同步时间命令添加到定时任务中去。由于我们启用了 2 台时间服务器,所以在客户端进行更新时间的定时任务设置时,我们就采用 2 台服务器每 5 分钟轮流更新的方式。
[root@c64-client ~]# echo ‘*/5 * * * * /usr/sbin/ntpdate 192.168.1.111&&hwclock -w >/dev/null 2>&1’ >>/var/spool/cron/root
[root@c64-client ~]# echo ‘*/10 * * * * /usr/sbin/ntpdate 192.168.1.112&&hwclock -w >/dev/null 2>&1’ >>/var/spool/cron/root
添加之后,别忘了用下面的命令查看结果哦。
[root@c64-client /]# crontab -l
*/5 * * * * /usr/sbin/ntpdate 192.168.1.111&&hwclock -w >/dev/null 2>&1
*/10 * * * * /usr/sbin/ntpdate 192.168.1.112&&hwclock -w >/dev/null 2>&1
确认无误之后,我们的部署就 OK 了!
到这里为止,我们的负载均衡和高可用的 NTP 服务器已经部署完成了。其中还有很多后期维护和故障的摆错,我将放到下一篇博文来讲解。因此,在本篇只要大家能按照这个部署下来,就已经很不错了。NTP 服务器部署的过程很简单,它复杂就复杂在世面上可供大家参考的资料少,有些参数的效果也不是太好。一旦出错,就让人很郁闷头疼了。所以,关于 NTP 的一些细节概念一定要把握好。
更多 CentOS 相关信息见CentOS 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=14
在上文 Linux 系统安装后的基础优化 - 基于 CentOS(5.8/6.4)中 http://www.linuxidc.com/Linux/2013-11/92274.htm,我们提到了如何定时自动更新服务器时间。同时也提到了,当内网机器数量巨大时,如果都去公网 ntp 服务器更新时间是会有延时。当然,这也不是仅仅是部署 ntp 服务器的唯一意义。
在生产环境中,当内网部署了集群时,我们会发现时间对于定位问题发生的先后和原因是非常重要的;而且很多时候,作为提供数据应用的服务器都不能直接连通互联网,此时,我们就需要在内网部署一台专用于时间同步的机器了,这样,服务器通过局域网对 ntp 进行时间同步即可。
本篇将带领大家先了解一下时间的相关概念和 ntp 的一些常识。
一、时间和时区
地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早。东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便。因此,为了克服时间上的混乱,在 1884 年华盛顿的一次国际经度会议上,把全球划为了 24 个时区 (东、西各 12 个时区),规定了格林威治时间(GMT) 为 0 时区时间。而我国首都北京则为东 8 区,并且我国也将此时间作为全国统一时间,即为北京时间。因此,也就有了我们日常所说的时间的标准了。我们可以理解为,时间是基于时区给出的定义。
然而,我们在计算机中经常看到的是 (UTC+08:00)。UTC 是英文 Coordinated Universal Time 的缩写,翻译为协调世界时。而 UTC+08:00 则代表北京为东 8 区。因此可想而知 UTC +00:00 即为格林威治时间。
为什么要提这些呢?
第一,不论我们通过哪种渠道来更新系统的时间,通常公共 ntp 服务器只会给我们 UTC +00:00 的时间值,而不是我们当前时区的时间值,因为它也不知道我们在呢啊,所以当我们在安装系统的时候,选择时区那一步非常重要。
第二,我国是有夏令时的,也许哪天就会拨快 1 小时,让你从东 8 区变成东 9 区。当然,到时候还会再拨慢回来的。此时,如果我们设置了正确的时区,当需要改变时间的时候,系统就会自动替我们做出调整。
二、linux 的时区
在安装 linux 的时候,有一步是让你选择时区的,还记得吧。那么如果我们想更改时区,或者说安装的时候设置错了,怎么办呢?不用担心!因为在 linux 下 glibc 已经提供给我们了许多编译好的 timezone 文件,并且把他们存放在了 /usr/share/zoneinfo 目录下,这里面基本涵盖了大部分的国家和城市。
[root@c64ntp ~]# ls /usr/share/zoneinfo/
Africa Canada GB Indian Mexico ROC Zulu
America Chile GB-Eire Iran Mideast ROK iso3166.tab
Antarctica Cuba GMT Israel NZ Singapore posix
Arctic EET GMT+0 Jamaica NZ-CHAT Turkey posixrules
Asia EST GMT-0 Japan Navajo UCT right
Atlantic EST5EDT GMT0 Kwajalein PRC US zone.tab
Australia Egypt Greenwich Libya PST8PDT UTC
Brazil Eire HST MET Pacific Universal
CET Etc Hongkong MST Poland W-SU
CST6CDT Europe Iceland MST7MDT Portugal WET
当我们想查看某个时区的时间时,我们可以用 zdump 命令
[root@c64-client ~]# zdump Cuba
Sat Nov 2 08:42:13 CDT 2013 #古巴的时间已经出来了
可是当我们想更改时区的时候怎么办呢?
1、修改 /etc/localtime 文件
/etc/localtime 文件定义了我们所在的本地时区,我们可以通过从 /usr/share/zoneinfo/ 下复制我们需要的时区文件去替换 /etc/localtime 来达到更改时区的目的,例如,这里我们将时区更改为 Cuba 的时区
123 [root@c64-client ~]# /bin/cp /usr/share/zoneinfo/Cuba /etc/localtime
[root@c64-client ~]# date
Sat Nov 2 08:44:49 CDT 2013 #时区已经更改为了 Cuba 时区
当然,我们也可以用软连接的方法来进行时区更换,这次我们更换为 Canada 的时区
[root@c64-client ~]# ln -sf /usr/share/zoneinfo/Canada /etc/localtime
[root@c64-client ~]# date
Sat Nov 2 12:46:54 UTC 2013 #这样刚才 Cuba 的时区就又变成了 Canada 的时区了。
2、设置 TZ 环境变量的值
环境变量大家应该不陌生,时区也是有它自己的环境变量值的,并且很多程序和命令都要调用这个变量的值。这里我们通过 tzselect 命令来教大家如何设置 TZ 环境变量的值。本例以上海时间为例。
[root@c64-client ~]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean. #这里让你选择一个大陆或海洋
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none – I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country. #接下来让你选择一个国家或者城市
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions. #现在让你从以下时间区区域中做出选择。
1) east China – Beijing, Guangdong, Shanghai, etc. #因为我们要选择上海时区,所以选择这个。
2) Heilongjiang (except Mohe), Jilin
3) central China – Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
China
east China – Beijing, Guangdong, Shanghai, etc.
Therefore TZ=’Asia/Shanghai’ will be used.
Local time is now: Sat Nov 2 20:52:38 CST 2013.
Universal Time is now: Sat Nov 2 12:52:38 UTC 2013.
Is the above information OK?
1) Yes
2) No
#? 1
You can make this change permanent for yourself by appending the line
TZ=’Asia/Shanghai’; export TZ #它会在这里生成你更改这个环境变量的命令,下面执行这个命令即可更改时区
to the file ‘.profile’ in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
[root@c64-client ~]# TZ=’Asia/Shanghai’; export TZ
[root@c64-client ~]# date
Sat Nov 2 20:52:49 CST 2013 #可以看到我们的时间已经更改为了上海时间
我们知道如何设置 linux 的时区后,下面就是计算机的时间问题了。
三、计算机的时间
一台计算机上我们是有两个时钟的,一个是硬件时间时钟(Real Time Clock 简称 RTC),一个是系统时间(System Clock)。
硬件时钟是指嵌在主板上的特殊的电路。正因为有它存在,我们电脑在关机之后,还能保持正常进行计时。
系统时钟就是操作系统的 kernel 所用来计算时间的时钟。它是从 1970 年 1 月 1 日 00:00:00 的 UTC 时间到目前为止的秒数总和之值。在 Linux 下,系统时间在开机的时候会和硬件时间进行同步 (synchronization),之后就开始各自独立运行了。
那么既然两个时钟各自独自运行, 那么时间久了必然就会产生误差。下面我实时输出计算机的系统时间和硬件时间
[root@c64-client ~]# date #查看系统时间
Sat Nov 2 21:02:29 CST 2013
[root@c64-client ~]# hwclock –show #查看硬件时间
Sun Nov 3 05:02:22 2013 -0.126978 seconds
我们可以看出,硬件时间和系统时间是不相等的。我们可以通过下面两个命令,灵活的进行时间同步。
[root@c64-client ~]# hwclock –hctosys #将硬件时间设置成系统时间
[root@c64-client ~]# hwclock –systohc #将系统时间设置成硬件时间
知道了如何同步两个时间,那么如果如果想更改怎么做呢?
12 [root@c64-client ~]# hwclock –set –date=”mm/dd/yy hh:mm:ss” #修改硬件时间到指定时间
[root@c64-client ~]# date -s “dd/mm/yyyy hh:mm:ss” #修改系统时间到指定时间
现在我们知道了如何设置系统和硬件的时间,那么当两个时间都不准确了怎么办呢?
此时,我们就要用到文章开头提到的 NTP 服务器了。我们已经知道了 NTP 服务器是提供时间同步服务了。
那么 NTP 服务器是怎么工作的呢?
通过谷歌查阅文档,我们知道 NTP 服务器是基于 NTP 协议想客户端提供时间同步服务的。NTP(Network Time Protocol)是一种用来使系统和一个精确的时间源保持时间同步的协议。NTP 协议是通过 Server 和 Client 的方式进行的。
下面我们引入网络设备中的 NTP 工作原理,来让大家理解。
Device A 发送一个 NTP 报文给 Device B,该报文带有它离开 Device A 时的时间戳,该时间戳为 10:00:00am(T1)。
当此 NTP 报文到达 Device B 时,Device B 加上自己的时间戳,该时间戳为 11:00:01am(T2)。
当此 NTP 报文离开 Device B 时,Device B 再加上自己的时间戳,该时间戳为 11:00:02am(T3)。
当 Device A 接收到该响应报文时,Device A 的本地时间为 10:00:03am(T4)。
至此,Device A 已经拥有足够的信息来计算两个重要的参数:
NTP 报文的往返时延 Delay=(T4-T1)-(T3-T2)= 2 秒。
Device A 相对 Device B 的时间差 offset=((T2-T1)+(T3-T4))/2= 1 小时。
虽然 NTP 协议中有对往返时延的计算,但是在生产环境中还是会因为时延问题导致时间不同步,原因出在哪里呢?
时间延迟通常由 2 部分构成,一部分来自于外部网络传输上的延迟,一部分来自于内部协议层编解码时标的过程中。NTP 协议本身的计算就加入了网络传输延迟的因素,因此只要 NTP 从钟有优秀的同步计算能力,传输延时并不会对同步精度产生很大影响,此时内部协议层编解码时标的过程中产生的时间延迟是影响网络同步精度的主要因素。传统的 NTP 网络中,如果 NTP 从钟和 NTP 服务器之间间隔了多个 stratum,由于在每个节点编解码时标时都产生时延,因此这个 NTP 从钟所获得的时间精度较差。
综上所述,在生产环境中,我们受降低时延和解决后端数据应用服务器无法连接公网,却又必须进行时间同步这两方面的因素影响,促使我们必须在内网搭建一台或两台 NTP 服务器(实现负载均衡高可用)来实现我们企业内部的时间同步服务。
OK! 本文就讲到这里了,该讲的原理都讲的差不多了。由于时间在我们生产环境应用中非常重要,所以此篇幅略有点长。下篇我将详细讲解,如何在企业内网部署 NTP 服务器。更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2013-11/92275p2.htm
参考阅读:
时间服务器 NTP 搭建 http://www.linuxidc.com/Linux/2013-04/82112.htm
Ubuntu 搭建 NTP 服务器 http://www.linuxidc.com/Linux/2013-03/80285.htm
CentOS 6.3 下 NTP 服务安装和配置 http://www.linuxidc.com/Linux/2012-12/76836.htm
Linux 下的 NTP 服务器 http://www.linuxidc.com/Linux/2013-07/88030.htm
RHCE 认证之 Rsyslog 日志管理、NTP 和 Rsync 备份同步 http://www.linuxidc.com/Linux/2013-10/91456.htm