如何在Linux上设置高可用的网络存储监控

来源:Android社区作者:梦乃头衔:网络博主
导读:本期聚焦于小伙伴创作的《如何在Linux上设置高可用的网络存储监控》,敬请观看详情。当生产环境的NFS或iSCSI存储突然出现延迟飙升,业务写入卡死,你能否在故障影响用户前收到告警。高可用网络存储监控的核心不是装一个监控进程,而是让采集、判断与通知在节点失效时仍不中断。本文以Corosync加Pacemaker管理监控组件,用Prometheus抓取存储吞吐与挂载状态,结合Systemd看门狗实现双机热备。重点说明如何通过约束规则避免脑裂,以及用自定义脚本检测存储路径可读性。这样即使一台监控机宕机,另一台能在秒级接管,保障存储异常不漏报。

在Linux环境中部署网络存储之后,最容易被忽视的环节就是持续且高可用的监控。很多团队用单台服务器跑监控代理,一旦这台机器重启或网络隔离,存储异常就无人知晓。真正稳妥的做法是把监控能力本身做成集群服务,当某个节点不可用时,另一个节点自动接手采集与告警。

如何在Linux上设置高可用的网络存储监控

一、整体架构设计

高可用网络存储监控通常由三部分组成:存储探测脚本、监控数据收集器、集群资源管理器。存储探测脚本负责检查挂载点是否可读写、延迟是否超标;监控数据收集器可以是Prometheus Node Exporter的扩展,也可以是自研Agent;集群资源管理器推荐使用Corosync与Pacemaker,它们能确保监控服务在多个节点间只运行一份,且故障即迁移。

为什么不能直接用Keepalived加脚本。Keepalived擅长IP漂移,但对服务健康状态的细粒度判断较弱,容易出现IP切了但监控进程已死的情况。Pacemaker支持资源约束、顺序启动、位置偏好,更适合把监控代理作为资源托管。下表对比两种方案:

方案故障检测精度资源依赖管理脑裂防护
Keepalived弱,主要看VRRP不支持靠脚本辅助
Corosync+Pacemaker强,可自定义监控支持顺序与互斥Quorum机制

二、准备双节点集群

假设我们有两台Linux主机 node1 与 node2,系统为Ubuntu 22.04,均挂载了同一个NFS共享到 /mnt/storage。第一步是配置主机名解析与免密SSH,便于后续Pacemaker分发配置。务必保证两台机器时间同步,否则Corosync投票会出现抖动。

安装集群软件包时,建议关闭系统自带的防火墙干扰,或显式放行5404、5405 UDP端口。安装命令如下:

# 在两台节点分别执行
sudo apt update
sudo apt install -y corosync pacemaker pcs
sudo systemctl enable pcsd
sudo systemctl start pcsd
# 设置hacluster用户密码
echo 'hacluster:monitorpass' | sudo chpasswd

初始化集群前,用pcs cluster auth完成节点互信,再用pcs cluster setup创建名为 storage-mon 的集群。此时Corosync配置文件会自动生成,不需要手工编辑 corosync.conf。

三、编写存储监控脚本

监控脚本要能反映真实业务视角的存储健康度。仅看 mount 命令输出不够,因为内核挂载点存在但后端存储卡死时,mount仍显示正常。我们采用写入探针文件并读取的方式。

下面脚本检查 /mnt/storage 是否可写,并测量写读延迟,超过两秒则报错退出。注意使用 timeout 防止脚本卡死导致Pacemaker判定超时:

#!/bin/bash
# storage_health.sh
MP=/mnt/storage
TEST_FILE=$MP/.health_check_$$
if ! mountpoint -q "$MP"; then
  echo "挂载点不存在"
  exit 1
fi
start=$(date +%s%N)
timeout 2 bash -c "echo probe > $TEST_FILE && cat $TEST_FILE > /dev/null"
rc=$?
rm -f $TEST_FILE
end=$(date +%s%N)
cost=$(( (end - start) / 1000000 ))
if [ $rc -ne 0 ]; then
  echo "存储读写超时"
  exit 1
fi
if [ $cost -gt 2000 ]; then
  echo "存储延迟过高: ${cost}ms"
  exit 1
fi
echo "存储正常 延迟${cost}ms"
exit 0

该脚本退出码非0时,Pacemaker会认为资源不健康。我们将其封装为systemd服务并配合看门狗,比单纯 cron 更可靠,因为systemd能在进程挂掉时自动拉起。

四、将监控纳入Pacemaker资源

创建一个名为 storage-mon 的systemd资源,并配置为仅能在单一节点运行。这样避免两个节点同时探测造成写入冲突。使用 pcs 命令定义资源:

pcs resource create storage-mon systemd:storage-mon.service op monitor interval=30s timeout=10s
pcs constraint location storage-mon prefers node1=50 node2=40
pcs constraint order start storage-mon then start prometheus-agent

上面的约束表示监控服务优先放node1,但若node1宕机,node2接管。顺序约束保证监控代理先于数据收集器启动。为防止脑裂,还需配置Quorum策略:

pcs property set no-quorum-policy=stop

当集群只剩一个节点且不具备法定票数时,停止资源而非继续运行,这避免了双主写入存储探针的怪象。对于两节点集群,可加一个仲裁设备,例如qdevice,提升可用性。

五、对接Prometheus告警

监控脚本的结果可以暴露为文本指标,由Node Exporter的 textfile 收集器读取。我们在脚本成功时写 OK 文件,失败时写 FAIL 文件,Prometheus据此生成告警。

# 在脚本尾部追加
if [ $rc -eq 0 ]; then
  echo "storage_health 1" > /var/lib/node_exporter/storage_health.prom
else
  echo "storage_health 0" > /var/lib/node_exporter/storage_health.prom
fi

Prometheus抓取配置中加入对应job,然后编写Alertmanager规则。当 storage_health == 0 持续一分钟,就向运维群发送消息。由于监控服务本身高可用,这条告警链路不会因单点失效而断掉。

六、验证与日常维护

部署完成后,可手动将node1置于待机模式,观察资源是否在node2启动,以及告警是否继续。命令如下:

pcs node standby node1
pcs status
pcs node unstandby node1

日常维护中,存储后端升级时建议先 standby 监控节点,避免误报。日志集中在 /var/log/pacemaker 与 journalctl -u storage-mon.service,出现迁移异常时优先看 Corosync 成员关系变化。只要按上述结构落地,Linux上的网络存储监控就能在节点故障下依然守住告警底线。

Linux高可用网络存储监控修改时间:2026-08-09 10:24:15

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。