概述
linux服務器在提供服務時,要和其他機器進行請求的交互,實際生產環境中,可能因為時間不同步,導致了服務異常。
下面介紹下怎么部署NTP服務來解決這個問題。
ps:強烈吐槽下頭條這個新排版功能,只要圖片分辨率比較低然后點添加的時候直接白屏,也無法回退,這個很明顯的bug居然沒測出來,導致我重新寫了三次...
一、NTP服務概述
1、原理
NTP(Network TimeProtocol,網絡時間協議)是用來使計算機時間同步的一種協議。它可以使計算機對其服務器或時鐘源做同步化,它可以提供高精準度的時間校正(LAN上與標準間差小于1毫秒,WAN上幾十毫秒),切可介由加密確認的方式來防止惡意的協議攻擊。
模式:C/S模式
2、使用的端口
默認NTP服務端口:UDP/123
3、ntp和ntpdate區別
1)兩個服務都是centos自帶的(centos7中不自帶ntp)。ntp的安裝包名是ntp;ntpdate的安裝包是ntpdate。他們并非由一個安裝包提供。
2)ntp守護進程為ntpd,配置文件是/etc/ntp.conf
3)ntpdate用于客戶端的時間矯正,非NTP服務器可以不啟動NTP。
二、安裝部署
1、IP規劃

2、環境準備
以下基于centos7.3
2.1、關閉selinux和防火墻
systemctl stop firewalld systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0
2.2、配置yum
# cat /etc/yum.repos.d/t.repo [InstallMedia] name=Centos 7.3 baseurl=file:///media/cdrom/ enabled=1 gpgcheck=0 # mount -o loop -t iso9660 /root/CentOS-7-x86_64-Everything-1611.iso /media/cdrom/ # yum clean all && yum makecache
2.3、EDT 和 CST區別和設置
要檢查各個服務器時間格式,EDT或者是CST,在中國我們將服務器的時間格式調為CST
EDT:指美國東部夏令時間,波士頓、紐約市、華盛頓哥倫比亞特區,都在這個時區內,跟北京時間有12小時的時差,晚12小時。
CST:可以指下面兩種:
1). 美國中部標準時間(西六區,-6:00),中國是東八區(+8:00),北京時間比美國中部標準時間早14個小時。3:45 PMCST是北京時間凌晨1:45。
2). 中澳大利亞標準時間(+10:30),中國是東八區(+8:00),北京時間比中澳大利亞標準時間晚2個半小時。3:45 PMCST是北京時間下午上午5:45。
將系統的時間格式調整為CST的命令如下兩條:
# mv /etc/localtime /etc/localtime.bak # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、搭建NTP服務端
3.1、部署ntp服務
#確定是否已經安裝NTP包,客戶端只安裝ntpdate安裝包 rpm -qa | grep ntp #用yum源安裝 yum -y install ntp /*yum安裝NTP服務*/

3.2、服務端修改配置
# vim /etc/ntp.conf ==================================================================================== #設置默認策略為拒絕所有訪問方式的請求 restrict default ignore #允許哪些機器同步 restrict 127.0.0.1 restrict -6 ::1 #允許局域網內機器同步時間,nomodify拒絕讓他們修改服務器上的時間 restrict 172.xx.xx.xx mask 255.255.255.0 nomodify notrap #將該服務器的本地時間作為ntp server的時間,如果其他客戶端同步,將同步這臺服務器的時間 server 127.127.1.0 #stratum這行是時間服務器的層次。設為0則為頂級,如果要向別的NTP服務器更新時間,請不要把它設為0 fudge 127.127.1.0 stratum 2 #每一個system clock的頻率都有小小的誤差,這個就是為什么機器運行一段時間后會不精確. NTP會自動來監測我們時鐘的誤差值并予以調整. #但問題是這是一個冗長的過程,所以它會把記錄下來的誤差先寫入driftfile.這樣即使你重新開機以后之前的計算結果也就不會丟失了 driftfile /var/lib/ntp/drift # Enable public key cryptography. includefile /etc/ntp/crypto/pw keys /etc/ntp/keys # Disable the monitoring facility to prevent amplification attacks using ntpdc disable monitor ====================================================================================
說明:
關于restrict格式如下:
其中parameter如下:
- ignore:忽略所有類型的ntp連接
- nomodify:不允許客戶端修改服務器的時間參數,但是允許客戶端透過這部主機進行時間校驗。
- noquery: 不允許客戶端進行時間校驗。
- notrap:不提供trap時間登錄
- notrust:拒絕沒有認證的客戶端

3.3、啟動ntp服務
systemctl restart ntpd
3.4、驗證
現在已經啟動了NTP的服務,但是系統時間到底和服務器同步了沒有呢? 為此NTP提供了一個很好的查看工具: ntpq (NTP query)
# watch ntpq -p
建議大家在打開NTP服務器后就可以運行ntpq命令來監測服務器的運行.這里可以使用watch命令來查看一段時間內服務器各項數值的變化。

這里st為 配置文件設置的stratum,范圍是0--15,如果為16就是錯誤的
說明:
- remote: 它指的就是本地機器所連接的遠程NTP服務器
- refid: 它指的是給遠程服務器(e.g. 193.60.199.75)提供時間同步的服務器
- st: 遠程服務器的層級別(stratum). 由于NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端. 所以服務器從高到低級別可以設定為1-16. 為了減緩負荷和網絡堵塞,原則上應該避免直接連接到級別為1的服務器的.
- when: 一個計時器用來告訴我們還有多久本地機器就需要和遠程服務器進行一次時間同步
- poll: 本地機和遠程服務器多少時間進行一次同步(單位為秒). 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增加了,可以盡快調整到正確的時間范圍.之后poll值會逐漸增大,同步的頻率也就會相應減小
- reach: 這是一個八進制值,用來測試能否和服務器連接.每成功連接一次它的值就會增加
- delay: 從本地機發送同步要求到服務器的round trip time
- offset: 這是個最關鍵的值, 它告訴了我們本地機和服務器之間的時間差別. offset越接近于0,我們就和服務器的時間越接近
- jitter: 這是一個用來做統計的值. 它統計了在特定個連續的連接數里offset的分布情況. 簡單地說這個數值的絕對值越小我們和服務器的時間就越精確
三、配置時間同步
客戶端需要停用ntp服務,否則無法運行ntpdata 服務器地址這個命令 來同步時間,同步的時候會提示ntp被使用中。
1、停用ntp服務
systemctl stop ntpd
2、手動同步ntp服務器時間
ntpdate 172.xx.xx.xx
3、定期同步
#每天8點執行同步命令 * 8 * * * /usr/sbin/ntpdate 172.xx.xx.xx;/sbin/hwclock -w