CRM集群切换后无法挂载DRBD,FreePBX主备集群节点切换故障求助
兄弟,我之前踩过几乎一模一样的Proxmox+FreePBX主备集群的坑,结合你说的症状,咱们一步步拆解解决:
1. 先搞定DRBD挂载失败的核心问题
这是所有连锁故障的源头,先把它理顺:
- 先查DRBD的实时状态:执行
drbdadm status和cat /proc/drbd,确认备用节点在主节点下线后,有没有被Pacemaker切换为Primary状态。如果还是Secondary,那挂载肯定失败——DRBD只有Primary节点能挂载设备。 - 检查
res_filesystem_1的资源配置:用crm configure show res_filesystem_1看挂载路径、DRBD设备(比如/dev/drbd0)是不是正确,有没有加force_unmount=true参数?有时候主节点异常下线后,挂载点会残留进程占用,用fuser -m /your/mount/path就能查到,杀掉这些进程再试挂载。 - 排查DRBD元数据损坏:如果上面都没问题,试试先 invalidate 资源再同步(注意先备份数据!):
drbdadm invalidate your_drbd_resource,然后drbdadm connect your_drbd_resource,等同步完成后再让Pacemaker启动filesystem资源。
2. 修复Pacemaker资源依赖与约束
重置资源后能正常启动,说明资源本身没问题,问题出在切换时的资源顺序/约束:
- 检查资源启动顺序:必须保证DRBD先切换为Primary,再启动filesystem,最后启动FreePBX相关服务。用
crm configure show看有没有类似这样的order约束:
如果没有,手动添加:order drbd_before_fs inf: drbd_resource res_filesystem_1 order fs_before_freepbx inf: res_filesystem_1 asterisk_servicecrm configure order drbd_before_fs inf: drbd_resource res_filesystem_1 - 检查 colocation约束:确保filesystem和DRBD资源绑定在同一个节点,避免Pacemaker把filesystem调度到没有DRBD Primary的节点:
colocation fs_with_drbd inf: res_filesystem_1 drbd_resource
3. 解决主节点关机卡住的问题
提示“waiting for cluster services to unload”,大概率是Pacemaker停止资源超时,或者有残留进程:
- 先修改资源的停止超时配置:给每个集群资源(比如DRBD、filesystem、asterisk)加上
stop-timeout=30s(根据你的服务实际停止时间调整),比如crm configure edit drbd_resource,在里面加这个参数。 - 手动干预关机流程:下次关机前,先手动停止集群服务:
systemctl stop pacemaker corosync,等服务停完再执行shutdown -h now,避免系统等超时。 - 排查残留进程:如果还是卡住,开机后看
/var/log/pacemaker/pacemaker.log,找有没有“resource X failed to stop”的日志,针对性处理那个资源的停止脚本。
4. 根治切换后复现的问题
重置资源能好但切换就坏,说明切换时Pacemaker没有正确清理主节点的资源状态:
- 查看集群日志:切换失败后立刻看
/var/log/pacemaker/pacemaker.log,找类似“resource is still active on node X”的错误——这说明主节点虽然下线,但Pacemaker认为资源还在运行,导致备用节点不敢启动。 - 调整资源粘性:给资源设置
resource-stickiness=100,让集群尽量保持资源在当前节点,但主节点下线时会自动切换。或者设置migration-threshold=1,让节点故障时立刻迁移资源。 - 检查Corosync心跳:用
corosync-cmapctl | grep members确认主备节点的心跳状态,如果心跳超时,切换时会出现状态不同步的问题,检查节点间的网络连通性,调整Corosync的token超时参数。
内容的提问来源于stack exchange,提问作者Павел Ламанов
相关产品推荐
相关产品推荐

