环境准备:
- 服务器集群
我准备了4台虚拟机,主机名分别是node01、node02、node03、node04,操作系统版本为CentOS-6.6
虚拟机集群的准备,可以参考以下两篇文章:
在Windows中安装一台Linux虚拟机
通过已有的虚拟机克隆四台虚拟机
1. 查看系统当前时间和时区
# 查看时间
[root@hadoop01 ~]# date
Thu Nov 23 04:37:46 CST 2017
[root@hadoop01 ~]# date -R # 显示时区
Thu, 23 Nov 2017 04:37:40 +0800
[root@hadoop01 ~]# date '+%Y-%m-%d %H:%M:%S' # 按照指定格式显示日期时间
2017-11-23 04:38:15
# 查看时区
[root@hadoop01 ~]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
2. 修改时区
要做到服务器集群的时间同步,集群中各台机器的时区必须相同的,我们在国内就使用中国时区,如果你的机器的时区不是"Asia/Shanghai",需要修改时区
CentOS 中时区是以文件形式存在,当前正在使用的时区文件位于
/etc/localtime
,其他时区文件则位于/usr/share/zoneinfo
下,中国时区的文件全路径是/usr/share/zoneinfo/Asia/Shanghai
(1) 如果系统中有/usr/share/zoneinfo/Asia/Shanghai
这个文件
要更改时区,直接使用如下命令就OK
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
(2) 如果没有 Asia/Shanghai 时区文件
需要使用 tzselect
命令去生成时区文件,生成好的时区文件就在/usr/share/zoneinfo 目录下,具体步骤去下:
<1> 执行tzselect命令
[root@hadoop01 ~]# 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) Beijing Time
2) Xinjiang Time
#? 1 # 只能选择北京时间和新疆时间,但即使选择了北京时间,最后生成的也是上海时区的文件
The following information has been given:
China
Beijing Time
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Thu Nov 23 04:44:37 CST 2017.
Universal Time is now: Wed Nov 22 20:44:37 UTC 2017.
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 # 很无奈,不是北京,但问题不大
<2> 执行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这个命令
<3> 执行cat /etc/sysconfig/clock
命令验证,如果ZONE的值不是Asia/Shanghai
,手动改为这个值,注意,不执行第<1>步直接手动修改是无效果的
3. 集群时间同步方法一:手动修改
使用date -s
命令来修改系统时间
[root@node01 ~]# date -s 12/25/2016
[root@node01 ~]# date -s 19:57:30
[root@node01 ~]# date -s "2017-11-22 20:50:30"
# 手动修改后,使用以下命令,把系统时间写入主板,这样,即使服务器关机或断电,时间也会更新
[root@node01 ~]# hwclock -w
让集群所有的服务器的时间同步,就用远程连接工具连接所有服务器,然后在所有的服务器中同时执行date -s
命令设置时间,然后在所有的服务器中执行hwclock -w
命令即可
4. 集群时间同步方法二:自动同步网络时间(需要网络)
(1) 通过外网同步时间
[root@node01 ~]# ntpdate time.nist.gov
# 或者
[root@node01 ~]# ntpdate 192.43.244.18
美国标准技术院时间服务器:time.nist.gov(192.43.244.18)
上海交通大学网络中心NTP服务器地址:ntp.sjtu.edu.cn(202.120.2.101)
中国国家授时中心服务器地址:cn.pool.ntp.org(210.72.145.44)
若以上提供的网络时间服务器不可用,请自行上网寻找可用的网络时间服务器
(2)设置自动执行任务,定时更新时间
<1> 使用命令:crontab -e
[root@node01 ~]# crontab -e
<2> 然后往里加入一行内容
*/10 * * * * ntpdate 202.120.2.101
上面的配置表示,每隔十分钟从 202.120.2.101
该时间服务器同步一次时间。
<3> 保存退出
(3) 说明
以上两步操作可以让node01这个服务器每隔10分钟去指定的服务器同步时间,如果需要让集群中的所有服务器(hadoop01-hadoop04)时间同步,那么每台服务器都要做以上两步操作。
5. 集群时间同步方法三:局域网内选一台服务器作为时间服务器,其他服务器从局域网内的时间服务器更新时间,同时局域网内的时间服务器向外网时间服务器同步时间
node01的IP为192.168.21.101,让它作为时间服务器,192.168.21.0局域网内的所有服务器都向它同步时间,而node01这台时间服务器本身,向外网时间服务器同步时间(比如中国国家授时中心服务器)
(1) 选择一台服务器作为NTP服务器
我用node01
(2) 给局域网所有需要同步时间的服务器安装ntp服务
yum install ntp -y
(3) 给所有的需要同步时间的机器(包括node01)设置ntp服务开机自启动,但不要启动服务
chkconfig ntpd on
(4) 修改node01的配置文件/etc/ntp.conf
我去掉了所有的默认注释,对其中的修改写了自己的注释,没有写注释的是默认配置
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
# 允许192.168.21.0网段内所有机器从node01同步时间
restrict 192.168.21.0 mask 255.255.255.0 nomodify notrap
# node01通过外网同步时间的服务器列表,注释掉的是默认的
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
# 中国国家授时中心服务器地址
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
# 允许上层时间服务器主动修改本机时间
restrict 0.cn.pool.ntp.org nomodify notrap noquery
restrict 1.cn.pool.ntp.org nomodify notrap noquery
restrict 2.cn.pool.ntp.org nomodify notrap noquery
restrict 3.cn.pool.ntp.org nomodify notrap noquery
# 外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
# 同步时间后,写到硬件中
SYNC_HWCLOCK=yes
(5) 启动ntpd服务之前,手动同步一下时间
因为ntpd服务开启之后,就不能手动同步时间了,那么为什么要先手动同步时间呢?
当server(中国国家授时中心服务器)与client(node01)之间的时间误差过大时(可能是1000秒),node01去同步时间可能对系统和应用带来不可预知的问题,node01将停止时间同步!所以如果发现node01启动之后时间并不进行同步时,应该考虑到可能是时间差过大引起的,此时需要先手动进行时间同步!
(6) 启动node01的ntpd服务
[root@node01 ~]# service ntpd start
(7) 检查ntp端口是否已经开启
[root@node01 ~]# netstat -unlnp | grep ntpd
看到红色框中的内容,表示连接和监听已正确
(7) 查看网络中的NTP服务器,显示客户端和每个服务器的关系
[root@node01 ~]# ntpq -p
这里的前4行就是我们配置的4个中国国家授时中心的服务器的信息
# 中国国家授时中心服务器地址
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
最后一行就是本地时间服务的信息
# 外部时间服务器不可用时,以本地时间作为时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10
下面对每个列的意义进行说明:
- 每个remote地址前的符号
*
:响应的NTP服务器和最精确的服务器
+
:响应这个查询请求的NTP服务器
blank(什么都没有)
:没有响应的NTP服务器
说明
ntp服务启动后,一般需要5-10分钟左右的时候才能与外部时间服务器开始同步时间,所以需要等待几分钟才能看到正常的现象,否则你看到的是响应的NTP服务器和最精确的服务器是LOCAL(0),最后一行前面是*
符号,其他都是空白 - remote
响应这个请求的NTP服务器的名称 - refid
NTP服务器使用的更高一级服务器的名称 - st
正在响应请求的NTP服务器的级别 - when
上一次成功请求之后到现在的秒数 - poll
本地和远程服务器多少时间进行一次同步,单位秒,在一开始运行NTP的时候这个poll值会比较小,服务器同步的频率大,可以尽快调整到正确的时间范围,之后poll值会逐渐增大,同步的频率也就会相应减小 - reach
用来测试能否和服务器连接,是一个八进制值,每成功连接一次它的值就会增加 - delay
从本地机发送同步要求到ntp服务器的往返时间 - offset
主机通过NTP时钟同步与所同步时间源的时间偏移量,单位为毫秒,offset越接近于0,主机和ntp服务器的时间越接近
jitter 统计了在特定个连续的连接数里offset的分布情况。简单地说这个数值的绝对值越小,主机的时间就越精确
(8) 查看node01的ntp服务状态
[root@node01 ~]# ntpstat
synchronised to NTP server (203.135.184.123) at stratum 2
time correct to within 699 ms
polling server every 64 s
同样,服务启动后需要等待5-10分钟才能看到这个正常的信息
到这里,我们局域网内的时间服务器node01就已经配置完毕了
(9) 配置客户端(node02-node04)向node01同步时间
<1> 修改每台客户端的/etc/ntp.conf
配置文件
文件内容如下:
同样,没有写注释的都是默认的配置
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
# 默认的服务器列表注释掉
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
# 从node01中同步时间
server 192.168.21.101
# 允许node01修改本地时间
restrict 192.168.21.101 nomodify notrap noquery
# 如果node01不可用,用本地的时间服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
# 同步时间后写到硬件中
SYNC_HWCLOCK=yes
<2> 每台客户端在启动ntpd服务之前,手动同步一下时间
原因同(5)
[root@node02 ~]# ntpdate -u node01
[root@node03 ~]# ntpdate -u node01
[root@node04 ~]# ntpdate -u node01
<3> 启动每台客户端的ntpd服务
[root@node02 ~]# service ntpd start
[root@node03 ~]# service ntpd start
[root@node03 ~]# service ntpd start
<4> 等待5-10分钟后,查看每个客户端的状态
到这里,利用局域网内一台时间服务器来同步整个集群时间的全部配置就已经完成
(10) 测试,在4台服务器同时执性date命令
[root@node01 ~]# date '+%Y-%m-%d %H:%M:%S'
2017-12-21 20:10:32
[root@node02 ~]# date '+%Y-%m-%d %H:%M:%S'
2017-12-21 20:10:32
[root@node03 ~]# date '+%Y-%m-%d %H:%M:%S'
2017-12-21 20:10:32
[root@node04 ~]# date '+%Y-%m-%d %H:%M:%S'
2017-12-21 20:10:32
说明:若以上提供的网络时间服务器不可用,请自行上网寻找可用的网络时间服务器,另外需要关闭各服务器的防火墙,才能进行时间同步
参考文章:
内网环境NTP服务及时间同步(CentOS6.x)配置和部署
配置NTP服务ntpd/ntp.conf(搭建Hadoop集群可参考)