編者按: 筆者遇到某單位的云主機時間同步故障問題,致使其教學活動不能按時開展。本文通過檢查集群服務器配置,詳細介紹了對該故障的排查過程。
“新冠”肺炎疫情發生后,為了更好地為師生提供在線教學服務,A 教學單位租用了B 運營商的云主機,將在線教學平臺遷移到了B 運營商的云平臺上。
遷移到云上以后,師生不能像以前那樣按時開展課堂簽到、課堂測驗、課堂教學和課堂小競賽等教學活動。教師按計劃發布這些教學活動后,師生無法按時開展活動,這些活動或比原計劃早幾分鐘、或比原計劃晚幾分鐘。
筆者受A 單位網管員之邀,檢查了該單位的云主機環境。該單位租用了20 多臺B 運營商提供的云主機,這些云主機分別承載在線教學平臺的Web 服務(應用服務器)、數據庫服務、教學資源轉換服務以及教學資源上傳和下載服務,每類服務通過集群實現負載均衡。
基于安全性的考慮,這些云主機并沒有連接到互聯網。它們自成一個私有網絡,只有一臺云主機(集群服務器)對外提供服務,其他云主機以端口映射的方式,通過集群服務器對外提供在線教學服務,其拓撲結構如圖1所示。
當前的故障是,A 單位在線教學活動不是不能開展,而是不能按時開展,還存在步調不一致的現象,可以排除在線教學平臺本身的故障,估計是這些云主機的時間不對,或早于北京時間幾分鐘,或晚于北京時間幾分鐘。
筆者逐一檢查這些云主機,發現多數云主機的時間比北京時間慢5 min 左右,只有少部分云主機時間和現在北京時間相差不多,有的還快1 min 左右,跟前面的分析基本一致。

圖1 單位拓撲結構圖
按理說,都是一家運營商提供的云主機,這些云主機應該在同一個云平臺下,不應該出現時間不一致的現象。經調查才知道,A 單位的網管員也發現了云主機時間不對的問題,因為這些云主機不能連接到互聯網,只能手動調整時間。手動調整時間后沒多久,甚至不到一天,時間又恢復成原樣,比北京時間慢5 min 左右。
在VMware vSphere 虛擬化環境,ESXi 主機會按物理服務器時鐘自動校準時間,而虛擬機操作系統又會按ESXi 主機的時鐘自動校準時間。只要物理服務器時間不對,它會影響ESXi 主機的時間,進而影響運行在ESXi 主機下所有虛擬機的時間。遇到這種時間不對的問題,可以將Exsi 主機時間同步外部NTP 服務器即可。只要ESXi 主機時間配置正確,其下的虛擬機都會和主機自動保持一致。
當前故障和vSphere 虛擬化環境類似,A 單位租用的云主機和ESXi 下的虛擬機比較類似,現在是B 運營商所建云平臺的時鐘出了問題,其下的云主機按云平臺的時鐘自動校準時間。A 單位網絡管理員在云主機上修改的時間只是系統時間,改不了硬件時鐘。只要重啟云主機或過一段時間,云主機的系統會按云平臺時鐘校準時間。
因此,筆者建議該單位網管員聯系云平臺工程師,讓云平臺工程師來修正云平臺時鐘。現在有很多權威的NTP 服務器,因此,也可以在云平臺上同步外部NTP 服務器時間,解決云主機時間問題。
比較遺憾的是,該單位網管員與云平臺工程師幾番溝通后,對方表示現在沒有辦法修正云平臺時鐘,也不能在云平臺上同步外部NTP 服務器。
因A 單位租用的云主機只有一臺可以連接互聯網,其他云主機不能連接到互聯網。于是筆者決定在連接互聯網的云主機上部署NTP 服務,讓其他云主機的時間與這臺云主機同步。因這臺云主機的主要作用是集群服務,為了便于描述,本文后面把這臺云主機稱為集群服務器。
集群服務器使用操作系統是CentOS 7.2,內網地址是192.168.3.45,下面是完整的故障排除過程。
(1)安裝NTP 軟件包:yum install ntp。其中yum是CentOS 在線安裝更新工具,安裝部署NTP 軟件包的時候需要訪問互聯網。
(2)設置時區為亞洲/上海:timedatectl settimezone Asia/Shanghai。
(3)啟動NTP 服務:system ctl start ntpd。
(4)將NTP 服務配置為開機自動啟動:systemctl enable ntpd。
默認情況下,NTP 服務不需要配置,直接可以使用。也可以使用“vi/etc/ntp.conf”命令編輯配置文件"ntp.conf",按需配置NTP服務。原始的NTP 配置文件如圖2 所示。
下面對NTP 配置文件做一個簡單介紹,以便讀者可以根據需要配置NTP。
以driftfile 記錄時間差異:driftfile/var/lib/ntp/drift。
這條配置用來記錄時間差異,NTPD(NTP Daemon)將根據這條配置自動計算本機的頻率與上層time server頻率之間的誤差,并根據記錄結果及時做出調整。

