FPs

集羣的NTP 對時問題

NTP 簡單介紹

NTP 是互聯網上設備之間進行對時的協議,如下圖所表示,有多層NTP 服務器,下游服務器向上游進行對時(可以瞭解一下stratum 值)。
NTP

我們假設上游的服務器時間是可靠的,我們所要做的就是儘量使本地計算機時間和上游服務器時間一致,原理如下圖(圖片來自wikipedia):

NTP-Algorithm

  • t0 是客戶端發送請求包時的客戶端時間戳;
  • t1 是服務端收到請求包時的服務端時間戳;
  • t2 是服務端發送響應包時的服務端時間戳;
  • t3 是客戶端收到響應包時的客戶端時間戳。

如果我們假設數據包傳輸來回所花的時間一樣(注意:這是主要的誤差原因),並且客戶端和服務端處理數據包的時間一致, 那麼客戶端和服務端的時間差就是:

(t1-t0)+(t2-t3)/2

簡單推導下公式:

設服務端-客戶端時間差爲:offset
設請求包在網絡上的傳輸時間爲:s0
設響應包在網絡上的傳輸時間爲: s1

按條件得:
t0 + s0 = t1 - offset  => offset = t0 + s0 -t1
t2 + s1 = t3 + offset  => offset = t3 - t2 -s1

=> offset = (t0 - t1 + t3 - t2 + s0 - s1)/2

如果s0 - s1 = 0,即來回傳輸包所話的時間相等,那麼對時的誤差會相對來說小一點,但是在一些糟糕的網絡環境下,例如移動網絡,這個傳輸時間差常常很大,幾百毫秒都有可能,所以在選擇 移動端對時的方案時需注意這個問題。

服務端和客戶端傳輸來回所花的時間爲:( t3 - t0 ) - (t2 - t1)
這個時間在ntpd server 選擇上游ntpd 服務器的算法中可作爲重要的考察指標。我們知道如果來回傳輸總的延時增大,來回傳輸數據包所花時間差值增大的概率也隨之增加。
關於NTP 協議的詳細介紹可以參考:

服務器對時設置

首先需要考慮的是服務器整個集羣時間一致性的問題,然後才是服務器時間和標準時間誤差的問題。

我們知道集羣內網的環境一般都比較好,即可以減少上文中的 (s1 -s0) 的差,所以最好的選擇是在內網搭建NTP Server,供集羣內的所有服務器使用,這樣可以保證整個集羣內的時間一致。
注意:NTP Server 沒必要情況下不要暴露在外網,如果需要給外網訪問,做好授權,避免被作爲NTP 反射攻擊的工具。

這臺NTP Server 也需要上游同步時間。這裏有一個,Linux 常用的ntpd 程序只會在ntpd 啓動時去解析上游服務器的域名,如果這些上游的服務器宕機了,或者更改IP 了,下游是無法主動發現的。
對於這個問題,首先是配置多幾個優質的上游服務器,ntpd 本身對於上游服務器有一個選擇策略,可以避免某幾個上游宕機而同步不到時間。對於上游的這些服務器最好選擇ntp.org 官方的,或者知名廠商或者組織的,總之就是求穩定和可靠,惡意的NTP 數據包影響不是小事。土豪可以自己上硬件授時的工具了,23333。
國內常見的NTP 服務器:

阿里:
time1~7.aliyun.com
分別位於阿里北上深杭青不同的機房,上游據說是GPS 還是北斗授時,相對可靠。

ntp.org:
cn.pool.ntp.org, 0.asia.pool.ntp.org, 1.asia.pool.ntp.org
更多請查看 http://www.pool.ntp.org

上海交大:
ntp.sjtu.edu.cn

另外一個措施是定期重啓內網NTP Server 的進程
集羣內的其他機器的ntp 進程,ntp.conf 設置優先從內網NTP Server 對時。另外需要設置爲開機啓動,並對進程狀態做好監控,同時也記得控制好這些ntp 進程的安全,禁止外網的查詢請求。這些機器的ntp.conf 內的上游服務器可以配置成和內網NTP Server 一致,防止內網NTP Server 長時間宕機。。。

其他參考質料:

2016-04-03 linux ntp