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。
參考資料: