0.前言
需求是這麼來的,搭建了Storm集羣進行協同過濾算法的計算性能測試,要求精度在毫秒(ms)級別。局域網內40個虛擬機節點,用 date 命令,精度上和效率上都不可行。因此,就搭建了 NTP 服務器。
1.簡介
簡單的說就是選擇幾部主要主機 (Primary server) 調校時間,讓這些 Primary Servers 的時間同步以後,再開放網絡服務來讓 Client 端聯機,最後使Client 端調整本身的時間。NTP(Network Time Protocol)就是實現這個過程的一個網絡時間協議。它是一個跨越廣域網或局域網的複雜的同步時間協議,可以使得機器得到毫秒級的精度。NTP協議是OSI參考模型的高層協議,符合UDP傳輸協議格式,擁有專用端口(Port)123。隨着時間的推移,計算機的時鐘(硬件時鐘)會傾向於漂移。網絡時間協議(NTP)便可爲路由器、交換機、工做站和服務器之間提供一種時間同步的機制。
2.本次實驗環境php
操做系統: SUSE Linux Enterprise Server 11 (x86_64)
局域網時間服務器IP:172.18.65.1
客戶端同步機器IP:172.18.65.2~172.18.65.41 (40臺)
3.服務器搭建步驟html
1.選擇局域網內一個機器做爲時間同步服務器(172.18.65.1)
2.修改服務器端NTP的主要配置文件ntp.conf(默認路徑爲:/etc/ntp.conf)
$vim /etc/ntp.conf
server 127.127.1.0 # local clock (LCL)
fudge 127.127.1.0 stratum 10 # LCL is unsynchronized
##
## Add external Servers using
## # rcntp addserver <yourserver>
##
##
## Miscellaneous stuff
##
driftfile /var/lib/ntp/drift/ntp.drift # path for drift file
logfile /var/log/ntp # alternate log file
# logconfig =syncstatus + sysevents
# logconfig =all
# statsdir /tmp/ # directory for statistics files
# filegen peerstats file peerstats type day enable
# filegen loopstats file loopstats type day enable
# filegen clockstats file clockstats type day enable
#
# Authentication stuff
#
keys /etc/ntp.keys # path for keys file
trustedkey 1 # define trusted keys
requestkey 1 # key (7) for accessing server variables
# controlkey 15 # key (6) for accessing server variables
增長OR修改如下內容:
restrict default ignore
restrict 172.18.65.0 mask 255.255.255.0 nomodify notrap
#restrict [你的IP] mask [netmask_IP] [parameter]
#其中 parameter 的參數主要有底下這些:
- ignore: 拒絕全部類型的 NTP 聯機;
- nomodify: 客戶端不能使用 ntpc 與 ntpq 這兩支程序來修改服務器的時間參數, 但客戶端仍可透過這部主機來進行網絡校時的;
- noquery: 客戶端不可以使用 ntpq, ntpc 等指令來查詢時間服務器,等於不提供 NTP 的網絡校時囉;
- notrap: 不提供 trap 這個遠程事件登陸 (remote event logging) 的功能。
- notrust: 拒絕沒有認證的客戶端。
3.配置文件就ok了,啓動NTP服務器
172.18.65.1下啓動NTP服務器:service ntp start 或者 /etc/init.d/ntp start
4.手工發起同步(因爲Suse Linux在11版本中摒棄了ntpdate命令,採用新的sntp命令進行操做)
在各個客戶端機器上執行:sntp -P no -r 172.18.65.1
這樣就進行了各客戶端與服務器的時間同步。
5.每隔一段時間,客戶端自動同步
$crontab -e
添加一條如:
* 2 * * * * sntp -P no -r 172.18.65.1 #
每隔2個小時,客戶端與服務器同步一次
4.查看NTP運行狀態命令
$ntpq -q
ntpq -p 能夠列出目前咱們的 NTP 與相關的上層 NTP 的狀態,上頭的幾個字段的意義爲:
- remote:亦便是 NTP 主機的 IP 或主機名囉~注意最左邊的符號
- 若是有『 * 』表明目前正在做用當中的上層 NTP。本實驗中時間服務器是自身同步,因此顯示爲LOCAL(0)
- 若是是『 + 』表明也有連上線,並且可做爲下一個提供時間更新的候選者。
- refid:參考的上一層 NTP 主機的地址
- st:就是 stratum 階層囉!
- when:幾秒鐘前曾經作過期間同步化更新的動做;
- poll:下一次更新在幾秒鐘以後;
- reach:已經向上層 NTP 服務器要求更新的次數
- delay:網絡傳輸過程中延遲的時間,單位爲 10^(-6) 秒
- offset:時間補償的結果,單位與 10^(-3) 秒
- jitter:Linux 系統時間與 BIOS 硬件時間的差別時間, 單位爲 10^(-6) 秒。
5.實驗接着作
按理說,照着這個步驟來,徹底就實現了這個41臺機器的局域網時間同步。可是,我仍是想知道在任意時刻,
各個客戶端與服務器的時間偏差究竟是多少(實驗要求,必須精確到毫秒級別,可是沒有證據代表時間同步到毫秒級別了)。
考慮在使用ntpq -p命令查看狀態時,有時間補償的offset項,該項代表本時間服務器與上一級時間服務器的同步時間偏差。
因此,將剩下的40個客戶端均設置爲服務器,且將172.18.65.1做爲上級服務器。這樣就能經過ntpq -p命令查看時間同步偏差了。
修改客戶端的主要配置文件ntp.conf部份內容以下:
restrict default ignore
server 172.18.65.1 prefer #perfer表示優先將該Server IP 做爲時間源
restrict 172.18.65.0 mask 255.255.255.0 nomodify notrap
fudge 127.127.1.0 stratum 10 # LCL is unsynchronized
#利用server設定上層NTP服務器,上層NTP服務器的設定方式爲:
#server [IP OR HOSTNAME] [PREFER]
#參數說明:
#ip or hostname :上層ntp服務器的ip地址或者域名
#prefer : 表示優先使用的主機
同步以及查看步驟以下:
172.18.65.1下啓動NTP服務器:service ntp start 或者 /etc/init.d/ntp start
各客戶端下啓動服務器:service ntp start linux

能夠看到時間同步偏差爲-0.479ms,在毫秒級別,徹底符合實驗要求。