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

2、環(huán)境準(zhǔn)備
以下基于centos7.3
2.1、關(guān)閉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區(qū)別和設(shè)置
要檢查各個(gè)服務(wù)器時(shí)間格式,EDT或者是CST,在中國我們將服務(wù)器的時(shí)間格式調(diào)為CST
EDT:指美國東部夏令時(shí)間,波士頓、紐約市、華盛頓哥倫比亞特區(qū),都在這個(gè)時(shí)區(qū)內(nèi),跟北京時(shí)間有12小時(shí)的時(shí)差,晚12小時(shí)。
CST:可以指下面兩種:
1). 美國中部標(biāo)準(zhǔn)時(shí)間(西六區(qū),-6:00),中國是東八區(qū)(+8:00),北京時(shí)間比美國中部標(biāo)準(zhǔn)時(shí)間早14個(gè)小時(shí)。3:45 PMCST是北京時(shí)間凌晨1:45。
2). 中澳大利亞標(biāo)準(zhǔn)時(shí)間(+10:30),中國是東八區(qū)(+8:00),北京時(shí)間比中澳大利亞標(biāo)準(zhǔn)時(shí)間晚2個(gè)半小時(shí)。3:45 PMCST是北京時(shí)間下午上午5:45。
將系統(tǒng)的時(shí)間格式調(diào)整為CST的命令如下兩條:
# mv /etc/localtime /etc/localtime.bak # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、搭建NTP服務(wù)端
3.1、部署ntp服務(wù)
#確定是否已經(jīng)安裝NTP包,客戶端只安裝ntpdate安裝包 rpm -qa | grep ntp #用yum源安裝 yum -y install ntp /*yum安裝NTP服務(wù)*/

3.2、服務(wù)端修改配置
# vim /etc/ntp.conf ==================================================================================== #設(shè)置默認(rèn)策略為拒絕所有訪問方式的請(qǐng)求 restrict default ignore #允許哪些機(jī)器同步 restrict 127.0.0.1 restrict -6 ::1 #允許局域網(wǎng)內(nèi)機(jī)器同步時(shí)間,nomodify拒絕讓他們修改服務(wù)器上的時(shí)間 restrict 172.xx.xx.xx mask 255.255.255.0 nomodify notrap #將該服務(wù)器的本地時(shí)間作為ntp server的時(shí)間,如果其他客戶端同步,將同步這臺(tái)服務(wù)器的時(shí)間 server 127.127.1.0 #stratum這行是時(shí)間服務(wù)器的層次。設(shè)為0則為頂級(jí),如果要向別的NTP服務(wù)器更新時(shí)間,請(qǐng)不要把它設(shè)為0 fudge 127.127.1.0 stratum 2 #每一個(gè)system clock的頻率都有小小的誤差,這個(gè)就是為什么機(jī)器運(yùn)行一段時(shí)間后會(huì)不精確. NTP會(huì)自動(dòng)來監(jiān)測(cè)我們時(shí)鐘的誤差值并予以調(diào)整. #但問題是這是一個(gè)冗長的過程,所以它會(huì)把記錄下來的誤差先寫入driftfile.這樣即使你重新開機(jī)以后之前的計(jì)算結(jié)果也就不會(huì)丟失了 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 ====================================================================================
說明:
關(guān)于restrict格式如下:
其中parameter如下:
- ignore:忽略所有類型的ntp連接
- nomodify:不允許客戶端修改服務(wù)器的時(shí)間參數(shù),但是允許客戶端透過這部主機(jī)進(jìn)行時(shí)間校驗(yàn)。
- noquery: 不允許客戶端進(jìn)行時(shí)間校驗(yàn)。
- notrap:不提供trap時(shí)間登錄
- notrust:拒絕沒有認(rèn)證的客戶端

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

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