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"

更多精彩乾貨內容,請關注微信公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章