零.相关知识
1.时间与时区
如果有人问你说现在几点? *你看了看表回答他说晚上8点了。这样回答看上去没有什么问题,但是如果问你的这个人在欧洲的话那么你的回答就会让他很疑惑,因为他那里还太阳当空呢。
*这里就有产生了一个如何定义时间的问题。为在地球环绕太阳旋转的24个小时中,世界各地日出日落的时间是不一样的.所以我们才有划分时区(timezone) 的必要,也就是把全球划分成24个不同的时区。所以我们可以把时间的定义理解为一个时间的值加上所在地的时区(注意这个所在地可以精确到城市)。
那么假如现在中国当地的时间是晚上8点的话。我们可以有下面两种表示方式:
- 20:00 CST
- 12:00 UTC
这里的 CST
是Chinese Standard Time
,即北京时间
。UTC
是Coordinated Universal Time
,即协调世界时
。
因为中国处在UTC+8时区,依次类推那么也就是12:00 UTC了。
2.硬件时间时钟 与 系统时钟
在我们的计算机上,存在两个时钟:硬件时间时钟(RTC),和系统时钟(System Clock)。
- 硬件时钟是指嵌在主板上的特殊的电路, 它的存在就是平时我们关机之后还可以计算时间的原因。
- 系统时钟就是操作系统内核计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的。
在Linux下,系统时间在开机的时候会和硬件时间同步(synchronization)。然而在这次同步之后,这两个时钟也就各自独立运行了(硬件时间依靠BIOS电池来维持,而系统时间依靠CPU tick来维持)。
查看系统时间:
1 | date |
修改系统时间:
1 | date -set "2017-05-01 00:01" |
查看当前硬件时钟对应的时间:
1 | hwclock --show |
我们可以看到,硬件时间和系统时间是会存在一定误差的,因此我们可以把他们同步。
将硬件时间设置成当前系统时间:
1 | hwclock --hctosys |
将当前系统时间设置成硬件时间:
1 | hwclock --systohc |
但是,问题在于【如果这两个时间都不准】怎么办呢?这时候就要在互联网上找一个可以提供准确时间的服务器,并通过一种协议将我们的系统时间,与服务器的时间进行同步,这就是NTP同步,这个协议就是NTP(Network Time Protocol)。
二.NTP Server搭建
我们的计算机运行一定时间后就会产生时间误差,真正能够精确地测算时间的还是原子钟。但是,由于原子钟十分的昂贵,只有少部分组织拥有。他们连接到计算机之后就成了一台 NTP Server
。
NTP Server
是用于给其他计算机进行时间同步的服务器。
在服务器集群中,通常会搭建一台NTP Server
,以向集群中的其他服务器提供时间同步服务。
事实上,这台NTP Server
也会向权威NTP Server
进行时间同步,通常会选择距离集群中这台NTP Server
最近的权威NTP Server
来进行同步。
权威ntp服务器列表:http://www.pool.ntp.org
下面我们来搭建集群中的这台NTP Server
:
1.查看NTP是否已经安装
1 | rpm -qa | grep ntp |
出现ntp-...
,说明已经安装了,我的本机已经安装了。如果没有安装,可用如下方式:
1 | yum -y install ntp |
2.ntpd 配置
(1)修改 ntpd 配置
我们在NTP的官方网站(http://www.pool.ntp.org)上找到距离我们服务器最近的权威 NTP Server
。
以中国为例:
- 0.cn.pool.ntp.org
- 1.cn.pool.ntp.org
- 2.cn.pool.ntp.org
- 3.cn.pool.ntp.org
我们在配置文件中修改依赖的权威 NTP Server
:
1 | vi /etc/ntp.conf |
1 | # server用来设置依赖的权威 NTP Server |
修改完成后先手动同步一次时间:
1 | ntpdate 0.cn.pool.ntp.org |
启动ntpd服务:
1 | systemctl start ntpd |
确认该NTP Server
是否已经向权威NTP Server
同步时间:
1 | ntpstat |
如果是这样,说明已经成功向权威NTP Server
同步了,且每1分钟触发一次同步:
(2)设置 ntpd
将 ntpd 设置为开机启动:
1 | systemctl enable ntpd |
重启后,检查ntpd是否会自动开机启动:
1 | systemctl status ntpd |
从下面的图中,看到ntpd已经被设置成自动开机启动了,但是事实上,在开机后,启动并未成功。
引起这个问题常见的原因有可能是系统上安装了一个与 ntpd 相冲突的工具:chrony
。
检查 chronyd 是否被设置为开机自动启动:
1 | systemctl status chronyd |
下图可以看到,chronyd 确实被设置为开机自动启动了:
禁止 chronyd 开机启动:
1 | systemctl disable chronyd |
三.NTP client设置
类似地,首先查看NTP是否已经安装:
1 | rpm -qa | grep ntp |
如果没有安装,用如下方式:
1 | yum -y install ntp |
在客户端 NTP的配置文件中,加上我的这台NTP Server
:
1 | vi /etc/ntp.conf |
增加下面几条设置:
1 | # 允许我们的NTP Server 做为本地的时间服务器 |
如果客户端与NTP Server
的时间差异太大,可能会出现客户端同步失败的情况。因此,先在客户端手动同步一把。
手动同步时间:
1 | ntpdate 服务器IP |
注意,每次重启NTP Server
之后大约要3-5分钟,客户端主机才能与 Server 建立正常的通讯连接。
四.验证NTP Server的服务
NTP Server上查看端口是否存在:
1 | netstat -tulnp | grep ntp |
NTP Server上查看现有连接客户端:
1 | watch ntpq -p |
client 上查看同步的结果:
1 | ntpstat |
1 | synchronised to local net at stratum 11 |