陳碩 (giantchen_AT_gmail)
本作品采用“Creative Commons 署名-非商業性使用-禁止演繹 3.0 Unported 許可協定(cc by-nc-nd)”進行許可。
<a href="http://creativecommons.org/licenses/by-nc-nd/3.0/">http://creativecommons.org/licenses/by-nc-nd/3.0/</a>
分布式系統中各節點的時鐘同步是必備的,雖然做不到完全同步(畢竟不是一個時鐘域),但是借助 NTP 服務可以把同一個資料中心(同一個 LAN 上)内的機器的時鐘同步到互相誤差 1 毫秒上下,這通常已經夠用了。(這裡的機器指的是運作 Linux 或 FreeBSD 的機器,Windows 的時鐘精度要差得多,不堪一用。)
那麼要部署多少台 NTP 伺服器才能達到比較高的可用性(availability)呢?
1 台肯定不夠,因為是 single point of failure,它一旦壞了各台機器的時鐘就會漂移。
2 台呢?似乎可以滿足高可用的需求,壞一台也沒關系。但是,一個人戴一塊手表的時候知道時間,當他戴兩塊手表的時候就不知道哪個是準的了。如果資料中心裡有兩台 NTP 伺服器,stratum 數又是一樣(它們之間不互相同步,是以有時間差),在兩台都正常工作的情況下,各台機器怎麼知道應該跟哪台 NTP 伺服器同步時鐘呢?更糟糕的是,萬一有一半的機器跟 NTP1 同步,另外一半跟 NTP2 同步,分屬兩個時鐘陣營,豈不是比不同步好不了多少?(NTP 的算法規定隻能和一台伺服器同步時鐘,不能取兩台伺服器的平均數來同步。)
3 台呢?似乎能打破僵局 (break the tie),有了三個候選者,但願機器們能從中選出一台來與之同步時鐘。但是,即便有 3 台伺服器,仍然不能滿足高可用的需求,隻要有任何一台壞掉,就會退回到第 2 種情況,機器們又戴上了兩個表。
4 台?根據以上分析,似乎要 4 台 NTP 伺服器才能滿足高可用的需求,您同意嗎?在平時,有四個候選時鐘,機器們可以自己選一個來同步,如果壞掉一個,仍然有三個以供選擇,不會出現平局。在部署 4 台 NTP 的時候,可以考慮放兩台在本資料中心,另外兩台放在臨近的資料中心,兩個資料中心的機器可以共享這 4 台 NTP 伺服器,以進一步提高可靠性。
更多?根據以上分析,如果容忍壞兩台 NTP 伺服器,那麼要部署 5 台才夠用,以此類推。
其實,在部署多台 stratum 相同的 NTP 伺服器的情況下,似乎沒有什麼辦法能讓所有的機器都跟其中一台 NTP 伺服器同步時間,各台機器有自己的選擇,會造成 systematical 的時鐘誤差,在設計分布式系統的時候必須要充分考慮機器之間的時鐘誤差(以及可能的時鐘跳變)。
資料中心應該有自己的 stratum 1 NTP 伺服器
Stratum 1 是最高等級的 NTP 伺服器,它直接連到參考時鐘(refclock),能夠獨立報時。
另外,為了提高精度與穩定度,可以用 GPS 馴服鐘(簡單的可以用恒溫晶振+鎖相環 DIY),這比直接使用廉價 GPS 子產品更好(當然,在其他各項條件足夠好的情況下才能看出差別)。
資料中心部署 stratum 1 NTP 的難點恐怕不在 NTP 伺服器本身,而是找能看見足夠的天空的地方裝 GPS 天線,再專門為之布線,讓 GPS 子產品能正常工作。在家玩就簡單得多,把 GPS 子產品的天線貼到窗台上就行。
思考:如何監控 stratum 1 NTP 伺服器是否工作正常呢?看一個表準不準,得用比它更準的時鐘源,那麼如何判斷 stratum 1 的 NTP 伺服器的時鐘是否精确呢?有沒有比它更準的時鐘?在資料中心放原子鐘嗎?其實民用原子鐘也不貴,幾千塊錢(二手 FE-5680A 铷鐘在淘寶賣 100 塊左右),體積跟移動硬碟差不多大。
本文轉自 陳碩 部落格園部落格,原文連結:http://www.cnblogs.com/Solstice/archive/2011/05/31/2063870.html,如需轉載請自行聯系原作者