圖2 原始的ntp 配置文件
用restrict 控制相關權限:
restrict 192.168.1.0 mask 255.255.255.0 nomo dify notrap
這條配置實例的意思就是允許192.168.1.0/24 網段的主機進行時間同步,其中nomodify 參數用來限制客戶端不能使用命令ntpc和ntpq 來修改服務器端的時間,“notrap”表示不接受遠程登錄請求。
用server 設定NTP 主機來源:
以下是配置文件默認的NTP 主機來源,也可以指定其它主機來源。其中iburst選項的作用是如果在一個標準的輪詢間隔內沒有應答,客戶端會發送一定數量的包給NTP 服務器。如果在短時間內呼叫幾次NTP 服務器沒有出現可辨識的應答,那么本地時間將不會變化。
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
(1)檢查是否安裝NTP服務:rpm-qa | grep ntp。
如果已安裝NTP 服務,此時會顯示如下NTP 信息:
ntp-4.2.6p5-29.e17.centos.x86_64
ntpdate-4.2.6p5-29.e17.centos.x86_64
(2)查看NTP 服務狀態:systemctl status ntpd。
如果Active 狀態為“act ive(running)”,表示NTP 服務正常。
如果Active 狀態為“in active(dead)”表示未激活,此時可以手動啟動或重啟NTP 服務:
systemctl start ntpd(啟動NTP 服務)
systemctl restart ntpd(重啟NTP 服務)
如果已用命令“system ctl enable ntpd”設 置了開機啟動NTP 服務,但開機后未能自動啟動NTPD 服務,說明系統上存在與NTPD 服務沖突的服務。對CentOS 7.2 而言,安裝系統后,存在chronyd 和chronyc 兩個進程,此時可以使用命令,這是用來維持計算機系統時鐘準確性的程序,它和NTP 服務有沖突,其中chronyd 進程默認是開機自動運行。因此,只要用命令“systemctl disable chronyd”禁止其開機啟動,這樣就可以解決NTP服務不能開機啟動的問題。
(3)查看時間同步狀態。使用“ntpstat”命令可以查看時間同步狀態。
(4)查看當前使用的NTP服務器。使用“ntpq-p”命令可以查看當前使用的是哪臺NTP 服務器。
(5)查看NTPD 進程。使用“pgrep ntpd”命令可以查看NTPD 進程,依此判斷NTP 服務是否在運行。
在默認情況下,NTP 采用的是UDP 協議,端口號是123。如果在安裝NTP 服務的云主機上啟用了防火墻,需要設置防火墻規則,開放這個端口,讓其他云主機的時間與這臺NTP 服務器同步。
Centos 7.2 允許Fire wallD 和iptables 兩種防火墻共存,默認是使用的是FirewallD。
(1)FirewallD 防火墻
如果云主機啟動的是FirewallD 防火墻,可以用以下命令配置FirewallD 防火墻規則,允許其他設備訪問ntp:
firewall-cmd--zone=public--add-port=123/udp--permanent
配置防火墻規則后,重啟防火墻服務,使配置生效:
systemctl restart fire walld
(2)iptables 防火墻
如果云主機啟動的是iptables 防火墻,可以使用如下命令配置防火墻規則,允許其他云主機訪問NTP:
iptables-A INPUT-s 192.168.3.0/24-p udp--dport 123-j ACCEPT
iptables 和firewalld在規則修改方面差別很大。FirewallD 可以動態修改單條規則,動態管理規則集。iptables 則不一樣,添加規則后,需要保存并全部刷新,才可以使防火墻規則生效。在此可以使用“systemctl iptables save”命令保存防火墻規則,通過“systemctl iptables restart”命令重啟防火墻。
A 單位云主機多數使用的是Windows Server 2008操作系統,下面以Windows系統為例,將系統時間配置為自動和NTP 服務器同步。
(1)雙擊屏幕右下角任務欄顯示的時間,打開“日期和時間”窗口。
(2)單擊“Internet 時間→更改設置”設置Internet時間。
(3)出現“Internet 時間設置”對話框后,勾選“與Internet 時間服務器同步”,在“服務器”文本框中輸入新搭建NTP 服務器的IP 地址“192.168.3.45”,單擊“立即更新”按鈕,當前云主機即可保持和NTP 服務器時間同步。
如果云主機是Linux 系統,可以使用NTP 或chrony同步前面配置的NTP 服務器。chrony 是CentOS 默 認的服務,而NTP 服務需要單獨安裝部署。下面就以chrony為例,介紹Linux 系統下的時間同步設置。
(1)使用“vi/etc/chrony.conf”命令編輯chrony 配置文件chrony.conf。chrony.conf 配置文件和NTP 配置文件比較相似,此時可以用“server 192.168.3.45”,將前面配置的NTP 服務器配置NTP 主機源。
(2)配置chrony 后,使用“systemctl restart ehronyd.service”命令重啟ehronyd服務,此時云主機的時間就會自動和前面配置的NTP 服務器同步。
筆者在為A 單位的在線教學平臺配置好時間同步后,該平臺完全恢復了正常訪問,但沒過多久平臺又出現了同樣的故障。A 單位網管員再次找到筆者,詢問是不是NTP 服務器出現了故障,現在云主機的時間又不對了。
筆者找了一臺云主機,再次同步了云主機的時間,能同步成功,說明新部署的NTP服務器能正常工作。同步后,發現Windows 標記的下次同步時間和當前同步時間正好差7 天。
筆者并不了解B 運營商采用的是什么虛擬化技術,可以參照VMwar 虛擬化技術分析當前的故障。在VMware虛擬化技術中,虛擬機的操作系統會利用VMware Tools讀取ESXi 主機系統的硬件時鐘進行同步和校準。即便沒有VMware Tools,虛擬機操作系統每次啟動時都會讀取硬件時鐘,然后進行校準。
同樣,對于A 單位的云主機而言,也有類似VMware Tools的進程,前面雖然已經和NTP 同步了時間,但同步的是系統時鐘,無法修改硬件時鐘,如果與NTP的同步周期超過云主機操作系統與硬件時鐘校準的周期,或在同步周期內重啟過云主機,云主機的時間就會和硬件時鐘保持一致。
上次A 單位網管員與B云平臺運營工程師已經溝通過,沒有辦法讓B 云平臺運營工程師修改底層的硬件時鐘,只能通過縮短云主機與NTP 服務器同步周期來解決云主機時間不對的問題。對于Windows 操作系統而言,可以通過修改注冊表中時間同步對應的鍵值來達到縮短同步周期的目的。
具體步驟如下:
1.打開運行窗口,輸入“regedit”命令,打開注冊表編輯器窗口。
2.打開注冊表編輯器,找到NTP 時間同步周期對應鍵值,其位于[HKEY_LOCAL_MACHINESYSTEMCurrent ControlSetservicesW32 TimeTimeProvidersNtp Client],鍵值是“Special PollInterval”,該鍵值默認數據是“604 800”,這個數據正好是一周的時間(單位是秒)。筆者將其修改“3 600”,也就是將云主機時間同步周期從一周縮短至1 h。
在修改同步周期后,隨即手工同步時間,此時系統顯示距離下次同步時間正好是一個小時,說明修改當即生效。
依此類推,筆者將其他云主機時間同步周期都縮短為1 h。至此,故障修復完成。經過近一周的觀察,再也沒有出現過類似的故障。