PVE踩坑笔记:集群脑裂,节点互相失联导致业务异常
很多人搭建PVE集群,想着多节点做高可用,以为装好集群就能自动容灾。实际使用时很容易遇到脑裂问题。节点之间网络短暂波动,集群分裂成多个独立部分,各自认为自己是正常集群,虚拟机在两边尝试同时启动,最终出现磁盘锁冲突、服务异常。
一、脑裂出现后的典型现象
- 集群面板里部分节点显示离线,但服务器本身系统正常运行
- 同一台虚拟机在多个节点同时被尝试启动,报磁盘被占用
- 节点之间ping偶尔丢包,恢复后集群状态依旧错乱
- HA资源在节点间反复漂移,业务不断重启
- 存储报锁冲突,LVM或者Ceph出现元数据异常
很多人第一反应怀疑硬件故障,反复检查硬盘和内存,忽略集群内部的仲裁机制。
二、脑裂产生的根本原因
PVE集群依靠Corosync实现节点之间通信与仲裁。当节点间通信中断,各个节点无法确认其他节点状态。每个节点会单独判断自己是集群唯一存活成员,独立接管虚拟机与存储资源。
普通两节点集群风险最高。两个节点断开网络,双方都认为对方宕机,都会尝试启动HA虚拟机。共享存储没有办法区分谁才是合法持有者,就会出现多节点争抢磁盘。
三、容易诱发脑裂的场景
- 节点之间使用普通业务网卡作为集群通信网卡,跑流量时出现延迟丢包
- 两节点集群没有配置第三方仲裁设备,缺少投票仲裁
- 交换机端口不稳,网线老化,短暂断连几秒就触发分裂
- 防火墙规则拦截Corosync通信端口,节点之间心跳包丢失
- 单节点负载过高,CPU占用爆满,心跳包发送延迟超时
四、排查方法
先确认节点之间心跳网络连通性,在各个节点执行。
corosync-cfgtool -s
查看本地节点状态与心跳链路。
查看集群Quorum仲裁信息。
pvecm status
重点观察Quorum栏,判断集群是否达成仲裁。
查看corosync日志,定位断开时间点。
journalctl -u corosync -f
检查防火墙,确认corosync需要的端口没有被拦截。Corosync使用UDP 5404、5405端口。
五、故障紧急处理步骤
出现脑裂之后不要直接强制启动虚拟机,优先恢复集群仲裁。
- 确认业务数据安全,暂停所有HA自动迁移策略。
- 选择保留其中一个节点作为有效集群,其余节点关机。不要在分裂的两边同时运行虚拟机。
- 在保留的正常节点执行集群强制仲裁。
pvecm expected 1
- 其他节点恢复网络连通后,重新加入集群,检查虚拟机锁状态。
- 全部节点状态正常后,恢复HA配置。
强制仲裁属于应急操作,操作前做好备份,错误操作可能损坏共享存储数据。
六、长期预防方案
1. 拆分网络,独立心跳网卡
集群心跳不要和虚拟机业务网络共用网卡。单独用网卡或者VLAN承载Corosync通信。降低业务流量挤占心跳通道的概率。
2. 两节点集群必须增加仲裁设备
两节点原生集群风险很高。建议添加QDevice仲裁服务,部署在独立机器上。
pvecm qdevice setup 仲裁服务器IP
引入第三方投票,网络断开时避免两边各自争夺资源。
3. 优化心跳超时参数
根据网络质量调整corosync超时,网络不稳定环境适当调高超时,避免瞬时抖动判定节点离线。修改配置文件/etc/corosync/corosync.conf,修改后重启corosync服务。
4. 网络层面加固
使用稳定交换机,定期检查网线。开启端口错误计数监控。节点之间心跳链路做链路聚合,降低单链路故障概率。
5. HA资源约束
配置HA资源时增加节点限制,禁止同一虚拟机同时在多节点调度。不要在不稳定集群上大量开启HA自动迁移。
- 点赞
- 收藏
- 关注作者
评论(0)