歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux下ntp服務器的部署實戰理論

在上文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服務器。

Copyright © Linux教程網 All Rights Reserved