STONITH 不是“爆掉”节点,而是让故障节点安全、可控地断电或重启,避免脑裂时双节点同时写共享存储;无硬件 fence 设备时禁用 stonith-enabled 是自毁操作;可用代理通过 pcs stonith list 查看,缺失则安装 fence-agents 包;IPMI 配置需严格满足 pcmk_host_list、ipaddr、login、passwd、lanplus=1、cipher=1 和 op monitor;SBD 是共享磁盘替代方案,依赖 watchdog 和统一设备路径,内核需支持 CONFIG_WATCHDOG/CONFIG_SBD。

STONITH 不是“爆掉”节点,而是让故障节点安全、可控地断电或重启,避免脑裂时两个节点同时写共享存储。没有硬件级 fence 设备(如 IPMI、iDRAC、PDU)时,强行用 pcs property set stonith-enabled=false 是自毁式操作——它关掉了集群最后一道数据保护闸门。
怎么确认你的节点支持哪种 STONITH 设备
别猜,直接查可用代理列表:pcs stonith list(不加参数)会列出所有已安装的 fence 插件;加关键词过滤更准,比如:pcs stonith list ipmilan 或 pcs stonith list drac。
常见硬件接口对应关系:
- IPMI 接口 →
fence_ipmilan(最通用,需 BIOS 启用 IPMI,网络可达) - Dell iDRAC →
fence_drac5或fence_idrac(新版推荐后者) - HPE iLO →
fence_ilo或fence_ilo2(注意固件版本匹配) - 带电源管理的 PDU(如 APC、Raritan)→
fence_apc、fence_raritan
如果 pcs stonith list 输出为空,说明没装 fence 代理包:yum install fence-agents-all(RHEL/CentOS)或 zypper install fence-agents(SLES)。
配置 fence_ipmilan 的关键参数和坑
fence_ipmilan 是最常被配错的设备之一。以下参数缺一不可,且顺序/大小写敏感:
-
pcmk_host_list:必须填该 fence 设备要控制的**目标节点主机名**(不是本机),且必须和pcs cluster setup里用的名字完全一致(包括域名) -
ipaddr:目标节点的 IPMI 管理口 IP,不能是业务网卡地址 -
login和passwd:IPMI 账号密码,明文传入,建议用强密码并限制 IPMI 网络访问范围 -
lanplus=1:强制走 IPMI v2.0 加密通道,不加会导致认证失败(尤其新主板) -
cipher=1:配合lanplus=1使用,否则握手失败 -
op monitor interval=60s:必须显式加,否则默认不监控,fence 设备状态永远显示unknown
示例(在 node1 上为 node2 配置):pcs stonith create node2-ipmi fence_ipmilan pcmk_host_list=node2 ipaddr=192.168.10.22 login=ADMIN passwd=StrongPass123 lanplus=1 cipher=1 op monitor interval=60s
为什么 fence 资源创建后 status 是 Failed 或 unknown
这不是配置失败,而是 Pacemaker 还没真正调用它 —— 它只在需要隔离时才触发。但你可以手动验证是否通:
- 先确保 IPMI 口能从当前节点
ping通:ping -c 3 192.168.10.22 - 用
fence_ipmilan命令行工具直连测试:fence_ipmilan -a 192.168.10.22 -l ADMIN -p StrongPass123 -U https://192.168.10.22 -z -v(-z表示只测连接,不执行动作) - 检查
pcs status中是否有stonith-something显示Started,而不是Stopped;若为Stopped,说明资源约束冲突或节点名不匹配 - 常见错误信息:
ERROR: Unable to connect to host→ 网络不通或 IPMI 未启用;ERROR: Login failed→ 账号密码错或用户无“Remote Console”权限
SBD(共享磁盘围栏)作为硬件缺失时的替代方案
没有 IPMI?别急着禁用 stonith-enabled。SBD 是软件级但效果接近硬件的 fallback 方案,前提是有一块所有节点都能读写的共享块设备(如 iSCSI LUN、Azure 共享磁盘、VMware RDM)。
- SBD 不依赖网络心跳,靠磁盘 I/O 通信,天然防网络分区导致的误隔离
- 每个节点必须安装
watchdog并启用:systemctl enable --now watchdog,否则 SBD 无法触发重启 - 初始化命令只在**一个节点**执行:
sbd -d /dev/disk/by-id/scsi-36001405... create,重复执行会清空毒丸区 - 启动前必须确保所有节点都看到同一块设备路径(推荐用
/dev/disk/by-id/,不用/dev/sdb这种易变名) - 启用方式:
pcs stonith create sbd-dev fence_sbd devices=/dev/disk/by-id/scsi-36001405...,然后pcs property set stonith-enabled=true
注意:SBD 要求内核支持 CONFIG_WATCHDOG 和 CONFIG_SBD,较老的 CentOS 7.6 之前内核可能不带 SBD 模块,需升级或打补丁。
真正的难点不在配置命令本身,而在于你是否清楚每一步在防什么、以及一旦跳过某步,数据损坏会在哪个时间点、以什么形式爆发出来。SBD 的 poison pill 写入延迟、IPMI 的 cipher 参数缺失、甚至 watchdog 服务未启动 —— 这些都不是“配置不生效”,而是让围栏变成摆设,等脑裂发生时,已经晚了。











