Linux NTP时钟同步

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

时钟同步在大数据方向,用到的地方很多。举个例子来说吧,像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时间同步方案选择

NTP同步方式在linux下一般两种:使用ntpdate命令直接同步和使用NTPD服务平滑同步。有什么区别呢,简单说下,免得时间长了,概念又模糊。

现有一台设备,系统时间是 13:00 , 真实的当前时间(在空中,也许卫星上,这里假设是在准备同步的上级目标NTP服务器)是: 12:30 。如果我们使用ntpdate同步(ntpdate -u 目标NTP服务器IP),操作系统的时间立即更新为12:30,假如,我们的系统有一个定时应用,是在每天12:40运行,那么实际今天这个的任务已经运行过了(当前时间是13:00嘛),现在被ntpdate修改为12:30,那么意味作10分钟后,又会执行一次任务,这就糟糕了,这个任务只能执行一次的嘛!!我想你已经懂了ntpdate时间同步的隐患,当然这个例子有些极端,但的确是有风险的,生产环境我不打算这么干,还是稳妥点好。所以解决该问题的办法就是时间平滑更改,不会让一个时间点在一天内经历两次,这就是ntpd服务方式平滑同步时间,它每次同步时间的偏移量不会太陡,是慢慢来的(问:怎么来,没有细究,只晓得一次一点的同步,完全同步好需要较长时间,所以一般开启ntpd服务同步前先用ntpdate先手动同步一次)。

六、时间同步方案说明

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

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

主从节点配置文件修改说明:

主节点修改:

# 将下列字段注释:
    # 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 127.127.1.0   # 表示NTP主服务器是与自身的系统时钟同步
    fudge 127.127.1.0 stratum 10   # 指定阶层编号为10,降低其优先度

从节点修改:

# 将下列字段注释:
    # 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 127.127.1.0   # 表示NTP主服务器是与自身的系统时钟同步
    fudge 127.127.1.0 stratum 10   # 指定阶层编号为10,降低其优先度
    server liuyzh1.xdata   # 配置时间服务器为本地的时间服务器
    restrict liuyzh1.xdata nomodify notrap noquery   # 允许上层时间服务器主动修改本机时间

配置参数和命令简单说明请参考:点击访问

总结:

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

修改主节点配置文件,使NTP主服务器与自身系统时钟同步,也就是说主节点为时间服务器。

修改从节点配置文件,配置主节点为本地的时间服务器,允许主节点主动修改本机时间。

七、具体的脚本命令

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

192.168.162.41
192.168.162.42
192.168.162.43
# 将上面节点ip保存到 ~/nodeslist下
#!/usr/bin/env bash
bin=`dirname $0`
bin=`cd "$bin"; pwd`
cd $bin
host_list=$(cat ~/nodeslist)
master_hostip=$(sed -n 1p ~/nodeslist)
ips_no_host=$(sed -n '2,$p' ~/nodeslist)
# 判断当前系统版本,方便用户单独执行
os_version=`sh checkOSVersion.sh`
# 遍历所有节点
# 操作:1.修改时区为上海时区 2.设置开机自启动 3.修改配置文件ntp.cnf
for host in $host_list
do
    # 设置时区
    ssh $host ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 开机自启动
    flag=`ssh $host grep -c \"service ntpd restart\" /etc/rc.d/rc.local`
    if [ $flag -eq '0' ]; then
        ssh $host "echo service ntpd restart >> /etc/rc.d/rc.local"
        echo "service ntpd restart in /etc/rc.d/rc.local add successfully!"
    else
        echo "service ntpd restart in /etc/rc.d/rc.local already exist, not need to add."
    fi
    flag=`ssh $host grep -c \"hwclock --systohc\" /etc/rc.d/rc.local`
    if [ $flag -eq '0' ]; then
        ssh $host "echo "hwclock --systohc" >> /etc/rc.d/rc.local"
        echo "hwclock --systohc in /etc/rc.d/rc.local add successfully!"
    else
        echo "hwclock --systohc in /etc/rc.d/rc.local already exist, not need to add."
    fi
    ssh $host "chmod +x /etc/rc.d/rc.local"
    # 安装ntp服务
    ssh $host yum install -y -q ntp
    if [[ $os_version = "centos6" ]];then
        ssh $host "sed -i -e '22 s/^/# /' -i -e '23 s/^/# /' -i -e '24 s/^/# /' -i -e '25 s/^/# /' /etc/ntp.conf"
    else
        ssh $host "sed -i -e '21 s/^/# /' -i -e '22 s/^/# /' -i -e '23 s/^/# /' -i -e '24 s/^/# /' /etc/ntp.conf"
    fi
    flag=`ssh $host grep -c \"server 127.127.1.0\" /etc/ntp.conf`
    if [ $flag -eq '0' ]; then
        ssh $host "echo server 127.127.1.0 >> /etc/ntp.conf"
        echo "server 127.127.1.0 in /etc/ntp.conf add successfully!"
    else
        echo "server 127.127.1.0 in /etc/ntp.conf already exist,not need to add."
    fi
    flag=`ssh $host grep -c \"fudge 127.127.1.0 stratum 10\" /etc/ntp.conf`
    if [ $flag -eq '0' ]; then
        ssh $host "echo fudge 127.127.1.0 stratum 10 >> /etc/ntp.conf"
        echo "fudge 127.127.1.0 stratum 10 in /etc/ntp.conf add successfully!"
    else
        echo "fudge 127.127.1.0 stratum 10 in /etc/ntp.conf already exist,not need to add."
    fi
