张子阳的博客

首页 读书 技术 店铺 关于
张子阳的博客 首页 读书 技术 店铺 关于

linux同步多台服务器的时间

2018-8-31 作者: 张子阳 分类: Linux

今天在运行一个Spark作业时出现了下面一个异常:

diagnostics: Application application_1535358999915_2006 failed 2 times dutempt_1535358999915_2006_000002. Got exception: org.apache.hadoop.yarn.exceptions.d request to start container. 
  This token is expired. current time is 1535728077792 found 1535699829483 
  Note: System times on machines may be out of sync. Check system time and time zone 
  at sun.reflect.GeneratedConstructorAccessor78.newInstance(Unknown Source) 
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingCon45) 
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
  ... ...(省略10行) 
  . Failing the application.

核心一句是:This token is expired. current time is 1535728077792 found 1535699829483 Note: System times on machines may be out of sync. Check system time and time zone。

在4台服务器上执行了一遍date,发现其中有1台的日期和其他3台差了8个多小时,其余3台的服务器虽然日期近似,但也不完全相同,少则相差十几秒,多则相差一分钟。

所以有必要将4台服务器(位于同一个集群)的日期调整为完全一致。除此以外,这个集群是没有外网访问的(外网既不能进也不能出),因此无法直接和互联网上的时间服务器进行同步。而我有一个集群的客户端,这个客户端可以进行外网访问,我已在这个客户端上配置好了ssh,可以通过这个集群客户端来管理集群。

因此思路就是让客户端同步互联网时间服务器的时间,再让集群同步客户端的时间。

这篇文章将记录这一过程,所有操作均在集群的客户端上完成。

首先确保当前时区正确,中国时区为UTC+8(CST,China Standard Time)

现在客户端上执行下面的操作,将本机时区设为上海时间(和北京时间是一样的)。

# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# date
Fri Aug 31 16:15:56 CST 2018

在4台服务器(主机名分别为hadoop01~hadoop04)执行同样的操作:

for i in {1..4}; do
ssh -p 60034 root@hadoop0${i} "echo 'hadoop0${i}'; cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime"
done

在集群客户端上安装ntp、ntpdate工具

yum -y install ntp ntpdate

更新客户端时间为互联网时间

# ntpdate 0.centos.pool.ntp.org
31 Aug 16:02:56 ntpdate[31742]: adjust time server 80.127.119.186 offset 0.010105 sec
上面更新日期的服务器地址为:0.centos.pool.ntp.org,来自 /etc/ntp.conf 文件。

将系统时间刷入到BIOS时钟里面去。

# hwclock --systohc

客户端启动ntpd服务

# systemctl restart ntpd.service

让集群同步客户端(192.168.0.150)的时间

for i in {1..4}; do
ssh -p 60034 root@hadoop0${i} "echo 'hadoop0${i}'; ntpdate 192.168.0.150; hwclock --systohc"
done

最后核对一下时间是否一致:

date; \
for i in {1..4}; do
ssh -p 60034 root@hadoop0${i} "echo 'hadoop0${i}'; date"
done

结果如下,因为网络问题,会有1秒的差别,说明5台机器(1台客户端,4台集群内服务器)的日期已经完全同步了。

Fri Aug 31 16:28:17 CST 2018
hadoop01
Fri Aug 31 16:28:17 CST 2018
hadoop02
Fri Aug 31 16:28:18 CST 2018
hadoop03
Fri Aug 31 16:28:18 CST 2018
hadoop04
Fri Aug 31 16:28:18 CST 2018

感谢阅读,希望这篇文章能给你带来帮助!