1. 程式人生 > 其它 >Linux叢集環境下NTP伺服器時間同步

Linux叢集環境下NTP伺服器時間同步

NTP介紹

  • NTP(Network Time Protocol,網路時間協議)是用來使網路中的各個計算機時間同步的一種協議。它的用途是把計算機的時鐘同步到世界協調時UTC(Universal Time Coordinated,世界協調時),UTC 是由原子鐘報時的國際標準時間,而 NTP 獲得 UTC 的時間來源可以是原子鐘、天文臺、衛星,也可從 Internet 上面獲取。其精度在區域網內可達0.1ms,在網際網路上絕大多數的地方其精度可以達到1-50ms。 補充知識:搶票軟體等就是提前傳送已知的資料包,時間一到伺服器開始接受就會第一時間搶到。 NTP 伺服器就是利用 NTP 協議提供時間同步服務的。

NTP伺服器顧名思義就是時間同步伺服器(Network Time Protocol),Linux下的ntp伺服器配置相對來說都比較容易,但在Linux下有一個弊端,不同時區或者說是時間相差太大的無法同步,所以在配置ntp伺服器之前需要把時間配置成相同的。

NTP時鐘同步C/S模式

NTP伺服器作用

  • 產生與處理系統是各種計算裝置叢集的,計算裝置將統一、同步的標準時間用於記錄各種事件發生時序,如E-MAIL資訊、檔案建立和訪問時間、資料庫處理時間等。
  • 系統內不同計算裝置之間控制、計算、處理、應用等資料或操作都具有時序性,若計算機時間不同步,這些應用或操作或將無法正常進行。
  • 系統是對時間敏感的計算處理系統,時間同步是大資料能夠得到正確處理的基礎保障,是大資料得以發揮作用的技術支撐。
  • 大資料時代,整個處理計算系統內的大資料通訊都是通過網路進行,時間同步也是如此,利用大資料的網際網路絡傳送標準時間資訊,實現大資料系統內時間同步。

NTP時鐘同步方式說明
NTP在linux下有兩種時鐘同步方式,分別為直接同步和平滑同步:

  • 直接同步

  使用ntpdate命令進行同步,直接進行時間變更。如果伺服器上存在一個12點執行的任務,當前伺服器時間是13點,但標準時間時11點,使用此命令可能會造成任務重複執行。因此使用ntpdate同步可能會引發風險,因此該命令也多用於配置時鐘同步服務時第一次同步時間時使用。

  • 平滑同步

  使用ntpd進行時鐘同步,可以保證一個時間不經歷兩次,它每次同步時間的偏移量不會太陡,是慢慢來的,這正因為這樣,ntpd平滑同步可能耗費的時間比較長。

ntpd、ntpdate的區別

  • 使用之前得弄清楚一個問題,ntpd與ntpdate在更新時間時有什麼區別。ntpd不僅僅是時間同步伺服器,他還可以做客戶端與標準時間伺服器進行同步時間,而且是平滑同步,並非ntpdate立即同步,在生產環境中慎用ntpdate,也正如此兩者不可同時執行。
  • 時鐘的躍變,對於某些程式會導致很嚴重的問題。許多應用程式依賴連續的時鐘——畢竟,這是一項常見的假定,即,取得的時間是線性的,一些操作,例如資料庫事務,通常會地依賴這樣的事實:時間不會往回跳躍。不幸的是,ntpdate調整時間的方式就是我們所說的”躍變“:在獲得一個時間之後,ntpdate使用settimeofday(2)設定系統時間,這有幾個非常明顯的問題:
  • 第一,這樣做不安全。ntpdate的設定依賴於ntp伺服器的安全性,攻擊者可以利用一些軟體設計上的缺陷,拿下ntp伺服器並令與其同步的伺服器執行某些消耗性的任務。由於ntpdate採用的方式是跳變,跟隨它的伺服器無法知道是否發生了異常(時間不一樣的時候,唯一的辦法是以伺服器為準)。
  • 第二,這樣做不精確。一旦ntp伺服器宕機,跟隨它的伺服器也就會無法同步時間。與此不同,ntpd不僅能夠校準計算機的時間,而且能夠校準計算機的時鐘。
  • 第三,這樣做不夠優雅。由於是跳變,而不是使時間變快或變慢,依賴時序的程式會出錯(例如,如果ntpdate發現你的時間快了,則可能會經歷兩個相同的時刻,對某些應用而言,這是致命的)。
  • 因而,唯一一個可以令時間發生跳變的點,是計算機剛剛啟動,但還沒有啟動很多服務的那個時候。其餘的時候,理想的做法是使用ntpd來校準時鐘,而不是調整計算機時鐘上的時間。
  • NTPD 在和時間伺服器的同步過程中,會把 BIOS 計時器的振盪頻率偏差——或者說 Local Clock 的自然漂移(drift)——記錄下來。這樣即使網路有問題,本機仍然能維持一個相當精確的走時。

