在上文Linux系統安裝後的基礎優化-基於CentOS(5.8/6.4)中,我們提到了如何定時自動更新服務器時間。同時也提到了,當內網機器數量巨大時,如果都去公網ntp服務器同步時間是會有延時的。當然,這也不是僅僅是部署ntp服務器的唯一意義。
隨著網絡規模和網絡應用不斷擴大,網絡設備和服務器數量不斷增加。運維人員在查看眾多服務器日志時,往往發現時間不一,即使手工設置了時間,也會出現因時區或夏令時等因素造成時間誤差;對於部署了集群的生產環境而言它們之間需要協同工作,因此時間的准確可靠性顯得尤為重要。
NTP服務的配置及使用都非常簡單,並且占用的網絡資源也非常小。NTP時間服務器目前廣泛應用於網絡安全、在線教學、數據庫備份等領域。企業采取措施同步網絡設備和服務器的時間非常重要,並且確保服務器產生的日志能提供精確的時間定位更應當得到關注。本系列博文將帶領大家了解NTP的相關知識以及如何在企業生產環境中部署簡易架構的實現負載均衡和高可用的NTP服務器。希望能對大家的學習和運維工作有幫助!
本篇將帶領大家先了解一下時間的相關概念和ntp的一些常識。
一、時間和時區
地球是自西向東自轉,東邊比西邊先看到太陽,東邊的時間也比西邊的早。東邊時刻與西邊時刻的差值不僅要以時計,而且還要以分和秒來計算,這給人們帶來不便。因此,為了克服時間上的混亂,在1884年華盛頓的一次國際經度會議上,把全球劃為了24個時區(東、西各12個時區),規定了格林威治時間(GMT)為0時區時間。而我國首都北京則為東8區,並且我國也將此時間作為全國統一時間,即為北京時間。因此,也就有了我們日常所說的時間的標准了。我們可以理解為,時間是基於時區給出的定義。
然而,我們在計算機中經常看到的是(UTC+08:00)。UTC是英文Coordinated Universal Time的縮寫,翻譯為協調世界時。而UTC+08:00則代表北京為東8區。因此可想而知UTC +00:00即為格林威治時間。
為什麼要提這些呢?
第一,不論我們通過哪種渠道來更新系統的時間,通常公共ntp服務器只會給我們UTC +00:00的時間值,而不是我們當前時區的時間值,因為它也不知道我們在呢啊,所以當我們在安裝系統的時候,選擇時區那一步非常重要。
第二,我國是有夏令時的,也許哪天就會撥快1小時,讓你從東8區變成東9區。當然,到時候還會再撥慢回來的。此時,如果我們設置了正確的時區,當需要改變時間的時候,系統就會自動替我們做出調整。
二、linux的時區
在安裝linux的時候,有一步是讓你選擇時區的,還記得吧。那麼如果我們想更改時區,或者說安裝的時候設置錯了,怎麼辦呢?不用擔心!因為在linux下glibc已經提供給我們了許多編譯好的timezone文件,並且把他們存放在了/usr/share/zoneinfo目錄下,這裡面基本涵蓋了大部分的國家和城市。
[root@c64ntp ~]# ls /usr/share/zoneinfo/ Africa Canada GB Indian Mexico ROC Zulu America Chile GB-Eire Iran Mideast ROK iso3166.tab Antarctica Cuba GMT Israel NZ Singapore posix Arctic EET GMT+0 Jamaica NZ-CHAT Turkey posixrules Asia EST GMT-0 Japan Navajo UCT right Atlantic EST5EDT GMT0 Kwajalein PRC US zone.tab Australia Egypt Greenwich Libya PST8PDT UTC Brazil Eire HST MET Pacific Universal CET Etc Hongkong MST Poland W-SU CST6CDT Europe Iceland MST7MDT Portugal WET
當我們想查看某個時區的時間時,我們可以用zdump命令
[root@c64-client ~]# zdump Cuba Sat Nov 2 08:42:13 CDT 2013 #古巴的時間已經出來了
可是當我們想更改時區的時候怎麼辦呢?
1、修改/etc/localtime文件
/etc/localtime文件定義了我們所在的本地時區,我們可以通過從/usr/share/zoneinfo/下復制我們需要的時區文件去替換/etc/localtime來達到更改時區的目的,例如,這裡我們將時區更改為Cuba的時區
[root@c64-client ~]# /bin/cp /usr/share/zoneinfo/Cuba /etc/localtime [root@c64-client ~]# date Sat Nov 2 08:44:49 CDT 2013 #時區已經更改為了Cuba時區
當然,我們也可以用軟連接的方法來進行時區更換,這次我們更換為Canada的時區
[root@c64-client ~]# ln -sf /usr/share/zoneinfo/Canada /etc/localtime [root@c64-client ~]# date Sat Nov 2 12:46:54 UTC 2013 #這樣剛才Cuba的時區就又變成了Canada的時區了。
2、設置TZ環境變量的值
環境變量大家應該不陌生,時區也是有它自己的環境變量值的,並且很多程序和命令都要調用這個變量的值。這裡我們通過tzselect命令來教大家如何設置TZ環境變量的值。本例以上海時間為例。
[root@c64-client ~]# tzselect Please identify a location so that timezone rules can be setcorrectly. Please selecta continent or ocean. #這裡讓你選擇一個大陸或海洋 1) Africa 2) Americas 3) Antarctica 4) Arctic Ocean 5) Asia 6) Atlantic Ocean 7) Australia 8) Europe 9) Indian Ocean 10) Pacific Ocean 11) none - I want to specify the timezone using the Posix TZ format. #? 5 Please selecta country. #接下來讓你選擇一個國家或者城市 1) Afghanistan 18) Israel 35) Palestine 2) Armenia 19) Japan 36) Philippines 3) Azerbaijan 20) Jordan 37) Qatar 4) Bahrain 21) Kazakhstan 38) Russia 5) Bangladesh 22) Korea (North) 39) Saudi Arabia 6) Bhutan 23) Korea (South) 40) Singapore 7) Brunei 24) Kuwait 41) Sri Lanka 8) Cambodia 25) Kyrgyzstan 42) Syria 9) China 26) Laos 43) Taiwan 10) Cyprus 27) Lebanon 44) Tajikistan 11) East Timor 28) Macau 45) Thailand 12) Georgia 29) Malaysia 46) Turkmenistan 13) Hong Kong 30) Mongolia 47) United Arab Emirates 14) India 31) Myanmar (Burma) 48) Uzbekistan 15) Indonesia 32) Nepal 49) Vietnam 16) Iran 33) Oman 50) Yemen 17) Iraq 34) Pakistan #? 9 Please selectone of the following timezone regions. #現在讓你從以下時間區區域中做出選擇。 1) east China - Beijing, Guangdong, Shanghai, etc. #因為我們要選擇上海時區,所以選擇這個。 2) Heilongjiang (except Mohe), Jilin 3) central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. 4) most of Tibet & Xinjiang 5) west Tibet & Xinjiang #? 1 The following information has been given: China east China - Beijing, Guangdong, Shanghai, etc. Therefore TZ='Asia/Shanghai'will be used. Local timeis now: Sat Nov 2 20:52:38 CST 2013. Universal Time is now: Sat Nov 2 12:52:38 UTC 2013. Is the above information OK? 1) Yes 2) No #? 1 You can makethis change permanent foryourself by appending the line TZ='Asia/Shanghai'; exportTZ #它會在這裡生成你更改這個環境變量的命令,下面執行這個命令即可更改時區 to the file'.profile'inyour home directory; thenlog out and log inagain. Here is that TZ value again, this timeon standard output so that you can use the /usr/bin/tzselectcommandinshell scripts: Asia/Shanghai [root@c64-client ~]# TZ='Asia/Shanghai'; export TZ [root@c64-client ~]# date Sat Nov 2 20:52:49 CST 2013 #可以看到我們的時間已經更改為了上海時間
我們知道如何設置linux的時區後,下面就是計算機的時間問題了。
三、計算機的時間
一台計算機上我們是有兩個時鐘的,一個是硬件時間時鐘(Real Time Clock簡稱RTC),一個是系統時間(System Clock)。
硬件時鐘是指嵌在主板上的特殊的電路。正因為有它存在,我們電腦在關機之後,還能保持正常進行計時。
系統時鐘就是操作系統的kernel所用來計算時間的時鐘。它是從1970年1月1日 00:00:00的UTC時間到目前為止的秒數總和之值。在Linux下,系統時間在開機的時候會和硬件時間進行同步(synchronization),之後就開始各自獨立運行了。
那麼既然兩個時鐘各自獨自運行,那麼時間久了必然就會產生誤差。下面我實時輸出計算機的系統時間和硬件時間
[root@c64-client ~]# date #查看系統時間 Sat Nov 2 21:02:29 CST 2013 [root@c64-client ~]# hwclock --show #查看硬件時間 Sun Nov 3 05:02:22 2013 -0.126978 seconds
我們可以看出,硬件時間和系統時間是不相等的。我們可以通過下面兩個命令,靈活的進行時間同步。
[root@c64-client ~]# hwclock --hctosys #將硬件時間設置成系統時間 [root@c64-client ~]# hwclock --systohc #將系統時間設置成硬件時間 或者也可以是 [root@c64-client ~]# hwclock -r #將硬件時間設置成系統時間 [root@c64-client ~]# hwclock -w #將系統時間設置成硬件時間
知道了如何同步兩個時間,那麼如果如果想更改怎麼做呢?
[root@c64-client ~]# hwclock --set --date="mm/dd/yy hh:mm:ss" #修改硬件時間到指定時間 [root@c64-client ~]# date -s "dd/mm/yyyy hh:mm:ss" #修改系統時間到指定時間
現在我們知道了如何設置系統和硬件的時間,那麼當兩個時間都不准確了怎麼辦呢?
此時,我們就要用到文章開頭提到的NTP服務器了。我們已經知道了NTP服務器是提供時間同步服務了。
 
