0.前言
需求是這么來的,搭建了Storm集群進行協同過濾算法的計算性能測試,要求精度在毫秒(ms)級別。局域網內40個虛擬機節點,用 date 命令,精度上和效率上都不可行。所以,就搭建了 NTP 服務器。
1.簡介
簡單的說就是選擇幾部主要主機 (Primary server) 調校時間,讓這些 Primary Servers 的時間同步之后,再開放網絡服務來讓 Client 端聯機,最后使Client 端調整自己的時間。NTP(Network Time Protocol)就是實現這個過程的一個網絡時間協議。它是一個跨越廣域網或局域網的復雜的同步時間協議,可使得機器獲得毫秒級的精度。NTP協議是OSI參考模型的高層協議,符合UDP傳輸協議格式,擁有專用端口(Port)123。隨着時間的推移,計算機的時鍾(硬件時鍾)會傾向於漂移。網絡時間協議(NTP)即可為路由器、交換機、工作站和服務器之間提供一種時間同步的機制。
詳情:
http://www.ntp.org/ (官網鏈接)
2.本次實驗環境
操作系統: SUSE Linux Enterprise Server 11 (x86_64)
NTP版本:ntpq
4.2.4p8@1.1612-o Sat May 8 09:39:49 UTC 2010 (1) (系統自帶,也可自行下載安裝)
局域網時間服務器IP:172.18.65.1
客戶端同步機器IP:172.18.65.2~172.18.65.41 (40台)
3.服務器搭建步驟
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

可以看到時間同步誤差為-0.479ms,在毫秒級別,完全符合實驗要求。