注意:NTP 也存在一定侷限性,如果系統時間比正確的時間要快的話,NTP 是不會幫你做調整的,而且當你的時間設定和正確的時間相差很大的時候,NTP 會花上很長一段時間進行同步調整。此外,當本地時間與標準時間相差30分鐘以上時, ntpd 會停止工作

環境準備

屬性 NTP伺服器 NTP客戶端
節點 wencheng-1 wencheng-2
系統 CentOS Linux release 7.5.1804 (Minimal) CentOS Linux release 7.5.1804 (Minimal)
核心 3.10.0-862.el7.x86_64 3.10.0-862.el7.x86_64
SELinux setenforce 0 | disabled setenforce 0 | disabled
Firewlld systemctl stop/disabled firewalld systemctl stop/disabled firewalld
IP地址 172.16.70.185 172.16.70.186

NTP伺服器操作步驟

  • 1.確認wencheng-1節點是否安裝ntp,並修改時區。
[root@wencheng-1 ~]# rpm -qa |  grep ntp
[root@wencheng-1 ~]# yum install -y ntp
[root@wencheng-1 ~]# rpm -qa | grep ntp
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
ntp-4.2.6p5-29.el7.centos.2.x86_64
[root@wencheng-1 ~]# systemctl start ntpd
[root@wencheng-1 ~]# systemctl status ntpd
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-03-25 01:09:13 EDT; 1 months 16 days ago
  Process: 8716 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 8717 (ntpd)
   CGroup: /system.slice/ntpd.service
           └─8717 /usr/sbin/ntpd -u ntp:ntp -g

Mar 25 01:09:13 wencheng-1 ntpd[8717]: Listen normally on 2 lo 127.0.0.1 UDP 123
Mar 25 01:09:13 wencheng-1 ntpd[8717]: Listen normally on 3 ens33 172.16.70.185 UDP 123
Mar 25 01:09:13 wencheng-1 ntpd[8717]: Listen normally on 4 lo ::1 UDP 123
Mar 25 01:09:13 wencheng-1 ntpd[8717]: Listen normally on 5 ens33 fe80::20c:29ff:fe7f:222b UDP 123
Mar 25 01:09:13 wencheng-1 ntpd[8717]: Listening on routing socket on fd #22 for interface updates
Mar 25 01:09:13 wencheng-1 ntpd[8717]: 0.0.0.0 c016 06 restart
Mar 25 01:09:13 wencheng-1 ntpd[8717]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Mar 25 01:09:13 wencheng-1 ntpd[8717]: 0.0.0.0 c011 01 freq_not_set
Mar 25 01:09:20 wencheng-1 ntpd[8717]: 0.0.0.0 c61c 0c clock_step +4075317.470688 s
May 11 05:11:18 wencheng-1 ntpd[8717]: 0.0.0.0 c614 04 freq_mode

[root@wencheng-1 ~]# netstat -ntplu | grep ntp
udp        0      0 172.16.70.185:123       0.0.0.0:*                           11655/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           11655/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           11655/ntpd
udp6       0      0 fe80::20c:29ff:fe7f:123 :::*                                11655/ntpd
udp6       0      0 ::1:123                 :::*                                11655/ntpd
udp6       0      0 :::123                  :::*                                11655/ntpd

