Pacemaker 作为 Linux 高可用集群资源管理器,负责在多个节点间调度和故障转移资源。在真实运维场景中,管理员最关心的就是集群此刻是否健康、资源跑在哪个节点、有没有待处理的失败操作。crm_mon 是 Pacemaker 套件里专门用于实时监控集群状态的命令行工具,不需要额外安装组件,只要集群软件正常运行就能使用。它直接读取 CIB(集群信息库)并通过内部的事件流推送更新,因此看到的几乎是最新的决策结果。

一、crm_mon 的基础输出结构与字段解析
直接执行 crm_mon 命令,工具会进入全屏交互模式,默认每秒刷新一次。屏幕顶部展示集群名称、栈类型(如 corosync)、以及当前 DC(Designated Controller)节点。中间部分按节点列出在线状态,再往下是资源段,每一个资源会显示其目标角色、实际运行节点和最近操作返回码。理解这些字段是排查问题的前提,例如节点后若出现 lost 标记,说明该节点在 corosync 层已经不通。
资源行中最容易忽视的是 Failed Actions 区域。当某个资源启动超时或被监控系统查出异常,这里会列出失败的操作名与退出原因。很多初学者只盯着资源是否 Started,却漏掉隐藏的失败尝试,导致下次切换时旧错误被触发。建议在使用时加上 -f 参数强制展开失败动作,或者在非交互模式用 -r 显示资源明细。
除了人类可读格式,crm_mon 还能输出机器友好形式。例如 crm_mon -X 会打印当前 CIB 的 XML 快照,便于被其他程序解析;crm_mon -x 则以精简 XML 呈现差异。对于需要接入自有监控平台的团队,用定时任务抓取 -X 输出并比对节点计数,是最轻量的健康探测方案,不必引入额外 agent。
二、常用参数组合与脚本化监控实践
在自动化场景中,我们通常不会保留交互界面,而是让 crm_mon 跑一次就退出。参数 -1 表示只输出当前状态并结束进程,非常适合写进 shell 脚本。配合 -r 显示资源、-n 显示节点、-t 设置超时,可以构造出稳定的巡检命令。下面示例展示如何检查集群是否全节点在线,并在异常时记录日志:
#!/bin/bash
# 使用 crm_mon 一次性输出并提取离线节点
OUTPUT=$(crm_mon -1 -n 2>/dev/null)
OFFLINE=$(echo "$OUTPUT" | grep -c "Offline")
if [ "$OFFLINE" -gt 0 ]; then
echo "$(date) 集群存在离线节点,请检查 corosync 服务" >> /var/log/cluster_check.log
exit 1
fi
echo "$(date) 集群节点全部在线" >> /var/log/cluster_check.log
上述脚本把标准错误丢弃,避免权限警告干扰解析。实际生产里,还要注意运行身份:crm_mon 读取 CIB 需要足够的 pacemaker 权限,一般通过 sudo 或者放在 root 的 cron 中执行。如果集群启用了 ACL,普通用户可能只能看到被授权的资源,此时脚本取到的结果并不代表全局状态,这一点在跨团队共享监控时要特别说明。
另一个实用参数是 -e,它让 crm_mon 只显示自启动以来发生变化的事件,类似增量日志。把它和 -1 结合,可以做“变更捕获”:当有人手动迁移资源或节点重启,事件行会立刻出现。对于安全审计,这种增量流比全量快照更容易追踪谁在什么时候动了集群。下面的代码展示如何用管道过滤出迁移类事件:
# 捕获资源迁移事件并告警
crm_mon -e -1 | grep -i "migrate" > /tmp/migrate_event.log
if [ -s /tmp/migrate_event.log ]; then
echo "检测到资源迁移,内容如下:"
cat /tmp/migrate_event.log
fi
三、基于 crm_mon 的故障排查思路与误区
当集群发生脑裂或资源反复重启,第一步应是退出花哨的面板,直接用 crm_mon -rf 看失败动作与节点权重。常见误区是看到资源不在首选节点就断定配置错,其实可能是位置约束得分(score)被临时故障拉低。crm_mon 显示的 balance 与 score 信息能帮助判断调度逻辑,而不是盲目修改资源配置。结合 crm_mon 与 crm_verify 校验,往往能发现重复 ID 或相互矛盾的约束。
有些团队试图用 watch crm_mon 代替原生刷新,这是不推荐的。因为 watch 只是周期性重跑命令,无法利用 Pacemaker 内部的推送机制,既浪费 CPU 又可能错过秒级切换。正确做法是用 crm_mon 自带循环,或采用 -i 指定间隔。此外,在容器化部署的 Pacemaker 中,若 PID 命名空间隔离,crm_mon 可能读不到宿主机的 corosync 套接字,此时应挂载对应卷并使用 -h 指定 Unix socket 路径。
最后要提醒,crm_mon 展示的是集群层视角,并不替代操作系统级监控。磁盘满、时钟偏移等底层问题不会直接显示在资源行,但会通过节点 fence 间接反映。因此把 crm_mon 的退出码与节点基础指标(如 uptime、ntpq)组合报警,才能形成闭环。一个稳健的实时监控方案,应当以 crm_mon 提供集群语义,以传统指标提供基础设施语义,两者互补而非互相取代。