Note:
操作前需确认维护窗口。修改物理机时间后,云主机时间也可能随之变化,并影响依赖系统时间的业务。
适用场景
- 产品:ZStack Cloud 双管理节点(MN)HA 部署。
- 版本:4.2.x~4.8.x。
- 组件:
chronyd、/etc/chrony.conf、zstack.properties。 - 触发条件:需要将平台时间源(
NTP)变更为新的外部时间服务器。
问题现象
- 客户需要为 ZStack Cloud 平台变更时间源。
- 完成时间源切换后,物理机和管理节点必须保持时钟一致,以确保云主机调度、日志关联和 HA 决策的正确性。
判断方法
- 维护开始前确认平台与所有存储池均健康。
- 确认没有备份或其他长任务正在运行,再重启管理节点服务。
- 明确当前主管理节点的 IP,该值将用作
chrony.serverIp.0。
原因说明
管理节点为整个平台提供时间同步服务。平台在每台管理节点上使用 chronyd,并通过 zstack.properties 中的 chrony.serverIp.0 告诉物理机上的 agent 应该向哪台管理节点同步。要变更时间源,必须同步修改主管理节点的 /etc/chrony.conf 以及两台管理节点的 chrony.serverIp.0,并让物理机重新连接以加载新配置。
解决方案
1. 执行前准备
- 在开始变更前,关闭全局云主机高可用。

- 在两台管理节点上分别备份 ZStack MySQL 数据库:
# 主节点
zstack-ctl dump_mysql --file-name zstack-db-backup-master
# 备节点
zstack-ctl dump_mysql --file-name zstack-db-backup-slave
- 确认新的 NTP 服务器地址,并验证其可从管理网络访问。
2. 处理步骤
Note:
执行以下 zstack-cli 命令前,请先登录 admin 账号:
``bash zstack-cli LogInByAccount accountName=admin password=<password> ``
以下循环命令以 apache-tomcat-8.5.87 为示例,配套截图中的源环境路径为 apache-tomcat-8.5.99。不同 ZStack Cloud 版本的 Tomcat 目录版本号可能不同,执行前必须确认当前环境的实际 apache-tomcat-x.x.xx 路径,并替换后续所有 SSH 命令中的密钥路径。
- 列出物理机。
zstack-cli QueryHost hypervisorType=KVM fields=managementIp | grep managementIp | awk -F '"' '{print $4}'

- 查看每台主机当前 chrony 同步来源。
for i in `zstack-cli QueryHost | grep man | awk -F "\"" '{print $4}'`; do
ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
"echo $i; chronyc sources -v | tail -n2"
done

- 在主管理节点上配置新的 NTP 时间源。
cp /etc/chrony.conf /root/chrony.conf.bak
vi /etc/chrony.conf
# 新增或更新为:
server <new NTP time source> iburst

- 更新两台管理节点上的
chrony.serverIp.0。
cp /usr/local/zstack/apache-tomcat/webapps/zstack/WEB-INF/classes/zstack.properties \
/root/zstack.properties.bak
vi /usr/local/zstack/apache-tomcat/webapps/zstack/WEB-INF/classes/zstack.properties
# 设置:
chrony.serverIp.0=<IP of the primary management node in the cluster>

- 重启双管理节点服务并验证配置。
- 确认平台上没有备份或其他任务在运行。
- 重启双管理节点服务:
zsha2 stop-node; zsha2 start-node
- 验证新配置已生效:
zstack-ctl show_configuration | grep -i chrony

- 重新连接物理机。
- 在 UI 中逐一重连每台物理机,使主机加载
zstack.properties中的新时间源配置。
- 在每台物理机上重启 chronyd 服务。
在 host_ip.txt 中逐行填写当前环境的所有计算节点管理 IP。


for i in `cat host_ip.txt`; do
ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
"echo $i; systemctl restart chronyd"
done

- 验证节点时间同步。
chronyc sources -v
每台节点的输出中,所选时间源前必须带 * 标记。

- 检查 Ceph 集群健康,再将时间写入硬件时钟(所有节点)。
for i in `zstack-cli QueryHost | grep man | awk -F "\"" '{print $4}'`; do
ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
"echo $i; hwclock -w"
done

- 重新开启全局云主机高可用。
- 在 UI 中将全局云主机高可用重新打开。

验证方法
- 在每台管理节点和物理机上执行
chronyc sources -v,新 NTP 服务器前应显示*。 - 在两台管理节点上执行
zstack-ctl show_configuration | grep -i chrony,应显示新的chrony.serverIp.0值。 - Ceph 集群健康检查(UI)报告健康。
- 重新启用全局 HA 后,云主机业务和高可用策略表现正常。
风险与回滚
- 风险: 变更过程中会重启管理节点服务,UI 将短暂不可用。
- 业务时间风险: 修改物理机时间后,云主机时间也可能随之变化,并影响依赖系统时间的业务。
- 兼容性: 两台管理节点上的
chrony.serverIp.0必须保持一致(为主管理节点的 IP)。 - 回滚: 从
/root/chrony.conf.bak恢复/etc/chrony.conf,从/root/zstack.properties.bak恢复zstack.properties,然后重启chronyd与管理节点服务。