[root@wencheng-1 ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

[root@wencheng-1 ~]# timedatectl set-timezone Asia/Shanghai
[root@wencheng-1 ~]# timedatectl
      Local time: Tue 2021-05-11 17:16:10 CST
  Universal time: Tue 2021-05-11 09:16:10 UTC
        RTC time: Thu 2021-03-25 05:04:14
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
  • 2.wencheng-1修改檔案 /etc/ntp.conf。
[root@wencheng-1 ~]# mv /etc/ntp.conf /etc/ntp.conf_bak
[root@wencheng-1 ~]# vim /etc/ntp.conf
# 新增一下內容
# --------------------------------------
##記錄和上級時間伺服器的時間差異.
driftfile /var/lib/ntp/drift

##新增:日誌目錄.
logfile /var/log/ntpd.log

restrict default nomodify
##引數解釋
## restrict可以限制客戶端許可權,可以使用的 parameter說明:
## kod            kod技術可以阻止“Kiss of Death “包對伺服器的破壞
## nomodity       client可通過ntp進行時間同步,但不能通過 ntpq, ntpc 等更改server引數
## notrap         不提供trap遠端登陸 (remote event logging) 功能
## nopeer         不與其它同一層的ntp server進行時間同步
## noquery        客戶端不能夠使用 ntpq, ntpc 等指令來查詢時間伺服器,即拒絕ntp時間同步;
## notrust        拒絕無認證的client
## ignore         拒絕所有連線到ntp server的請求
## 如果出現問題,可能是ipv6配置出錯,可以嘗試新增restrict -6 default kod nomodify notrap nopeer noquery  #針對ipv6設定
## 或者修改預設為restrict -4 default nomodify notrap nopeer noquery

##開啟允許本地所有操作
restrict 127.0.0.1
restrict ::1

restrict 172.16.0.0 mask 255.255.255.0 nomodify notrap
## restrict 用來分配指定網段許可權,格式如下:
## restrict [授權同步的網段] mask [netmask] [parameter]
##這一行的含義是授權172.16.0.0網段上的所有機器可以從這臺機器上查詢和同步時間.

##新增:時間伺服器列表.
server time1.aliyun.com
server time2.aliyun.com
server time3.aliyun.com prefer
##引數解釋
## server 用來設定上一級ntp伺服器,這裡使用阿里雲提供的ntp伺服器,parameter說明:
## prefer     最高優先順序
## burst      當一個運程NTP伺服器可用時,向它傳送一系列的併發包進行檢測。
## iburst     當一個運程NTP伺服器不可用時,向它傳送一系列的併發包進行檢測。

# 如果無法與上層ntp server通訊以本地時間為標準時間
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
# ------------------------------------------
  • 3.ntp服務,預設只會同步系統時間。如果想要讓ntp同時同步硬體時間,可以設定/etc/sysconfig/ntpd檔案
[root@wencheng-1 ~]# mv /etc/sysconfig/ntpd /etc/sysconfig/ntpd_bak
[root@wencheng-1 ~]# vim /etc/sysconfig/ntpd
# 新增一下內容
# -------------------------------------------
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# 設定是否同步到硬體時間
SYNC_HWCLOCK=yes
# Additional options for ntpdate 預設選項為-g
NTPDATE_OPTIONS="-g"
# -------------------------------------------
  • 4.驗證與狀態檢查
[root@wencheng-1 ~]# systemctl restart ntpd
[root@wencheng-1 ~]# netstat -ntplu | grep ntp
udp        0      0 172.16.70.185:123       0.0.0.0:*                           11655/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           11655/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           11655/ntpd
udp6       0      0 fe80::20c:29ff:fe7f:123 :::*                                11655/ntpd
udp6       0      0 ::1:123                 :::*                                11655/ntpd
udp6       0      0 :::123                  :::*                                11655/ntpd

[root@wencheng-1 ~]# ntpstat
synchronised to NTP server (203.107.6.88) at stratum 3
   time correct to within 479 ms
   polling server every 64 s
注意:此命令出現上述synchronised結果比較慢,都等待幾分鐘。

[C:\~]$ ping time3.aliyun.com    # 驗證檔案/etc/ntp.conf的server time3.aliyun.com prefer對應IP地址
正在 Ping ntp.aliyun.com [203.107.6.88] 具有 32 位元組的資料:
來自 203.107.6.88 的回覆: 位元組=32 時間=40ms TTL=51
來自 203.107.6.88 的回覆: 位元組=32 時間=40ms TTL=51
來自 203.107.6.88 的回覆: 位元組=32 時間=44ms TTL=51
來自 203.107.6.88 的回覆: 位元組=32 時間=41ms TTL=51
203.107.6.88 的 Ping 統計資訊:
    資料包: 已傳送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 40ms,最長 = 44ms,平均 = 41ms

[root@wencheng-1 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*203.107.6.88    10.137.38.86     2 u   66   64  377   39.198    5.282   2.988
 LOCAL(0)        .LOCL.          10 l  531   64    0    0.000    0.000   0.000

ntpq -p 引數詳解
    remote :本地主機所連線的上層NTP伺服器,最左邊的符號如下:
    如果有[*] 代表目前正在使用當中的上層NTP伺服器。
    如果有[+] 代表也有連上上層NTP伺服器,可以作為提高時間更新的候選NTP伺服器
    如果有[-] 代表同步的該NTP伺服器被認為是不合格的NTP Server
    如果有[x] 代表同步的外網NTP伺服器不可用
    refid :指的是給上層NTP伺服器提供時間校對的伺服器。
    St:上層NTP伺服器的級別。
    When: 上一次與上層NTP伺服器進行時間校對的時間(單位:s)
    Poll :本地主機與上層NTP伺服器進行時間校對的週期(單位:s)
    reach:八進位制數,表示最近8次時鐘同步包接收情況(1表示接收成功,0表示接收失敗。每接收一個包左移一位。對於一個執行較長時間的NTP client而言,這個值應該是377->11,111,111,即最近8次包接收均成功;否則表示有丟包情況發生).
    delay:網路傳輸過程當中延遲的時間,單位為 10^(-6) 秒
    offset:時間補償的結果,單位為10^(-6) 秒
    jitter:Linux 系統時間與 BIOS 硬體時間的差異時間, 單位為 10^(-6) 秒。

NTP客戶端操作步驟。

  • 1.確認是否安裝ntp,並修改時區。
[root@wencheng-2 ~]# yum install -y ntp
[root@wencheng-1 ~]# rpm -qa | grep ntp
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
ntp-4.2.6p5-29.el7.centos.2.x86_64

[root@wencheng-2 ~]# timedatectl set-timezone Asia/Shanghai
[root@wencheng-2 ~]# date -s "2020-10-10 10:10"    #預設定錯誤的時間
[root@wencheng-2 ~]# timedatectl
      Local time: Sat 2020-10-10 10:16:35 CST
  Universal time: Sat 2020-10-10 02:16:35 UTC
        RTC time: Wed 2021-05-12 04:18:08
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
  • 2.修改檔案/etc/ntp.conf,主要修改Server選擇部分。
[root@wencheng-2 ~]# cp /etc/ntp.conf /etc/ntp.conf_bak
[root@wencheng-2 ~]# vim /etc/ntp.conf
#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

#註釋所有centos.pool.ntp,再新增
server 172.16.70.185 frefer
fudge 172.16.70.185 stratum 10
  • 3.驗證與狀態檢查
[root@wencheng-2 ~]# systemctl start ntpd
[root@wencheng-2 ~]# systemctl enable ntpd

[root@wencheng-2 ~]# netstat -nutpl | grep ntp
udp        0      0 172.16.70.186:123       0.0.0.0:*                           9088/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           9088/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           9088/ntpd
udp6       0      0 fe80::20c:29ff:fef6:123 :::*                                9088/ntpd
udp6       0      0 ::1:123                 :::*                                9088/ntpd
udp6       0      0 :::123                  :::*                                9088/ntpd

[root@wencheng-2 ~]# ntpstat
synchronised to NTP server (172.16.70.185) at stratum 4
   time correct to within 76 ms
   polling server every 256 s

[root@wencheng-2 ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*172.16.70.185   203.107.6.88     3 u  253  256  377    0.312    1.557   0.997

[root@wencheng-2 ~]# timedatectl
      Local time: Wed 2021-05-12 14:24:30 CST
  Universal time: Wed 2021-05-12 06:24:30 UTC
        RTC time: Wed 2021-05-12 06:24:30
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
  • 4.新增時間同步計劃任務。
[root@wencheng-2 ~]# vim /etc/cron.d/ntp
# 每兩個小時同步一次,並修改硬體時間
0 */2 * * * /usr/sbin/ntpdate 172.16.70.185 && /usr/sbin/hwclock -w &>/dev/null

至此,NTP伺服器構建,並完成客戶端時間同步!