那麼NTP服務器是怎麼工作的呢?
通過谷歌查閱文檔,我們知道NTP服務器是基於NTP協議想客戶端提供時間同步服務的。NTP(Network Time Protocol)是一種用來使系統和一個精確的時間源保持時間同步的協議。NTP協議是通過Server和Client的方式進行的。
下面我們引入網絡設備中的NTP工作原理,來讓大家理解。
Device A發送一個NTP報文給Device B,該報文帶有它離開Device A時的時間戳,該時間戳為10:00:00am(T1)。
當此NTP報文到達Device B時,Device B加上自己的時間戳,該時間戳為11:00:01am(T2)。
當此NTP報文離開Device B時,Device B再加上自己的時間戳,該時間戳為11:00:02am(T3)。
當Device A接收到該響應報文時,Device A的本地時間為10:00:03am(T4)。
至此,Device A已經擁有足夠的信息來計算兩個重要的參數:
NTP報文的往返時延Delay=(T4-T1)-(T3-T2)=2秒。
Device A相對Device B的時間差offset=((T2-T1)+(T3-T4))/2=1小時。
雖然NTP協議中有對往返時延的計算,但是在生產環境中還是會因為時延問題導致時間不同步,原因出在哪裡呢?
時間延遲通常由2部分構成,一部分來自於外部網絡傳輸上的延遲,一部分來自於內部協議層編解碼時標的過程中。NTP協議本身的計算就加入了網絡傳輸延遲的因素,因此只要NTP從鐘有優秀的同步計算能力,傳輸延時並不會對同步精度產生很大影響,此時內部協議層編解碼時標的過程中產生的時間延遲是影響網絡同步精度的主要因素。傳統的NTP網絡中,如果NTP從鐘和NTP服務器之間間隔了多個stratum,由於在每個節點編解碼時標時都產生時延,因此這個NTP從鐘所獲得的時間精度較差。
綜上所述,在生產環境中,我們受降低時延和解決後端數據應用服務器無法連接公網,卻又必須進行時間同步這兩方面的因素影響,促使我們必須在內網搭建一台或兩台NTP服務器(實現負載均衡高可用)來實現我們企業內部的時間同步服務。
OK!本文就講到這裡了,該講的原理都講的差不多了。由於時間在我們生產環境應用中非常重要,所以此篇幅略有點長。下篇我將詳細講解,如何在企業內網部署NTP服務器。