業(yè)務(wù)場(chǎng)景
由于開(kāi)發(fā)用的laravel框架呼猪,業(yè)務(wù)中用了很多job定時(shí)任務(wù),時(shí)間幾乎分布在全天的任何時(shí)間點(diǎn)(精確到秒)驹吮,如果服務(wù)器時(shí)間校準(zhǔn)出現(xiàn)時(shí)間跳躍的話依疼,很有可能導(dǎo)致某些計(jì)劃任務(wù)無(wú)法執(zhí)行。
實(shí)現(xiàn)方法分析
首先想到的就是定時(shí)執(zhí)行
20 3 * * * ntpdate 1.cn.pool.ntp.org >> /root/cron.log 2>$1
但是這樣的話會(huì)導(dǎo)致如果任務(wù)A是在20:18:18執(zhí)行,但是ntpdate從20:18:15開(kāi)始校準(zhǔn)逝淹,一下把服務(wù)器時(shí)間設(shè)置成了20:18:20秒耕姊,那么計(jì)劃任務(wù)A就被跳過(guò)了,沒(méi)有執(zhí)行栅葡。
解決以上問(wèn)題的方案
- 先用
ntpdate
每天同步一次(最好在閑時(shí)同步) - 然后用
ntpd
守護(hù)進(jìn)程服務(wù)來(lái)校準(zhǔn)茉兰。
為什么要這樣做呢?原因如下
- ntpd在實(shí)際同步時(shí)間時(shí)是一點(diǎn)點(diǎn)的校準(zhǔn)過(guò)來(lái)時(shí)間的欣簇,最終把時(shí)間慢慢的校正對(duì)规脸。
- ntpdate不會(huì)考慮其他程序是否會(huì)陣痛,直接調(diào)整時(shí)間熊咽。
使用ntpdate導(dǎo)致的問(wèn)題
不幸的是莫鸭,ntpdate調(diào)整時(shí)間的方式就是我們所說(shuō)的”躍變“:在獲得一個(gè)時(shí)間之后,ntpdate使用(當(dāng)誤差大于0.5秒的時(shí)候横殴,用settimeofday直接設(shè)置系統(tǒng)時(shí)間被因,小于0.5秒的時(shí)候用adjtime和偏移量來(lái))設(shè)置系統(tǒng)時(shí)間,這有幾個(gè)非常明顯的問(wèn)題:
- 這樣做不安全衫仑。ntpdate的設(shè)置依賴于ntp服務(wù)器的安全性梨与,攻擊者可以利用一些軟件設(shè)計(jì)上的缺陷,拿下ntp服務(wù)器并令與其同步的服務(wù)器執(zhí)行某些消耗性的任務(wù)文狱。由于ntpdate采用的方式是跳變粥鞋,跟隨它的服務(wù)器無(wú)法知道是否發(fā)生了異常(時(shí)間不一樣的時(shí)候,唯一的辦法是以服務(wù)器為準(zhǔn))如贷。
- 這樣做不精確陷虎。一旦ntp服務(wù)器宕機(jī),跟隨它的服務(wù)器也就會(huì)無(wú)法同步時(shí)間杠袱。與此不同尚猿,ntpd不僅能夠校準(zhǔn)計(jì)算機(jī)的時(shí)間,而且能夠校準(zhǔn)計(jì)算機(jī)的時(shí)鐘楣富。
- 這樣做不夠優(yōu)雅凿掂。由于是跳變,而不是使時(shí)間變快或變慢纹蝴,依賴時(shí)序的程序會(huì)出錯(cuò)(例如庄萎,如果ntpdate發(fā)現(xiàn)你的時(shí)間快了,則可能會(huì)經(jīng)歷兩個(gè)相同的時(shí)刻塘安,對(duì)某些應(yīng)用而言糠涛,這是致命的)。
因而兼犯,唯一一個(gè)可以令時(shí)間發(fā)生跳變的點(diǎn)忍捡,是計(jì)算機(jī)剛剛啟動(dòng)集漾,但還沒(méi)有啟動(dòng)很多服務(wù)的那個(gè)時(shí)候。其余的時(shí)候砸脊,理想的做法是使用ntpd來(lái)校準(zhǔn)時(shí)鐘具篇,而不是調(diào)整計(jì)算機(jī)時(shí)鐘上的時(shí)間。
NTPD 在和時(shí)間服務(wù)器的同步過(guò)程中凌埂,會(huì)把 BIOS 計(jì)時(shí)器的振蕩頻率偏差驱显,或者說(shuō) Local Clock 的自然漂移(drift)記錄下來(lái)。這樣即使網(wǎng)絡(luò)有問(wèn)題瞳抓,本機(jī)仍然能維持一個(gè)相當(dāng)精確的走時(shí)埃疫。
最后提醒一下使用vmware的各位,因?yàn)樘摂M機(jī)的時(shí)鐘不太正常挨下,比正常速度慢好多秒熔恢,所以在虛擬機(jī)上測(cè)試ntpd很難得到理想的結(jié)果脐湾,我當(dāng)年就是為這個(gè)問(wèn)題耽擱了好幾天臭笆。。