哎,最近項目是運行在內網環境下的,出現了由于時間不同步導致的bug。一般來講,幾臺服務器的時間不一致,會帶來很多問題,比如日志時間對不上、分布式服務出現異常,等等。項目上現在有三臺服務器,其中只有一臺可以臨時訪問外網,另外兩臺完全是內網。將來可能會徹底斷網。為了解決時間不同步的問題,我整理了下面這個方案。
一、方案目標
讓三臺服務器的時間保持一致
- 有外網時,能同步公網的標準時間
- 無外網時,在內網里保持同步
二、服務器情況
角色 | IP 地址 | 說明 |
---|---|---|
S1 | 192.168.10.10 | 主服務器,可臨時訪問外網 |
S2 | 192.168.10.11 | 從服務器,純內網 |
S3 | 192.168.10.12 | 從服務器,純內網 |
我們會讓 S1 做時間同步的“主機”,S2 和 S3 跟著它同步時間。
三、操作步驟
1. 所有服務器先做這些準備工作
# 關閉系統自帶的時間同步服務
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd# 安裝 chrony(我們用它來同步時間)
sudo apt update
sudo apt install -y chrony# 設置時區為中國時間(可根據實際調整)
sudo timedatectl set-timezone Asia/Shanghai# 同步系統時間到主板時鐘
sudo hwclock --systohc
2. 配置主服務器(S1)
我們要讓 S1 能自己從外網同步時間,然后把時間提供給內網其它服務器。
編輯配置文件:
sudo nano /etc/chrony/chrony.conf
替換成下面這些內容:
# 公網時間源
server cn.pool.ntp.org iburst
server ntp.aliyun.com iburst
server ntp.tencent.com iburst# 允許內網訪問這個時間服務(根據實際網段調整)
allow 192.168.10.0/24# 沒有外網時,S1 用自己的時間當源
local stratum 10# 加快第一次同步速度
makestep 1.0 3# 其他默認配置
driftfile /var/lib/chrony/chrony.drift
rtcsync
logdir /var/log/chrony
保存并退出后,重啟服務:
sudo systemctl enable --now chrony
3. 配置內網客戶端(S2 和 S3)
讓 S2 和 S3 只和 S1 同步時間。
編輯配置文件:
sudo nano /etc/chrony/chrony.conf
內容如下:
# 指向主服務器 S1
server 192.168.10.10 iburst prefer# 同步時間時快速修正
makestep 1.0 3# 其他默認配置
driftfile /var/lib/chrony/chrony.drift
rtcsync
logdir /var/log/chrony
保存并退出后,重啟服務:
sudo systemctl enable --now chrony
4. 驗證同步是否成功
S1 上查看同步源:
chronyc sources -v
如果有外網,它應該會顯示外面的時間源。
S2 / S3 上查看同步情況:
chronyc sources -v
你應該能看到 S1 的 IP 地址(192.168.10.10),前面有 ^* 標志,說明它被選作時間源。
還可以查看當前系統時間和參考源偏差:
chronyc tracking
四、原理簡單說一下
chrony 是一個時間同步工具,比老的 ntpd 更快更穩定。
- 有外網時,S1 會去公網同步標準時間。
- 沒外網時,S1 會用自己主板的時間來繼續提供服務,雖然不是很精確,但幾臺機器之間不會偏太多。
- S2 和 S3 只信任 S1,不和外網同步。
這樣三臺機器的時間就始終保持一致。
五、優點和注意點
**優點:**有外網就用外網時間,沒外網也能內網自給自足。所有服務器時間統一,不容易出錯。
注意事項:
如果 S1 防火墻開啟了,記得放開 UDP 的 123 端口(NTP 用的)。
bash sudo ufw allow from 192.168.10.0/24 to any port 123 proto udp
這個方案適合內網環境,有更高要求的話可以考慮接 GPS 授時設備。
六、總結
三臺服務器,一臺臨時能訪問外網,搭個 chrony 時間服務器。其它服務器跟著它同步。外網斷了也不怕,時間不會亂。下次項目中若有類似需求,就可以按照這個方法部署,很快就能搞定。如果有更多服務器,也可以讓它們都指向 S1,同樣有效。