Linux时钟同步

一、为什么要了解时钟同步?

时钟同步在大数据方向,用到的地方很多。举个例子来说吧,像Zookeeper、RegionServer服务都是需要实时和各节点进行通信的。假如各节点差超过30s,那么RegionServer会由于Zookeeper会话超时而停止服务。所以时钟同步在大数据里被广泛应用且必不可少的一步。

二、了解时间

在Linux系统中,时间分为两部分:系统时间和硬件时间。默认情况下,系统时间和硬件时间会以异步的方式进行,互不干扰。系统时间使用CPU tick维持,硬件时间使用Bios维持。在系统开机的时候,会自动从Bios中获取硬件时间,并设置为系统时间。

三、了解时区

在Linux系统中,/usr/share/zoneinfo目录下存在很多时区,其中Asia/Shanghai代表中国时区,如果需要更改时区,仅需做个软链接到/etc目录,软链名字为localtime

四、了解NTP

NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。

使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。

对于运行NTP的本地系统,既可以接收来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。

五、时间同步方案

上面介绍了那么多,需要如何做呢?假设有三台主机搭建的集群,使用ntp服务进行时钟同步,主节点作为时钟源:

  • 设置上海时区,并同步硬件时间(各节点)
  • yum安装ntp服务,并设置为ntpd开机自启动(各节点)
  • 主节点修改ntp配置文件,开启ntp服务
  • 从节点使用ntpdate命令进行时钟同步,并开启ntp服务

上面采取的是ntpd + ntpdate的同步方案。先使用ntpdate命令实现时间同步,然后再开启ntpd服务进行步进式的逐渐时间调整。

六、具体命令

可以新建文件,里面存放集群内所有需要时钟同步的节点

192.168.162.41
192.168.162.42
192.168.162.43
# 将上面节点ip保存到~/nodeslist下
#!/usr/bin/env bash
host_list=$(cat ~/nodeslist)
master_hostip=$(sed -n 1p ~/nodeslist)
ips_no_host=$(sed -n '2,$p' ~/nodeslist)

# 遍历所有节点
for host in $host_list
do
    # 设置时区
    ssh $host ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 同步硬件时间
    ssh $host hwclock --systohc
    # 开机自启动
    ssh $host echo service ntpd restart >> /etc/rc.d/rc.local
    ssh $host echo "hwclock --systohc" >> /etc/rc.d/rc.local
    ssh $host chmod +x /etc/rc.d/rc.local
    # 安装ntp服务
    ssh $host yum install -y -q ntp
done
# 主节点操作,修改配置文件
sed -i -e '21 s/^/# /' -i -e '22 s/^/# /' -i -e '23 s/^/# /' -i -e '24 s/^/# /' /etc/ntp.conf
echo server 127.127.1.0 >> /etc/ntp.conf
echo fudge 127.127.1.0 stratum 10 >> /etc/ntp.conf
service ntpd start
# 从节点操作,开启ntp服务,使用ntpdate命令进行时钟同步
for slave in $ips_no_host
do
    ssh $slave service ntpd start
    ssh $slave ntpdate -u $master_hostip
done

其中添加到/etc/ntp.conf配置文件内容解释如下:

server 127.127.1.0      # 表示NTP主服务器是与自身的系统时钟同步
fudge 127.127.1.0 stratum 10     # 指定阶层编号为10,降低其优先度

每天学习一点点,大数据原来也不是那么难~
Linux时钟同步