done
# 主节点操作
# 1.重启ntpd 2.硬件时间以系统时间为标准进行同步 3.打印主节点当前系统时间
service ntpd restart
hwclock --systohc
echo -e "\e[0;32;1m==== "$master_hostip"当前系统时间为: ====\e[0m"
date
echo -e "\e[0;32;1m==== "$master_hostip"当前硬件时间为: ====\e[0m"
hwclock
# 从节点操作,开启ntp服务,使用ntpdate命令进行时钟同步
for slave in $ips_no_host
do
    echo -e "\e[0;33;1m==== 开始对"$slave"进行时钟同步配置 ====\e[0m"
    # 将 server 主节点 写入配置文件/etc/ntp.conf中
    flag=`ssh $slave grep -c \"server $master_hostip\" /etc/ntp.conf`
    if [ $flag -eq '0' ]; then
        ssh $slave "echo server $master_hostip >> /etc/ntp.conf"
        echo "server $master_hostip in /etc/ntp.conf add successfully!"
    else
        echo "server $master_hostip in /etc/ntp.conf already exist,not need to add."
    fi
    # 将 restrict 主节点 nomodify notrap noquery 写入配置文件/etc/ntp.conf中
    flag=`ssh $slave grep -c \"restrict $master_hostip nomodify notrap noquery\" /etc/ntp.conf`
    if [ $flag -eq '0' ]; then
        ssh $slave "echo restrict $master_hostip nomodify notrap noquery >> /etc/ntp.conf"
        echo "restrict $master_hostip nomodify notrap noquery in /etc/ntp.conf add successfully!"
    else
        echo "restrict $master_hostip nomodify notrap noquery in /etc/ntp.conf already exist,not need to add."
    fi
    ssh $slave service ntpd restart
    ssh $slave "ntpdate -u $master_hostip"
    echo -e "\e[0;32;1m==== "$slave"当前系统时间为: ====\e[0m"
    ssh $slave "date"
    ssh $slave "hwclock --systohc"
    echo -e "\e[0;32;1m==== "$slave"当前硬件时间为: ====\e[0m"
    ssh $slave "hwclock"
    echo -e "\e[0;33;1m==== 完成对"$slave"的时钟同步配置 ====\e[0m"
done
echo -e "\e[0;32;1m==== 时钟同步配置流程结束 ====\e[0m"

更多精彩干货内容,请关注微信公众号

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

解决Windows环境下Git Bash客户端无法识别Composer命令的问题

1354
来自专栏建站达人秀

如何搭建 Firekylin 博客

FireKylin 是基于国内先进的 Node.js 框架 ThinkJS 2.0 开发的通用博客系统,是由奇虎360公司Web前端工程师组成的专业团队 75T...

2711
来自专栏杂烩

GitHug备忘 原

作为开源代码库以及版本控制系统,Github拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首...

625
来自专栏前端杂谈

广告等第三方应用嵌入到web页面方案 之 使用iframe嵌入

4597
来自专栏aCloudDeveloper

OVS 总体架构、源码结构及数据流程全面解析

在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索。本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍。 OVS 架构 OV...

3795
来自专栏熊二哥

Linux快速入门04-扩展知识

这部分是快速学习的最后一部分知识,其中最重要的内容就是源码的打包和软件的安装的学习,由于个人的Linux学习目的就是自己能在阿里云Ubuntu上搭建一个简单的n...

2525
来自专栏QQ空间开发团队的专栏

TPatch动态补丁系统(iOS)

对于每一个开发,从写Hello World开始,到使用各种语言,可能都会遇到各种BUG。有的BUG能快速解决,比如Web侧的,发个JS或者Html即可。但是在终...

2.5K1
来自专栏程序员互动联盟

【专业技术】Windows编程技巧小结

我们在编写程序的时候,常常会需要一些线程的delay函数。这个问题说简单也简单,说复杂也复杂。比如很多人读知道delay直接用Windows的API函数Slee...

3555
来自专栏伪君子的梦呓

电脑使用 Vysor 控制手机

想用安卓手机一步一步演示个东西给别人看的时候,恰巧遇到对方不在身边;安卓手机上的东西想投影到 Windows 电脑上,用电脑控制手机,却没找到合适的方式;上班时...

1524
来自专栏腾讯Bugly的专栏

《移动端本地 H5 秒开方案探索与实现》

对 APP 里的一些使用 H5 实现的功能模块,一般体验都比原生差,那么怎么提高h5加载速度?优化 h5 体验?

1.2K13

扫码关注云+社区