不能只靠 Pacemaker + Corosync 实现高可用 NFS 服务——必须加 DRBD 或共享存储,否则双节点可能同时写本地文件系统导致数据损坏、stale file handle 和 ext4 日志破坏;DRBD 提供块级实时同步,Pacemaker 通过严格资源顺序(drbd→filesystem→nfs-server→VIP)和位置约束确保后端唯一可写。

直接说结论:不能只靠 Pacemaker + Corosync 实现“高可用 NFS 服务”——必须加 DRBD(或共享存储),否则数据不一致、脑裂时会损坏文件系统。
NFS 本身无状态,但后端文件系统必须是集群感知或同步的;Pacemaker 只管 VIP 和 nfs-server 进程启停,不管数据。
为什么 NFS 高可用必须配 DRBD 或共享存储
单纯用 Pacemaker 拉起 nfs-server 并漂移 VIP,会导致两个节点同时写同一块磁盘(比如本地 ext4 分区),后果是:
- 客户端看到文件内容错乱、
stale file handle错误频发 - 节点切换时元数据未同步,
ls或cp报Input/output error - 若没 STONITH,脑裂状态下双写直接破坏 ext4 日志,需
e2fsck -f强制修复
DRBD 把两台机器的块设备实时同步(主备模式),Pacemaker 再控制谁挂载、谁导出,才能保证 NFS 后端始终唯一可写。
DRBD + Pacemaker 的资源依赖顺序怎么设
资源必须按严格顺序启动和停止,否则 NFS 导出会失败或挂载报错。关键约束有三类:
-
order:确保drbd→filesystem→nfs-server→VIP串行执行 -
colocation:强制filesystem、nfs-server、VIP必须在同一个节点运行(INFINITY) -
required-providers:给nfs-server显式指定依赖ocf:heartbeat:Filesystem,避免 Pacemaker 误判为“可独立启动”
示例命令:
pcs resource create drbd ocf:linbit:drbd drbd_resource=nfsdata op monitor interval=60s pcs resource master ms-drbd drbd master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true pcs resource create fs Filesystem device="/dev/drbd0" directory="/srv/nfs" fstype="ext4" op monitor interval=60s pcs resource create nfs-server systemd:nfs-server op monitor interval=60s pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.10.100 cidr_netmask=24 op monitor interval=30s <p>pcs constraint order promote ms-drbd then start fs pcs constraint order start fs then start nfs-server pcs constraint order start nfs-server then start vip pcs constraint colocation add fs with ms-drbd INFINITY pcs constraint colocation add nfs-server with fs INFINITY pcs constraint colocation add vip with nfs-server INFINITY pcs resource update nfs-server required-providers=ocf:heartbeat:Filesystem
corosync.conf 的 bindnetaddr 填错会导致 DRBD 资源卡在 Pending
DRBD 启动依赖 Corosync 正常通信;而 bindnetaddr 填错是最常见死因:
- 现象:
pcs status显示drbd状态为Pending或Failed,corosync-quorumtool -s报Can't bind to interface - 错误填法:
bindnetaddr: 192.168.10.186(填本机 IP)、0.0.0.0(Corosync 3.x 已禁用) - 正确填法:用
ip -br a查心跳网卡(如ens33),再算网络地址 —— 若 IP 是192.168.10.186/24,则填192.168.10.0 - 改完必须同步到所有节点,并运行
corosync-cfgtool -s验证语法,再pcs cluster reload corosync
pcs resource cleanup 不会清除 DRBD 的挂起状态
DRBD 主从切换失败后,常出现 Started (unmanaged) 或 Pending 卡住,此时:
-
pcs resource cleanup drbd只清失败记录,不中断当前阻塞操作 - 强行
pcs resource disable drbd可能导致 DRBD 进入Split-Brain状态,需人工介入 - 正确做法:
pcs resource debug-start drbd --debug查输出,确认是否卡在drbdadm primary;若是,登录对应节点手动执行drbdadm primary nfsdata,再pcs resource manage drbd
真正容易被忽略的是:DRBD 的 split-brain 自动恢复策略(after-sb-0pri discard-zero-changes)必须提前写进 /etc/drbd.d/nfsdata.res,否则脑裂后不会自动选主。


















