器時(shí)間同步實(shí)戰(zhàn):從NTP原理到chrony最佳實(shí)踐)
1. 從一次詭異的“線上事故”說起為什么要做NTP同步我記得有一次線上環(huán)境排查前端反饋接口偶發(fā)超時(shí)后端日志里卻沒有任何異常。折騰了大半天最后發(fā)現(xiàn)是兩臺(tái)應(yīng)用服務(wù)器的時(shí)間差了快兩分鐘導(dǎo)致一個(gè)依賴時(shí)間戳的分布式鎖失效請(qǐng)求全部擠到了同一臺(tái)機(jī)器上。從那以后我對(duì)時(shí)間同步這件事兒的敬畏心直接拉滿。Linux服務(wù)器的時(shí)間同步核心手段就是NTPNetwork Time Protocol也就是網(wǎng)絡(luò)時(shí)間協(xié)議。它解決的問題很簡(jiǎn)單讓所有機(jī)器的時(shí)間盡可能一致。但這件“簡(jiǎn)單的事”在真實(shí)的生產(chǎn)環(huán)境里一旦沒做好引發(fā)的連鎖反應(yīng)可能非常隱蔽日志時(shí)間對(duì)不上、證書校驗(yàn)失敗、分布式系統(tǒng)腦裂、任務(wù)調(diào)度錯(cuò)亂甚至數(shù)據(jù)庫(kù)主從復(fù)制都能被時(shí)間戳坑出詭異問題。這篇文章我準(zhǔn)備結(jié)合自己這些年折騰NTP的實(shí)戰(zhàn)經(jīng)驗(yàn)從基本原理講到服務(wù)端和客戶端的完整搭建再把踩過的坑、排查思路一并盤一遍。不管你是剛接觸Linux的新手還是要維護(hù)幾十上百臺(tái)服務(wù)器的運(yùn)維同學(xué)按著這篇文章的思路走一遍時(shí)間同步這塊基本就不會(huì)再出幺蛾子了。2. NTP的核心原理與關(guān)鍵概念2.1 為什么時(shí)間同步這么容易被忽略先說一個(gè)反直覺的事實(shí)Linux服務(wù)器本身是有時(shí)間概念的但默認(rèn)情況下它并不保證時(shí)鐘的精確性。機(jī)器里的硬件時(shí)鐘RTCReal-Time Clock用的是廉價(jià)晶振受溫度、電壓影響每天漂移幾秒甚至幾十秒都有可能。系統(tǒng)啟動(dòng)后內(nèi)核會(huì)從硬件時(shí)鐘讀取一次時(shí)間之后主要靠軟件時(shí)鐘system clock來維持。軟件時(shí)鐘雖然精度高但同樣會(huì)漂移。問題在于很多人以為“服務(wù)器時(shí)間一般不會(huì)差太多”。實(shí)際上在離了NTP服務(wù)的機(jī)器上運(yùn)行一個(gè)月后時(shí)間偏差可能達(dá)到幾分鐘這個(gè)量級(jí)足以觸發(fā)前面說的各種隱性故障。NTP的價(jià)值就是持續(xù)校準(zhǔn)系統(tǒng)時(shí)鐘讓服務(wù)器時(shí)間與標(biāo)準(zhǔn)時(shí)間源保持一致并且把網(wǎng)絡(luò)延遲帶來的誤差控制到毫秒級(jí)。2.2 NTP的工作機(jī)制分層、偏移與延遲NTP采用的是一種分層的架構(gòu)英文叫stratum可以理解成一個(gè)“時(shí)間傳遞鏈”Stratum 0高精度時(shí)間源比如原子鐘、GPS接收器。它們不直接對(duì)外提供NTP服務(wù)而是通過串口等方式把自己的時(shí)間傳給上層服務(wù)器。Stratum 1直接與Stratum 0設(shè)備相連的時(shí)間服務(wù)器例如各大云廠商提供的公共NTP服務(wù)器、國(guó)家授時(shí)中心服務(wù)器。Stratum 2從Stratum 1獲取時(shí)間然后再向下級(jí)提供時(shí)間同步服務(wù)。Stratum 3、4……依次類推層級(jí)越高理論精度越低。NTP同步的核心不只是“把你的時(shí)間改過來”而是通過算法計(jì)算出當(dāng)前機(jī)器時(shí)間與時(shí)間服務(wù)器的“偏移量offset”和“網(wǎng)絡(luò)往返延遲delay”然后對(duì)該偏移量進(jìn)行平滑修正或直接跳變。成熟的時(shí)間守護(hù)進(jìn)程不會(huì)簡(jiǎn)單粗暴地把系統(tǒng)時(shí)間一刀切改掉而是會(huì)持續(xù)記錄本地時(shí)鐘的漂移率逐步調(diào)整避免因時(shí)間突變引發(fā)日志錯(cuò)亂或進(jìn)程狀態(tài)異常。順便說一下NTP用的是UDP 123端口不是TCP設(shè)置防火墻時(shí)不要搞錯(cuò)。2.3 閏秒、時(shí)區(qū)與UTC的“三角關(guān)系”再補(bǔ)充一個(gè)容易混淆的概念時(shí)區(qū)與UTC。NTP同步的是UTC協(xié)調(diào)世界時(shí)也就是全球統(tǒng)一的時(shí)間基準(zhǔn)。系統(tǒng)顯示給用戶的時(shí)間則是“UTC 時(shí)區(qū)偏移”。舉個(gè)例子一臺(tái)服務(wù)器設(shè)置了Asia/Shanghai時(shí)區(qū)那它本地顯示的時(shí)間就是UTC8。實(shí)際操作中經(jīng)常遇到的問題不是NTP沒配好而是時(shí)區(qū)沒設(shè)對(duì)。NTP傳的是UTC時(shí)間如果服務(wù)器時(shí)區(qū)錯(cuò)亂哪怕同步成功看起來的時(shí)間照樣不對(duì)。因此配置NTP時(shí)一定要連帶時(shí)區(qū)一起確認(rèn)。3. Linux下NTP服務(wù)端搭建從ntpd到chrony3.1 選型ntpd已老chrony當(dāng)立在Linux生態(tài)里傳統(tǒng)的時(shí)間同步方案是ntpdNTP daemon它出自ntp項(xiàng)目存在了幾十年穩(wěn)定性經(jīng)過長(zhǎng)期驗(yàn)證。但它的啟動(dòng)慢、同步耗時(shí)長(zhǎng)、內(nèi)核時(shí)間調(diào)整策略偏保守在現(xiàn)代高負(fù)載環(huán)境里表現(xiàn)談不上最優(yōu)。近年來的主流發(fā)行版比如CentOS 8、Ubuntu 18.04默認(rèn)都擁抱了chrony。它與ntpd完全兼容同樣使用NTP協(xié)議但同步速度更快對(duì)網(wǎng)絡(luò)抖動(dòng)和服務(wù)器負(fù)載的適應(yīng)性更強(qiáng)特別適合虛擬機(jī)環(huán)境虛擬機(jī)時(shí)鐘漂移通常更嚴(yán)重。我的建議很直接新環(huán)境一律用chrony老環(huán)境如果不是異類架構(gòu)上的歷史包袱盡量遷移到chrony。除非你用的是內(nèi)核非常老、官方源里壓根沒有chrony包的發(fā)行版否則沒有必要再折騰ntpd。3.2 用chrony搭建一個(gè)內(nèi)網(wǎng)NTP服務(wù)器假設(shè)我要搭建一臺(tái)內(nèi)網(wǎng)的NTP時(shí)間服務(wù)器IP是192.168.10.10其他服務(wù)器都從這臺(tái)機(jī)器上同步時(shí)間而它自己則向上級(jí)公網(wǎng)時(shí)間服務(wù)器同步。第一步安裝chrony# Ubuntu / Debian sudo apt update sudo apt install chrony -y # CentOS / RHEL / RockyLinux sudo yum install chrony -y第二步編輯配置文件/etc/chrony/chrony.conf。默認(rèn)配置里已經(jīng)有默認(rèn)的公共服務(wù)器池但為了可控性我習(xí)慣手動(dòng)指定。核心配置如下# 上游時(shí)間源根據(jù)實(shí)際網(wǎng)絡(luò)環(huán)境選擇 server ntp.aliyun.com iburst server time1.aliyun.com iburst server cn.pool.ntp.org iburst # 如果內(nèi)網(wǎng)沒有外網(wǎng)條件也可以指定本地硬件時(shí)鐘作為兜底源 local stratum 10 # 允許客戶端訪問的網(wǎng)段 allow 192.168.10.0/24 # 日志與漂移文件 driftfile /var/lib/chrony/drift關(guān)于配置有幾處要重點(diǎn)解釋一下iburst參數(shù)非常關(guān)鍵。它讓chrony在啟動(dòng)后立刻發(fā)送一批包以快速完成首次同步。沒有它首次同步可能要等幾分鐘到十幾分鐘有了它幾秒內(nèi)就能對(duì)齊。local stratum 10表示如果上游不可達(dá)這臺(tái)服務(wù)器依然可以作為時(shí)間源向局域網(wǎng)內(nèi)提供服務(wù)但層級(jí)標(biāo)記為10比真實(shí)上游層級(jí)高很多客戶端會(huì)比較“不信任”它。這在離線內(nèi)網(wǎng)環(huán)境里特別有用。allow指定了允許同步的網(wǎng)段強(qiáng)烈建議限制范圍不要裸奔成全網(wǎng)段可訪問。第三步啟動(dòng)服務(wù)并設(shè)置開機(jī)自啟sudo systemctl restart chrony sudo systemctl enable chrony第四步驗(yàn)證同步狀態(tài)chronyc tracking輸出示例Reference ID : 7F7F7F01 (ntp.aliyun.com) Stratum : 3 Ref time (UTC) : Wed Dec 18 10:23:45 2024 System time : 0.000012345 seconds fast of NTP time Last offset : 0.000456789 seconds RMS offset : 0.000678901 seconds Frequency : 3.123 ppm fast重點(diǎn)看這幾個(gè)字段Stratum表示當(dāng)前機(jī)器所處層級(jí)System time表示系統(tǒng)時(shí)間與上游的實(shí)時(shí)偏差越小越好Last offset是最近一次同步的偏移量如果這個(gè)數(shù)值在正負(fù)幾毫秒以內(nèi)都是健康的。3.3 老牌ntpd服務(wù)端的配置參考如果你確實(shí)接手的是還在用ntpd的機(jī)器配置也貼一下思路完全一致只是文件名變成了/etc/ntp.confserver ntp.aliyun.com iburst server time1.aliyun.com iburst restrict default nomodify notrap nopeer noquery restrict 192.168.10.0 mask 255.255.255.0 nomodify notrap啟動(dòng)和驗(yàn)證命令分別是sudo systemctl restart ntpd ntpq -pntpq -p的輸出里*開頭的那一行代表當(dāng)前正在使用的同步源表示候選同步源-表示被判定為不可用的同步源。如果沒有*和說明同步有問題需要檢查上游連通性和防火墻。4. Linux客戶端接入NTP服務(wù)與常見坑位4.1 客戶端配置就這么三步對(duì)于客戶端來說最簡(jiǎn)單的方式是將NTP服務(wù)器地址寫入chrony或ntpd的配置文件中指向內(nèi)網(wǎng)時(shí)間服務(wù)器。以chrony客戶端為例編輯/etc/chrony/chrony.conf把默認(rèn)的公共服務(wù)器池注釋掉或保留作為兜底添加上內(nèi)網(wǎng)NTP地址server 192.168.10.10 iburst重啟服務(wù)后用chronyc sources -v查看同步源狀態(tài)chronyc sources -v輸出示例.-- Source mode ^ server, peer, # local clock. / .-- Source state * current synced, combined , - not combined, | / ? unreachable, x time may be in error, ~ time too variable. || .-- xxxx [ yyyy ] /- zzzz || Reachability register (octal) -. | xxxx yyyy last excellent || NTP version (4) - | .-- zzzz estimated error. || Source IP (or name) -- | | ^^ ^ ^* 192.168.10.10 2 6 17 35 -258us[ -686us] /- 69ms看到^*就說明已經(jīng)與這個(gè)源成功同步了。如果后續(xù)想驗(yàn)證系統(tǒng)時(shí)間是否真的被校準(zhǔn)可以用timedatectl輸出中System clock synchronized: yes這一行就代表時(shí)間同步服務(wù)生效了NTP service: active則代表NTP客戶端服務(wù)正在運(yùn)行。4.2 時(shí)區(qū)問題NTP同步無法解決的“表里不一”配置NTP時(shí)一個(gè)典型的認(rèn)知誤區(qū)是只要NTP服務(wù)正常時(shí)間就一定準(zhǔn)。但實(shí)際上NTP同步的是UTC如果系統(tǒng)時(shí)區(qū)配置錯(cuò)誤你看到的時(shí)間依然是錯(cuò)的。舉個(gè)例子一臺(tái)服務(wù)器時(shí)區(qū)被誤設(shè)為UTC但實(shí)際上業(yè)務(wù)在東八區(qū)運(yùn)行環(huán)境里所有日志文件按UTC時(shí)間記錄排查問題時(shí)時(shí)間對(duì)不上會(huì)讓所有人抓狂。檢查并修正時(shí)區(qū)用以下命令# 查看當(dāng)前時(shí)區(qū) timedatectl # 列出所有可用時(shí)區(qū) timedatectl list-timezones # 設(shè)置時(shí)區(qū) sudo timedatectl set-timezone Asia/Shanghai這里要提醒一下修改時(shí)區(qū)后系統(tǒng)時(shí)間和硬件時(shí)間的關(guān)系也要理順。在Linux下還有hwclock這個(gè)命令來維護(hù)硬件時(shí)間Windows和Linux對(duì)硬件時(shí)間的解釋不同Windows默認(rèn)硬件時(shí)間是本地時(shí)間Linux默認(rèn)硬件時(shí)間是UTC但在純Linux環(huán)境里一般建議讓硬件時(shí)間保持UTC由操作系統(tǒng)根據(jù)時(shí)區(qū)設(shè)置換算成顯示時(shí)間。這個(gè)策略在時(shí)間同步里其實(shí)是最穩(wěn)妥的因?yàn)镹TP基于UTC工作一旦硬件時(shí)間被人為改成非UTC又剛好遇到夏令時(shí)之類的調(diào)整很可能出現(xiàn)重啟后時(shí)間差跳變的問題。4.3 systemd-timesyncd與chrony的沖突Ubuntu 18.04以上的系統(tǒng)默認(rèn)自帶一個(gè)輕量級(jí)的時(shí)間同步服務(wù)叫systemd-timesyncd。它本質(zhì)上也走NTP協(xié)議也是一個(gè)SNTP客戶端只是功能比chrony簡(jiǎn)單得多不支持服務(wù)端模式也無法作為NTP服務(wù)器向外提供服務(wù)。如果你在這樣一個(gè)系統(tǒng)上安裝了chrony并啟動(dòng)可能會(huì)遇到問題兩個(gè)服務(wù)同時(shí)監(jiān)聽UDP 123端口必然有一個(gè)起不來。我在實(shí)際部署中遇到過幾次這種情況現(xiàn)象就是chrony啟動(dòng)正常但日志里不斷報(bào)端口占用。解決方法是先禁用systemd-timesyncd再啟動(dòng)chronysudo systemctl stop systemd-timesyncd sudo systemctl disable systemd-timesyncd sudo systemctl restart chrony同樣道理老系統(tǒng)里如果裝了ntpd也要先停掉避免和chrony搶端口。5. 實(shí)操中踩過的坑與排查思路5.1 同步源“不可達(dá)”的排查順序最常見的問題是chronyc sources顯示所有源都是?不可達(dá)。碰到這個(gè)狀態(tài)我一般按下面這個(gè)順序去排查先ping一下NTP服務(wù)器地址確認(rèn)網(wǎng)絡(luò)層通不通。用telnet 192.168.10.10 123或者nc -uvz 192.168.10.10 123確認(rèn)UDP 123是否可達(dá)。注意NTP是UDP協(xié)議普通的telnet對(duì)UDP是不適用的要用nc的UDP模式。確認(rèn)服務(wù)器端防火墻端口是否開放sudo firewall-cmd --list-allCentOS或sudo ufw statusUbuntu。再回服務(wù)器端用chronyc clients或ntpq -c clients看看有沒有客戶端請(qǐng)求進(jìn)來。如果服務(wù)器端能看到請(qǐng)求但客戶端還是顯示不可達(dá)多半是響應(yīng)回包被防火墻攔截了。最后還要看一個(gè)容易被忽略的點(diǎn)客戶端的系統(tǒng)時(shí)間與服務(wù)器偏差如果太大比如差好幾天chrony默認(rèn)策略是“不進(jìn)行大幅跳變”它會(huì)直接判定同步失敗這時(shí)需要手動(dòng)把時(shí)間粗調(diào)到一個(gè)接近值后再讓chrony接管。值得說的是第5條。NTP協(xié)議設(shè)計(jì)中客戶端與服務(wù)端時(shí)間差過大超過RFC定義的panic閾值通常默認(rèn)是1000秒chrony會(huì)拒絕調(diào)整這是為了防止程序誤判導(dǎo)致時(shí)間凌亂。這時(shí)候別愣著手動(dòng)date -s或者用chronyc makestep手動(dòng)步進(jìn)一下再重啟chrony即可。5.2 虛擬機(jī)里NTP為什么更容易漂移如果你用的是KVM、VMware、VirtualBox等虛擬化環(huán)境的虛擬機(jī)時(shí)間漂移問題會(huì)比物理機(jī)嚴(yán)重得多。原因是虛擬機(jī)的時(shí)鐘依賴宿主機(jī)調(diào)度當(dāng)宿主機(jī)CPU負(fù)載過高時(shí)虛擬機(jī)的時(shí)鐘中斷可能被延遲導(dǎo)致時(shí)間推進(jìn)變慢或加速。物理機(jī)上NTP守護(hù)進(jìn)程靠著系統(tǒng)時(shí)鐘的ntp_adjtime()接口來微調(diào)時(shí)鐘頻率效果很好。但在虛擬機(jī)里單純靠微調(diào)頻率很難應(yīng)對(duì)動(dòng)態(tài)變化的漂移率所以現(xiàn)在的做法一般是VMware環(huán)境安裝open-vm-tools開啟時(shí)間同步宿主機(jī)和客戶機(jī)之間會(huì)周期性校準(zhǔn)時(shí)間。KVM環(huán)境確認(rèn)virtio時(shí)鐘驅(qū)動(dòng)virtio_rtc已加載同時(shí)配置chrony定時(shí)步進(jìn)。云服務(wù)器正常情況下云廠商自帶的時(shí)間漂移控制策略相對(duì)完善但依然建議配置chrony做二次保障。還有一個(gè)經(jīng)驗(yàn)是在虛擬機(jī)上把chrony的makestep閾值調(diào)大一點(diǎn)例如makestep 1 3意思是只要系統(tǒng)時(shí)間偏差超過1秒并且在前3次時(shí)鐘更新中就直接步進(jìn)調(diào)整不等待平滑修正。這在虛擬機(jī)場(chǎng)景下能明顯縮短從啟動(dòng)到時(shí)間對(duì)齊的時(shí)間。5.3 日志與監(jiān)控NTP健康狀態(tài)如何日常巡檢時(shí)間同步不是配好就完事兒的日常巡檢很有必要。用一個(gè)簡(jiǎn)單的一行腳本就能做到基礎(chǔ)巡檢chronyc tracking | grep -E System time|Last offset如果System time的絕對(duì)值持續(xù)超過幾百毫秒就該警惕了如果超過1秒基本可以判定同步異常需要立刻檢查上游源和網(wǎng)絡(luò)。如果是分布式系統(tǒng)建議把時(shí)間偏移量納入監(jiān)控告警體系。比如在Zabbix或Prometheus里通過node_exporter就能采集到node_timex_offset_seconds和node_timex_sync_status這兩個(gè)指標(biāo)前者是時(shí)鐘偏移后者是同步狀態(tài)。把偏移量超過100ms設(shè)為warning、超過1s設(shè)為critical是比較合理的閾值。我見過不少P0級(jí)故障追根溯源都是服務(wù)器時(shí)間漂移沒人管最后在證書校驗(yàn)或者分布式鎖上炸雷。時(shí)間同步看起來是基礎(chǔ)中的基礎(chǔ)但越基礎(chǔ)的東西炸起來越是莫名其妙而且定位成本極高。5.4 拆分一張排查速查表直接照著做現(xiàn)象可能原因排查命令 / 處理方法chronyc sources顯示?網(wǎng)絡(luò)不通、防火墻攔截、上游宕機(jī)ping、nc -uvz、firewall-cmd只有^.本地時(shí)鐘沒有^*上游源不可達(dá)或配置錯(cuò)誤檢查server配置項(xiàng)和域名解析Stratum層級(jí)非常高如10上游源不可用觸發(fā)了local兜底檢查上游網(wǎng)絡(luò)兜底層級(jí)高不代表同步精準(zhǔn)日志時(shí)間與真實(shí)時(shí)間差小時(shí)級(jí)時(shí)區(qū)錯(cuò)誤或硬件時(shí)間錯(cuò)誤timedatectl、hwclock -rchrony啟動(dòng)失敗提示端口占用systemd-timesyncd或ntpd在運(yùn)行先停掉沖突服務(wù)再啟動(dòng)chrony同步后時(shí)間依然跳變系統(tǒng)時(shí)間偏移過大觸發(fā)panic保護(hù)手動(dòng)步進(jìn)或調(diào)整makestep策略ntpq -p無*和客戶端與服務(wù)器時(shí)間偏差太大手動(dòng)校準(zhǔn)后重啟服務(wù)用ntpdate -q測(cè)試虛擬機(jī)重啟后時(shí)間錯(cuò)亂RTC時(shí)鐘驅(qū)動(dòng)異?;蛩拗鳈C(jī)時(shí)鐘問題安裝open-vm-tools配置virtio_rtc這張表基本覆蓋了我這幾年遇到的大部分時(shí)間同步問題。每次排查下意識(shí)地把表過一遍能省下不少時(shí)間。6. 進(jìn)階方向PTP、閏秒與企業(yè)場(chǎng)景擴(kuò)展6.1 到底什么時(shí)候才需要上PTPNTP的精度在廣域網(wǎng)環(huán)境下通常是10毫秒級(jí)別在局域網(wǎng)環(huán)境能到亞毫秒到幾毫秒。但對(duì)于某些場(chǎng)景比如金融交易系統(tǒng)的撮合引擎、5G核心網(wǎng)、工業(yè)控制、音視頻同步領(lǐng)域這個(gè)精度還不夠這就需要PTPPrecision Time Protocol精確時(shí)間協(xié)議登場(chǎng)了。PTP的核心思路是通過交換機(jī)等網(wǎng)絡(luò)設(shè)備上的硬件時(shí)間戳配合主從時(shí)鐘的報(bào)文交互把誤差壓縮到微秒級(jí)甚至納秒級(jí)。Linux內(nèi)核里有ptp4l工具專門用來實(shí)現(xiàn)PTP。但它是硬件的活更多一些需要網(wǎng)卡和交換機(jī)支持PTP硬件時(shí)間戳軟件層面再折騰也挽回不了硬件不支持的天生缺陷。我的建議是絕大多數(shù)服務(wù)器場(chǎng)景NTP/chrony足夠用只有明確有亞微秒級(jí)同步需求的場(chǎng)景才考慮PTP。不要為了趕時(shí)髦亂上PTP那玩意兒排查問題比NTP麻煩十倍。6.2 企業(yè)內(nèi)網(wǎng)多臺(tái)服務(wù)器的高可用時(shí)間架構(gòu)如果你管理的服務(wù)器數(shù)量上去了不建議全部服務(wù)器直接連公共NTP服務(wù)器。因?yàn)楣W(wǎng)鏈路的抖動(dòng)和公共服務(wù)器的訪問限制可能導(dǎo)致同步質(zhì)量不穩(wěn)定。更穩(wěn)妥的架構(gòu)是部署2到3臺(tái)內(nèi)網(wǎng)時(shí)間服務(wù)器作為一級(jí)NTP節(jié)點(diǎn)它們各自從不同的公共時(shí)間源同步比如阿里云、騰訊云、國(guó)家授時(shí)中心各一臺(tái)互為備份。其他所有服務(wù)器只指向這幾臺(tái)內(nèi)網(wǎng)機(jī)器。這樣做有幾個(gè)好處內(nèi)網(wǎng)同步速度更快延遲更穩(wěn)定。公共NTP服務(wù)器的請(qǐng)求量由少數(shù)幾臺(tái)承擔(dān)避免全網(wǎng)機(jī)器直連公網(wǎng)被限流。便于統(tǒng)一管控。如果要調(diào)整時(shí)間源只改一級(jí)節(jié)點(diǎn)的配置就行不用動(dòng)幾百臺(tái)機(jī)器。一級(jí)節(jié)點(diǎn)本身還可以設(shè)置互相同步比如讓兩臺(tái)內(nèi)網(wǎng)服務(wù)器之間也建立NTP對(duì)等關(guān)系避免其中一臺(tái)異常導(dǎo)致時(shí)間基準(zhǔn)偏離。再補(bǔ)充一個(gè)細(xì)節(jié)有條件的話把一級(jí)節(jié)點(diǎn)和業(yè)務(wù)機(jī)器的網(wǎng)絡(luò)隔離做好NTP走獨(dú)立的管理網(wǎng)段避免業(yè)務(wù)流量高峰期影響時(shí)間同步報(bào)文。6.3 關(guān)于閏秒普通開發(fā)者要不要操心閏秒是天文觀測(cè)引起的“人為多出一秒”國(guó)際地球自轉(zhuǎn)服務(wù)會(huì)不定期在6月或12月底插入一個(gè)閏秒。對(duì)普通Linux服務(wù)器來說chrony和ntpd都能處理閏秒但處理方式不同ntpd默認(rèn)會(huì)在閏秒發(fā)生時(shí)讓系統(tǒng)時(shí)間在最后一分鐘里“變慢”一秒也就是廣播一次閏秒標(biāo)記。chrony的處理則是直接忽略閏秒照樣按平滑方式調(diào)整對(duì)上層應(yīng)用來說無感知用戶體驗(yàn)更好。某些對(duì)時(shí)間極端敏感的分布式系統(tǒng)比如數(shù)據(jù)庫(kù)在閏秒發(fā)生時(shí)可能出現(xiàn)時(shí)間倒流或重復(fù)時(shí)間戳的情況比如MySQL就出過知名問題。不過按照目前國(guó)際計(jì)量組織的趨勢(shì)閏秒正在被逐步淘汰預(yù)計(jì)2035年以后會(huì)被廢棄。作為普通開發(fā)者至少要知道閏秒的存在和它可能帶來的影響真遇到了先從升級(jí)chrony版本開始排查大概率能解決。在金融、證券這類對(duì)時(shí)間戳一致性有強(qiáng)要求的行業(yè)往往還會(huì)在應(yīng)用層做額外處理不單純依賴系統(tǒng)時(shí)間比如用混合邏輯時(shí)鐘HLCHybrid Logical Clock或者用數(shù)據(jù)庫(kù)內(nèi)部的序列號(hào)來保證順序。這個(gè)屬于另一個(gè)維度的設(shè)計(jì)問題了但理解NTP的局限是理解這些高級(jí)設(shè)計(jì)的前提。最后一個(gè)實(shí)際操作體會(huì)聊到這兒我想起一件自己干過的蠢事早年給客戶裝服務(wù)器所有機(jī)器的chrony都配好了看起來同步也正常但到了第二天發(fā)現(xiàn)時(shí)間還是亂了。后來發(fā)現(xiàn)是機(jī)房的NTP服務(wù)器本身連不上外網(wǎng)而我配置里沒有設(shè)local stratum兜底導(dǎo)致下級(jí)服務(wù)器雖然指了內(nèi)網(wǎng)服務(wù)器但上游源無效整個(gè)鏈路時(shí)間基準(zhǔn)全部失效。從那以后我給自己立了一個(gè)規(guī)矩內(nèi)網(wǎng)NTP服務(wù)器必須配置本地時(shí)鐘兜底并且時(shí)刻監(jiān)控一級(jí)節(jié)點(diǎn)的stratum層級(jí)。只要stratum超過設(shè)定閾值立即告警。另外每接一批新機(jī)器我都會(huì)順手把timedatectl的輸出截圖保存作為基線記錄。時(shí)間同步這事兒看起來小但一旦出問題排查鏈路特別長(zhǎng)成本遠(yuǎn)高于一開始認(rèn)真配置那幾分鐘。如果你也是剛接手一批Linux服務(wù)器我建議今天就把NTP狀態(tài)過一遍確認(rèn)下每臺(tái)機(jī)器的時(shí)間偏差再?zèng)Q定要不要做一輪統(tǒng)一調(diào)整。這種基礎(chǔ)配置上的錢五分鐘后花完能換來的是未來很多個(gè)安穩(wěn)的日夜。