Ubuntu 内网多台服务器时间同步方案(适用于临时能上外网的环境)

哎,最近项目是运行在内网环境下的,出现了由于时间不同步导致的bug。一般来讲,几台服务器的时间不一致,会带来很多问题,比如日志时间对不上、分布式服务出现异常,等等。项目上现在有三台服务器,其中只有一台可以临时访问外网,另外两台完全是内网。将来可能会彻底断网。为了解决时间不同步的问题,我整理了下面这个方案。

一、方案目标

让三台服务器的时间保持一致

  1. 有外网时,能同步公网的标准时间
  2. 无外网时,在内网里保持同步

二、服务器情况

角色IP 地址说明
S1192.168.10.10主服务器,可临时访问外网
S2192.168.10.11从服务器,纯内网
S3192.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 更快更稳定。

  1. 有外网时,S1 会去公网同步标准时间。
  2. 没外网时,S1 会用自己主板的时间来继续提供服务,虽然不是很精确,但几台机器之间不会偏太多。
  3. 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,同样有效。

### Ubuntu 20.04无外网环境下的定时时间同步配置 对于Ubuntu 20.04系统,在无法连接至外部网络的情况下,依然可以通过内部的时间源来保持系统时间的准确性。这通常涉及到使用本地NTP服务器或是通过硬件时钟来进行定期校正。 #### 使用Chrony作为NTP客户端和服务端实现内网时间同步 为了确保即使在网络隔离环境中也能维持精确的时间戳,推荐采用`chrony`工具替代传统的`ntpd`服务[^2]。它不仅支持更广泛的平台兼容性和更高的精度,而且特别适合于偶尔才能访问到参考时间源的情况。 安装并启用Chrony: ```bash sudo apt update && sudo apt install chrony -y ``` 编辑配置文件 `/etc/chrony/chrony.conf` 或者 `/etc/chrony.conf`(取决于具体路径),移除所有指向公共互联网上的NTP服务器条目,并指定一台或多台局域网内的可靠时间提供者;如果不存在这样的设备,则可以考虑将某台机器设为“权威”时间服务器——即允许其依赖自身的RTC(实时时钟)或手动调整后的设定值。 当仅有一台主机充当主控节点时,可以在该主机上保留如下类似的配置项以自定义成一个相对稳定的时间基准点: ```plaintext # Allow the NTP daemon to be queried from any IP address. allow all # Use public servers from the pool.ntp.org project if available, otherwise fallback on local RTC or manually set time. pool ntp.ubuntu.com iburst maxsources 4 offline # Mark as 'offline' since we assume no internet access here. # Specify this machine itself as a stratum-1 server when there's absolutely no other choice. refclock PHC /dev/ptp0 offset 0.5 delay 0.2 refid PPS prefer ``` 上述设置中的`refclock`指令用于指示`chronyd`进程利用物理层时钟(Precision Time Protocol Hardware Clocks)或其他特殊类型的时钟资源作为参考标准之一。这里的例子假设存在某种形式的高度精准计时装置(/dev/ptp0), 如果不具备这类条件可忽略此部分配置。 针对其余子节点而言,只需简单修改它们各自的`/etc/chrony/chrony.conf` 文件,加入指向前述已配置好的中心化时间管理单元的具体地址即可完成整个集群范围内的统一协调工作: ```plaintext server master-node-ip-address iburst ``` 重启 Chrony 服务使更改生效: ```bash sudo systemctl restart chronyd ``` 验证当前状态以及最近一次成功更新事件的发生时刻: ```bash chronyc sources -v chronyc sourcestats -v ``` 以上命令可以帮助确认各成员间是否已经建立了有效的联系并且正在正常交换数据包。 #### 定期执行ntpdate进行一次性时间修正 假如既不想额外搭建一套复杂的分布式架构也不具备合适的硬件设施的话,那么还可以采取一种更为简便的方式 —— 利用手动脚本配合cron作业计划表每隔固定周期调用 `ntpdate` 工具向预选的一组可信伙伴请求最新的日期时间信息进而实施即时性的微调动作。 首先得保证目标平台上确实预先装载好了必要的软件组件: ```bash sudo apt-get install ntpdate ``` 接着创建一个新的shell script文件比如命名为`synchronize_time.sh`, 写入下面的内容并将之保存下来: ```bash #!/bin/bash # Define an array of internal NTP servers within your LAN INTERNAL_NTP_SERVERS=("192.168.2.5") for SERVER in "${INTERNAL_NTP_SERVERS[@]}"; do echo "Attempting synchronization with $SERVER..." sudo ntpdate "$SERVER" done ``` 赋予执行权限给新建的Shell Script : ```bash chmod +x synchronize_time.sh ``` 最后一步就是安排好这个批处理程序按照预期频率自动触发运行了。打开crontab编辑器界面: ```bash crontab -e ``` 追加一行类似于下方所示的日程规划语句进去(这里表示每天凌晨两点整都会启动一次时间同步过程): ```text 0 2 * * * /path/to/synchronize_time.sh >> ~/time-sync.log 2>&1 ``` 这样就实现了即便是在完全封闭式的计算环境中也能够持续获得较为准确可靠的官方授时信号的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Honyelchak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值