1. 程式人生 > >NTP 時間伺服器實戰

NTP 時間伺服器實戰

一. 主機規劃

目標環境,5臺 Linux centos 6.5, 一臺作為 NTPD 服務與外部公共 NTP 服務同步時間,同時作為內網的 NTPD 伺服器,其他機器與這臺服務做時間同步。其中也只有一臺作為 NTPD 服務的機子可以上外網,其他的主機只能在區域網中通訊。

1. NTP時間同步方式選擇

  • 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 先手動同步一次

)。

2. 關係如下:

IP 地址 NTP 角色 說明 是否開啟 ntpd 同步方式
10.6.3.43 NTPD服務 1、負責與外部公共NTPD服務同步標準時間
2、作為內外網路的NTPD服務
NTPD服務平滑同步
10.6.3.32 內外NTP客戶端 內網裝置與 10.6.3.43 同步時間 NTPD服務平滑同步
10.6.3.33 內外NTP客戶端 內網裝置與 10.6.3.43 同步時間 NTPD服務平滑同步
10.6.3.36 內外NTP客戶端 內網裝置與 10.6.3.43 同步時間 NTPD服務平滑同步
10.6.3.48 內外NTP客戶端 內網裝置與 10.6.3.43 同步時間 NTPD服務平滑同步

二. 前期準備

2.1 設定好時區

在中國,正確的時區應為 CST(Chinese Standard Time),也就是我們通常所說的北京時間。那麼中國當地的時間晚上8點的話,我們可以有下面兩種表示方式

  • 20:00 CST
  • 12:00 UTC

因為中國處在 UTC+8 時區,依次類推,在 UTC 標準時間,就是 12:00了。不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出 UTC+0 的時間值而不會提供時區(因為它不知道你在哪裡).所以當我們設定系統時間的時候,設定好時區是首先要做的工作。

1. 檢視當前時區

date
>> Sat Dec 26 14:11:45 EDT 2015

重點在於這個 “EDT“,並非之前所說應該是 “CST”

2. 修改 /etc/sysconfig/clock

  • 將原來的時區改為
vim /etc/sysconfig/clock

ZONE="America/New_York"
#改為
ZONE="Asia/Shanghai"

3.覆蓋 /etc/localtime

cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
cp: overwrite `/etc/localtime'? y

4. 檢視修改後的時區

date
>> Sat Dec 26 14:11:45 CST 2015

2.2 檢查 NTP 是否安裝

rpm -qa |grep ntp
>> ntp-4.2.6p5-1.el6.centos.x86_64
>> ntpdate-4.2.6p5-1.el6.centos.x86_64

如果沒有安裝,我們按照下

yum install ntp

2.3 設定同步更新本地 hwclock

在 Linux 下系統時間在開機的時候會和硬體時間同步(synchronization),之後也就各自獨立運行了那麼既然兩個時鐘獨自執行,那麼時間久了必然就會產生誤差了,而 NTP 預設又只更新系統時間,因此我們需要設定硬體時鐘進行同步調整

vim /etc/sysconfig/ntpd

新增以下即可:

SYNC_HWCLOCK="yes"

2.4 檢視能提供服務的外部時間伺服器

在能夠上網的一臺主機中(比如 10.6.3.43)上執行以下命令,檢視可以正常提供時間服務的外部主機。

ntpdate -q 1.cn.pool.ntp.org

這裡寫圖片描述

也就是說有三個可以提供該服務的 IP,其中 202.118.29.82 的時延最小。如果上層伺服器不可用,一般類似如下顯示

1.server 202.118.1.81, stratum 0, offset 0.000000, delay 0.00000
26 Dec 17:25:18 ntpdate[23338]: no server suitable for synchronization found

Note:IP地址: 202.112.10.36 中國 教育網,提供時間校準服務

2.5 先使用 ntpdate 手動同步下時間

配置前,先使用ntpdate手動同步下內網中作為 NTPD 伺服器的時間,免得本機與外部時間伺服器時間差距太大,讓ntpd不能正常同步。即在 10.6.3.43 上執行 (root 許可權下操作):

ntpdate -u 1.cn.pool.ntp.org
>> 26 Dec 14:48:37 ntpdate[32758]: adjust time server 202.112.10.36 offset -0.006147 sec

然後再將該時間先寫入硬體時間

date;hwclock -w

三. 修改 NTP 的配置檔案

3.1 配置內網NTP-Server(10.6.3.43)

下面主要是配置內網的NPTD伺服器(10.6.3.43), NTPD服務配置核心就在 /etc/ntp.conf 檔案,配置好了就 OK。

vim /etc/ntp.conf

1. 指定上層對時伺服器

加 # 號註釋掉 centos 預設的對時伺服器,如果主機可以訪問外網,這一步最好做一下。新增國家對時伺服器。

# 中國這邊最活躍的時間伺服器 : http://www.pool.ntp.org/zone/cn
server 202.112.29.82 perfer     # 1.cn.pool.ntp.org
server 202.118.1.81     # stratum 2          
server 202.118.1.130        # stratum 2     
server 202.112.10.36        # stratum 3           
  • 為了防止出現上層對時伺服器故障,無法正確提供時間同步,一般建議配置兩個或以上時間同步伺服器
  • prefer 表示優先使用


2. 修改上層時間伺服器對本機的許可權

# allow update time by the upper server 
# 允許上層時間伺服器主動修改本機時間
restrict 202.112.29.82 nomodify notrap noquery
restrict 202.118.1.81  nomodify notrap noquery
restrict 202.118.1.130 nomodify notrap noquery
restrict 202.112.10.36 nomodify notrap noquery

3. 外部時間伺服器不可用時,設定以本地時間作為時間服務

# 外部時間伺服器不可用時,以本地時間作為時間服務
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10


4. 設定對內網主機提供NTP服務

因為筆者的實驗環境中,內網使用 10.6.3.0/24 網段,所以設定如下

restrict 10.6.3.0 mask 255.255.255.0 nomodify notrap

3.2 配置內網 NTP-Client

內網其他裝置作為NTP的客戶端配置,相對就比較簡單,而且所有裝置的配置都相同。找其中一臺配置 /etc/ntp.conf 檔案,配置完成驗證通過後,拷貝到其他客戶端機器,直接使用即可。 Client 配置在筆者的叢集中,是在 10.6.3.32、10.6.3.33、10.6.3.36、10.6.3.48 上完成。

driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1

# 配置時間伺服器為本地的時間伺服器

server 10.6.3.43
restrict 10.6.3.43 nomodify notrap noquery

server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10

includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

為了簡單,這裡只列出了配置項,註釋全部清理了。

四. Server 端啟動 NTP 服務與外網時間伺服器同步

4.1 啟動 Server 端的 NTP 伺服器

因為在 “2.4 先使用 ntpdate 手動同步下時間” 中我們已經和外部時間伺服器進行過一次時間校準了。所以在叢集中作為 NTPD服務 的 10.6.3.3.43 主機上直接先啟動 NTP 服務(root 許可權下完成)

service ntpd start
chkconfig ntpd on

啟動後,一般需要 5-10 分鐘左右的時候才能與外部時間伺服器開始同步時間。可以通過命令查詢NTPD服務情況。

4.2 檢視服務連線和監聽

1. netstat -tlunp 檢視埠以及監聽情況

netstat -tlunp | grep ntp      

這裡寫圖片描述

表示連線和監聽已正確,採用UDP方式


2. ntpq -p 檢視網路中的NTP伺服器,同時顯示客戶端和每個伺服器的關係

ntpq -p

筆者不定時地進行檢視,過程如下:

這裡寫圖片描述

很明顯,作為等級才 10 的 LOCAL 在等級為 2 的時間伺服器面前,不敢囂張了…

符號 含義
* 響應的NTP伺服器和最精確的伺服器
代表目前正在作用當中的上層 NTP
+ 響應這個查詢請求的NTP伺服器
代表也有連上線,而且可作為下一個提供時間更新的候選者
blank
(空格)
沒有響應的NTP伺服器
remote 響應這個請求的NTP伺服器的名稱
refid NTP伺服器使用的更高一級伺服器的名稱
st 正在響應請求的NTP伺服器的級別
when 上一次成功請求之後到現在的秒數
poll 本地和遠端伺服器多少時間進行一次同步,單位秒,在一開始執行NTP的時候這個poll值會比較小,伺服器同步的頻率大,可以儘快調整到正確的時間範圍,之後poll值會逐漸增大,同步的頻率也就會相應減小
reach 用來測試能否和伺服器連線,是一個八進位制值,每成功連線一次它的值就會增加
delay 從本地機發送同步要求到ntp伺服器的往返時間
offset 主機通過NTP時鐘同步與所同步時間源的時間偏移量,單位為毫秒,offset越接近於0,主機和ntp伺服器的時間越接近
jitter 統計了在特定個連續的連線數裡offset的分佈情況。簡單地說這個數值的絕對值越小,主機的時間就越精確


3. ntpstat 檢視連線並同步後資訊

ntpstat 

這裡寫圖片描述

五. Client 端啟動 NTP 服務與內網時間伺服器同步

5.1 手動更新 Client 時間

ntpdate -u 10.6.3.43
>> 26 Dec 18:23:32 ntpdate[20408]: step time server 10.6.3.43 offset 58.586935 sec

然後寫入硬體時間

date;hwclock -w

5.2 啟動 Client 端的 NTP 伺服器

service ntpd start
chkconfig ntpd on

5.3 檢視服務連線和監聽

ntpq -p

這裡寫圖片描述

過了一陣子後,改為 master5(10.6.3.43) 為 NTP 時間伺服器

這裡寫圖片描述

5.4 常見錯誤處理

ntpdate -u ip -> no server suitable for synchronization found

判斷:在 ntp 客戶端用 ntpdate –d serverIP 檢視,發現有 “Server dropped: strata too high” 的錯誤,並且顯示”stratum 16”。而正常情況下 stratum 這個值得範圍是“0~15”,或者是配置檔案沒有配置好。

原因:NTP server 還沒有和其自身或者它的 server 同步上。在 ntp server 上重新啟動 ntp 服務後,ntp server 自身或者與其 server 的同步的需要一個時間段,這個過程可能是5分鐘,在這個時間之內在客戶端執行 ntpdate 命令時會產生 no server suitable for synchronization found 的錯誤。或配置檔案 (/etc/ntp.conf)配置有誤或壓根沒配置。

處理:等待幾分鐘後,重試一般解決,或重新配置 /etc/ntp.conf

參考資料: