物理机假死且存储心跳存活时云主机 HA 未触发
问题说明
本文整理了在物理机失联、其上的云主机在 UI 中进入 unknown 状态、但云主机 HA 未能触发、业务因此中断的场景中所使用的结构化排查流程。
现象
- 一台物理机因管理面连接不可达而失联。
- 该物理机上的所有云主机在 UI 中变为
unknown状态,无法操作。 - 尽管物理机实际上对平台已不可用,云主机 HA 未触发。
- 通过带外管理查看物理机时,存在硬件告警(例如硬盘背板告警)。
- 重启各管理节点的 HA 服务无法恢复 HA,且可能破坏双管理节点数据库同步;平台可能需要回退到单管理节点模式以恢复 UI。
适用环境
- 产品:ZCF
- 版本:["4.x", "5.x"]
- 组件:ZStack Cloud
- Deployment form: 多物理机集群,使用共享主存储,且为双管理节点部署。
可能原因
- 物理机处于假死(false-death / 假死)状态:操作系统已无响应,但部分内核层通道仍然存活。存储心跳仍存活,因此不满足 HA 前置条件。
- 存储心跳探测未中断,导致 host checker 认为该物理机仍然可用,从而不触发 HA。
- 平台仅在管理面 ping 失败 并且 存储心跳失败两个条件都满足时才触发 HA;在假死状态下,仅管理面检查失败。
- 物理机上的
kvmagent进程仍处于部分响应状态,并向平台汇报主机存活,即便它已无法承载云主机。
排查步骤
Note:
下方使用的标识符约定。 hostUuid 为受影响物理机的 UUID(例如 b0d4f7a62d6c4f3e8a9c1b2d3e4f5a6b)。vmUuid 为受影响云主机的 UUID。mgmtIp 是用于查询平台状态的管理节点 IP。
1. 确认物理机通过管理面不可达
- 检查管理节点日志,确认平台首次发现物理机故障的时间。源案例中的观察示例:
physical host 11 failed at 14:25:34; host self-check ping failed and the host was declared lost.。 - 命令(在管理节点上执行):
zstack-cli LogInByAccount accountName=admin password='<password>'
QueryHost uuid=b0d4f7a62d6c4f3e8a9c1b2d3e4f5a6b
- 确认物理机状态在 UI 中变为
Disconnected(已断开)。
2. 观察云主机状态变化
- 确认故障物理机上的云主机在 UI 中变为
unknown状态。 - 命令(列出受影响物理机上的云主机):
zstack-cli LogInByAccount accountName=admin password='<password>'
QueryVmInstance hostUuid=b0d4f7a62d6c4f3e8a9c1b2d3e4f5a6b
- 记录时间戳以及受影响的云主机 UUID。
3. 跟踪 HA Worker 的决策
- 检查管理节点的 HA 日志,确认 HA Worker 已针对故障物理机触发:
grep "14:25" /usr/local/zstack/apache-tomcat/logs/management-server.log
grep -i "b0d4f7a62d6c4f3e8a9c1b2d3e4f5a6b" /usr/local/zstack/apache-tomcat/logs/management-server.log
- HA Worker 会调用 host checker 来评估 HA 前置条件。检查 host-checker 日志以判断存储心跳检查是否通过。
- 查找形如
host checker success rate 0.83 exceeds threshold 0.5的日志特征,以确认假死判定。 - HA 决策由 host checker 的成功率阈值(源案例中为
> 0.5)控制。若成功率高于阈值,则 不会 触发 HA。
4. 通过存储心跳和 kvmagent 确认假死状态
- 检查故障物理机上的
kvmagent日志(若能通过带外管理访问),以判断该 agent 是否真的已被 kill,还是处于卡死状态无法迁移或重启云主机:
tail -1000 /var/log/zstack/zstack-kvmagent.log | grep -iE "<vmUuid>|libvirt|qemu|kvm|destroy|kill|shutdown|poweroff|traceback|exception|error"
- HA 决策基于 host checker 的聚合结果;只要存储心跳有一次部分响应,成功率就会保持在阈值之上,从而阻止 HA 触发。
5. 按物理机状态分流
- 若物理机处于真死(存储心跳也失败): HA 预期会自动触发。若未触发,则作为可能的 HA Worker bug 上报研发。
- 若物理机处于假死(存储心跳仍响应但云主机不可达): HA 不会自动触发。请按下方"手动恢复"流程继续。
手动恢复(假死分支)
Note:
警告:手动恢复具有侵入性。请仅在确认物理机已被宣告不可达、并优先考虑业务恢复时执行。以下操作可能破坏双管理节点同步;请准备好回退到单管理节点模式。
源案例采用了以下手动恢复路径。
- 重启 HA 管理服务,尝试在 UI 中恢复受影响云主机的状态:
zsha2 stop-node
zsha2 start-node
- 若恢复过程中双管理节点数据库同步被破坏(例如由于某一管理节点离线),VIP 上的 UI 服务可能无法启动。此时可回退到单管理节点模式:在剩余的管理节点上重启服务,并通过该单管理节点 IP 访问 UI。
- 在单管理节点模式下 UI 可达后,强制停止受影响云主机的自动 HA 恢复,以终止恢复循环。
- 故障物理机经过物理修复并重启后,验证该物理机已重新连接至平台、云主机状态恢复正常后,再重新启用双管理节点模式。
验证方法
- 物理修复后,受影响的物理机在 UI 中显示为
Connected(已连接)。 - 云主机状态恢复正常,没有卡住的 HA 任务。
- 双管理节点数据库同步恢复,VIP 上的 UI 服务可成功启动。
- 集群恢复正常后,云主机 HA 的前置条件可被正确重新评估。
补充信息
- 推荐的后续动作:物理机恢复后,收集故障时段的
kvmagent日志,以确认云主机当时是确实被 kill 掉,还是由于物理机处于假死状态而只是不可达。这些证据可用于确认根因并改进后续的假死处理。
