Pacemaker 是 Linux 高可用集群中广泛使用的资源管理器。它通过节点成员关系、资源约束和策略引擎来决定服务在哪个节点运行。但一旦节点之间的通信中断,集群可能分裂成两个或多个分区,每个分区都认为对方已经死亡并尝试接管资源。如果没有额外手段,共享存储可能被并发挂载,文件系统损坏几乎是必然结果。STONITH 就是为解决这种脑裂场景而设计的节点级隔离技术,它利用带外管理通道强制关闭异常节点,确保老节点真正停止运行后,新节点才接管资源。本文重点说明如何在 Pacemaker 集群中配置硬件隔离设备。

理解 STONITH 与 Pacemaker 的强制要求
STONITH 的全称是 Shoot The Other Node In The Head,字面意思是朝另一个节点的脑袋开枪。它并不只是比喻,而是强调以物理方式切断故障节点对共享资源的访问能力。常见的实现包括通过 IPMI、iLO、iDRAC 等带外管理接口远程断电、重启或切换电源状态。Pacemaker 将这类操作抽象为 fence 代理,管理员通过创建 stonith 资源告诉集群如何隔离每一个节点。
Pacemaker 默认把 stonith-enabled 属性设置为 true。在这种状态下,如果集群没有配置任何 STONITH 资源,资源将不会被启动,因为集群无法在脑裂时保证安全。这是 Pacemaker 刻意设计的保护机制,而不是可忽略的告警。管理员可以执行 pcs property set stonith-enabled=false 临时关闭该检查,但这只适合测试环境。生产集群必须配置至少一个可靠的 STONITH 设备,否则数据损坏风险会显著上升。
在配置之前,需要先确认每个节点都能通过带外管理地址访问。以 IPMI 为例,通常需要知道管理网口的 IP 地址、管理账号和密码。这些信息可以由服务器厂商的带外管理系统提供。另一个需要注意的是网络隔离:带外管理网络最好与业务网络分开,避免业务网络拥塞或中断时连带失去管理通道。如果所有节点共享同一个交换机,还可以给交换机配置管理口作为备用隔离手段。
配置硬件型 STONITH 资源
Pacemaker 官方仓库提供了大量 fence 代理,例如 fence_ipmilan 适用于支持 IPMI 的服务器,fence_ilo4 对应 HPE iLO,fence_idrac 对应 Dell iDRAC。安装命令因发行版略有差异,在 RHEL 或 CentOS 系中执行:
yum install -y fence-agents-ipmilan fence-agents-ilo4 fence-agents-idrac
安装完成后,建议先在命令行中手动测试代理是否能够正常连接并返回节点电源状态。以 IPMI 设备为例,测试命令如下:
fence_ipmilan -a 192.168.100.10 -l admin -p 'your_password' -o status -v
如果返回 Status: ON 或 Status: OFF,说明带外管理通道可用。如果提示认证失败,需要检查用户名、密码以及 IPMI 用户权限。部分服务器默认使用出厂密码,必须在 BIOS 中修改为强密码,否则 fence 操作可能被拒绝。手动验证通过后再创建 STONITH 资源可以减少集群配置中的不确定性。
使用 pcs 命令创建 IPMI 隔离资源的典型写法如下:
pcs stonith create ipmi-fence fence_ipmilan \ pcmk_host_list="node1 node2" \ ipaddr=192.168.100.10 login=admin passwd='your_password' \ op monitor interval=60s timeout=30s
这里 pcmk_host_list 表示该 STONITH 资源可以隔离哪些节点,多个节点用空格分隔。如果每个节点的带外管理 IP 不同,需要使用 pcmk_host_map 做主机到 IP 或端口的映射。例如:
pcs stonith create ipmi-fence fence_ipmilan \ pcmk_host_map="node1:192.168.100.10;node2:192.168.100.11" \ login=admin passwd='your_password' \ op monitor interval=60s
创建完成后可以执行 pcs stonith show 查看配置,并运行 pcs status 确认资源出现在集群状态中且没有失败计数。另外,Pacemaker 要求 STONITH 资源本身不被其他资源依赖,且默认不会在节点间迁移,除非显式配置约束。
测试隔离操作与调整安全参数
配置完成后必须实际执行一次隔离测试,不能只看资源状态为 Started 就认为配置成功。可以在待测节点上触发一次手动隔离,观察目标节点是否被强制重启或关闭。生产测试前务必先迁移走该节点上的资源,避免影响业务。以隔离 node2 为例:
stonith_admin --fence node2
执行后可以在集群另一节点上使用 pcs status 查看 node2 是否进入离线状态,带外管理界面中是否出现电源重启记录。如果目标节点没有重启,需要检查 fence 代理日志,通常位于 /var/log/messages 或通过 journalctl -u pacemaker 查看。常见错误包括密码中的特殊字符未正确引用、IPMI 端口被防火墙拦截、以及管理卡只允许特定 VLAN 访问等。
在双节点集群中,还有一个容易踩到的坑是对称隔离。两个节点同时认为对方故障时,会互相执行 STONITH,可能导致双方都被重启,集群完全停机。为了避免这种情况,可以给其中一个节点的 STONITH 资源设置 delay 属性。例如:
pcs stonith update ipmi-fence delay=10s
这样在该资源被调度执行时会等待 10 秒,让对方先完成隔离,降低双方同时关机的概率。更健壮的做法是为每个节点单独创建带不同 delay 的 STONITH 资源,并配合位置约束指定每个资源只运行在对应节点上。delay 的值应根据带外管理响应时间合理选择,过长会拖慢故障恢复,过短则起不到避免同时隔离的作用。
使用 SBD 实现无带外硬件的隔离
并非所有服务器都提供 IPMI、iLO 或 iDRAC 接口,尤其是一些虚拟机或工控机。这种情况下可以使用 SBD,也就是基于共享存储的隔离方式。SBD 通过向共享磁盘写入消息并结合 Linux 内核 watchdog 实现节点自我隔离。当集群检测到节点失去联系时,健康节点会向共享磁盘的 SBD 分区写入 poison 消息,故障节点上的 watchdog 如果无法及时刷新,就会触发硬件重启。
配置 SBD 需要先在共享存储上划分一个小的分区,例如 1GB 即可,然后安装 sbd 包并初始化:
sbd -d /dev/sdc1 create
接着编辑 /etc/sysconfig/sbd 或使用 pcs 命令配置 SBD 设备,并确保内核加载了 softdog 或硬件 watchdog 模块。最后在 Pacemaker 中启用 SBD 作为隔离机制:
pcs property set stonith-watchdog-timeout=30s pcs stonith create sbd-fence fence_sbd devices=/dev/sdc1
需要注意的是,SBD 依赖共享存储的可靠性。如果共享存储本身发生脑裂或锁丢失,SBD 可能无法正确隔离节点。因此,只要条件允许,硬件型 STONITH 仍然是首选。SBD 更多是作为没有带外管理能力时的兜底方案,也可以与硬件 STONITH 结合使用,形成多层隔离。
常见排错思路与配置检查清单
当 STONITH 资源无法启动或隔离操作失败时,建议按以下顺序排查。第一步确认 fence 代理已安装且路径正确,执行 fence_ipmilan -h 查看帮助。第二步用命令行动态测试目标节点的电源状态,这一步能排除大部分网络和认证问题。第三步检查 Pacemaker 日志,定位具体报错信息。第四步确认 pcmk_host_list 或 pcmk_host_map 中主机名与集群节点名完全一致,包括大小写和域名。
另一个容易被忽略的配置是 stonith-timeout 和 monitor 的超时时间。对于响应较慢的带外管理卡,默认超时可能不够,导致 STONITH 资源被标记为失败。可以在创建资源时提高 timeout 值,例如 op monitor interval=60s timeout=60s。同时要确保防火墙或安全组放行管理卡的 IP 和端口,IPMI 通常使用 UDP 623 端口,部分 iLO 使用 TCP 443。
最后,建议把 STONITH 配置纳入集群变更管理。每次修改密码、更换管理卡 IP 或升级固件后,都要重新执行一次隔离测试。只有经过真实隔离验证的配置,才能在真正故障时保护共享数据不被并发写入。Pacemaker 的 STONITH 机制看似简单,但它承载的是高可用集群最关键的安全边界。