PVE踩坑笔记:集群节点网络能通,但集群投票异常、节点显示离线
一、故障表现
- 节点之间互相ping IP正常,SSH可以登录,业务虚拟机网络无异常
- PVE Web管理界面,集群列表中该节点状态显示离线/红色
- 集群提示:quorum lost(仲裁丢失),无法执行在线迁移、快照、部分存储操作
- 虚拟机还能在故障节点上正常运行,业务不受影响
- 重启pveproxy、pvedaemon无效;只有重启整个节点,集群状态短暂恢复,一段时间后复现
典型特征:业务网络通 ≠ Corosync集群通信正常,这是PVE集群非常容易踩的认知误区。
二、原理简单说明
PVE集群依赖Corosync做节点状态检测、消息同步与仲裁投票。 业务流量(VM、LXC)走业务网卡;Corosync集群心跳、投票消息独立。 ping只是ICMP连通性测试,只能证明三层可达,无法验证Corosync UDP端口、多播/单播消息、时间同步、消息延迟、丢包。 哪怕ping全通,只要corosync数据包丢包、延迟过大、端口被拦截、时间不同步,集群就判定节点失联,标记离线。
三、排查顺序
- 在故障节点上,先查看corosync集群状态
# 查看集群仲裁状态
corosync-quorumtool
# 查看corosync服务状态
systemctl status corosync
- 检查corosync日志,重点看节点失联相关报错
# 实时跟踪corosync日志
journalctl -u corosync -f
- 验证corosync通信端口:Corosync默认使用UDP 5404、5405端口 在各个节点之间互相测试端口连通(使用socat或者nc)
# 在目标节点监听
nc -ul 5404
# 在本节点发送测试数据包
nc -u 节点IP 5404
- 检查节点时间同步(非常关键)
timedatectl
# 查看chrony时间同步状态
chronyc sources
节点之间时间偏差过大,会直接导致corosync消息校验失败,判定节点离线。
- 查看集群成员列表
pvecm status
四、分场景修复方案
场景1:节点时间不同步(最高发)
集群多个节点时钟不一致,时间差超过阈值,corosync消息校验失败,判定节点离线。
修复:
- 所有节点统一NTP服务器(国内推荐阿里云、腾讯云NTP)
- 安装并启用chrony
apt install chrony
systemctl enable --now chronyd
- 强制同步时间
chronyc -a makestep
集群节点时间差建议控制在1s以内。
场景2:防火墙拦截Corosync UDP端口
节点之间业务流量放行,但corosync的UDP 5404、5405被节点防火墙/中间交换机ACL丢弃。 ping使用ICMP不受影响,但是集群心跳包被拦截。
临时验证: 关闭节点本地防火墙systemctl stop pve-firewall,观察集群状态是否恢复。 如果恢复,则是防火墙策略缺失。
生产添加放行规则,放开corosync网段UDP 5404、5405。
场景3:心跳网络延迟高、偶发丢包
ping延迟看着不高,但UDP小包存在随机丢包(交换机拥塞、网卡队列、网线不稳)。 Corosync对小包抖动、丢包非常敏感,少量丢包就会触发节点失联判定。
处理方案:
- 独立心跳网卡:集群业务和corosync心跳网络分离,不要共用一张网卡;
- 调整corosync超时参数,适当加大超时阈值(不推荐调太大,会影响故障判定);
- 更换网线、交换机端口,检查网卡是否有报错:
ethtool -S eth0
查看rx_errors、rx_dropped等指标。
场景4:集群多播环境问题,单播配置错误
老版本集群使用多播,部分交换机不支持IGMP,导致多播心跳包无法跨节点传输。 新建集群推荐使用单播模式。
检查集群配置
cat /etc/corosync/corosync.conf
确认transport为udpu(单播)。如果是多播transport,建议重建集群改为单播。
场景5:pvecm数据库损坏,集群状态异常
corosync服务正常,但集群数据库损坏,节点状态识别异常。 日志会报cmap、cfgdb相关报错。
⚠️ 操作风险较高,操作前备份配置
cp -r /etc/corosync /etc/corosync.bak
根据日志修复,必要时移除节点重新加入集群(谨慎操作,不要在业务高峰执行)。
五、验证修复
修复后持续观察:
watch -n2 pvecm status
所有节点状态正常,Quorum达到预期投票数量,Web面板节点不再离线,虚拟机迁移功能恢复。
六、高频踩坑点
- 用ping判断集群是否正常。ping只代表ICMP通,不能代表corosync通信正常。
- 业务网卡和集群心跳网卡共用,业务流量大时抢占带宽,导致心跳包丢包。
- 集群节点没有配置NTP,服务器时间漂移,不定期出现节点离线。
- 新建集群没有改成单播,交换机不支持多播,间歇性集群失联。
- 遇到quorum丢失直接强行删除集群,没有先查看投票数,容易脑裂。
七、排坑总结
- PVE集群排查顺序:先
pvecm status、corosync-quorumtool,不要先看业务网络。 - 集群故障优先排查三件套:时间同步 → 防火墙端口 → 心跳网络丢包/延迟。
- 生产集群建议独立心跳网卡,使用单播udpu模式,稳定性远高于多播。
- quorum仲裁丢失,优先保证投票数量,谨慎执行强制集群操作,防止集群脑裂。
- 业务网络和集群心跳是两套独立流量,业务通 ≠ 集群心跳正常。
- 点赞
- 收藏
- 关注作者
评论(0)