CRM资源不自动漂移的根本原因是约束缺失或监控配置不当:需确保op monitor存在且合理、location约束无-INFINITY锁死、no-quorum-policy设为ignore/freeze。

为什么 crm configure 里加了资源但不自动漂移?
常见现象是:手动用 crm resource migrate 能切,但节点宕机或服务崩溃后资源没自动转移。根本原因通常是约束(constraints)缺失或资源监控配置不当。
必须确保三件事同时成立:
-
primitive资源定义中包含op monitor,且 interval 和 timeout 合理(例如op monitor interval="30s" timeout="20s"),否则 Pacemaker 不知道服务是否存活 - 存在
location约束绑定资源到节点时,不能带score="-INFINITY"类的硬性禁止规则,否则会锁死资源 - 集群启用了
no-quorum-policy,默认是stop,意味着多数节点失联时所有资源会被停掉——应改为ignore或freeze(视场景而定)
如何让 Apache 资源在节点故障时 10 秒内完成切换?
关键不在“快”,而在“可预测”:Pacemaker 的切换耗时 = 监控超时 + 停止超时 + 启动超时。Apache 这类服务容易卡在 stop 阶段,导致整体延迟拉长。
实操建议:
- 给
apacheprimitive 显式设置op stop timeout="15s",避免默认 20s 等待过久 - 用
ocf:heartbeat:apache代理而非裸systemd,它内置了更健壮的 status 检查逻辑 - 禁用
start-delay(默认 0),否则每次启动前会无谓等待 - 确认
httpd在目标节点已安装、配置文件路径一致、端口未被占用——Pacemaker 不校验这些,失败只报failed to start
crm_simulate -s 显示迁移成功,但实际没切过去?
这是典型的“模拟通过但真实环境阻塞”问题。模拟器不检查真实系统状态,比如:
- 目标节点磁盘空间不足,
filesystem资源挂载失败 - IP 地址冲突(
IPaddr2资源绑定 VIP 时发现该地址已在另一台机器上响应 ARP) - 资源之间依赖顺序错乱:比如 MySQL 启动前,
filesystem还没 mount 完,但order约束没写或写反了 - corosync 通信延迟高,
quorum投票未及时达成,导致pending状态卡住
排查优先看 crm_mon -1 输出里的 blocked 或 unmanaged 标记,再查对应节点的 journalctl -u pacemaker -n 50。
两节点集群做自动切换为什么总脑裂?
两节点天然缺仲裁,qdevice 或 qnetd 不是可选项,而是必选项。单纯靠 corosync.conf 里设 two_node: 1 只是允许启动,不是解决脑裂。
真正防脑裂要组合动作:
- 启用
qdevice(推荐 qnetd 模式),并在两个节点都运行corosync-qdevice服务 - 把
no-quorum-policy设为freeze,而不是ignore——前者让无法定夺的节点只读停写,后者可能双写损坏数据 - 禁用
allow-unfencing(默认 false),防止 fence 设备失效时跳过 STONITH 检查 - STONITH 必须配置且测试通过,比如
fence_virt或fence_ipmilan,不能留空或注释掉
没 STONITH 的两节点集群,所谓“自动切换”只是赌运气:一旦网络分区,两个节点都以为自己是唯一活的,然后同时写同一份存储。











