主题
第 17 章 监控告警体系建设
17.1 监控指标体系设计
完善的监控应覆盖以下层次:
| 层级 | 关键指标 | 工具 |
|---|---|---|
| 基础设施 | CPU、内存、磁盘、网络 | Node Exporter |
| GlusterFS | 卷状态、brick 状态、容量、自愈 | Gluster Exporter |
| NFS-Ganesha | 服务状态、导出数量 | 自定义 Exporter |
| Keepalived | VIP 状态、VRRP 状态 | 脚本/日志 |
| 业务层 | 挂载可用性、读写延迟 | Blackbox Exporter |
17.2 Prometheus + Grafana 架构
监控组件部署在独立监控节点(monitor):
┌─────────────┐
│ Grafana │
└──────┬──────┘
│
┌──────▼──────┐
│ Prometheus │
└──────┬──────┘
│
┌──────▼──────┐
│Alertmanager │
└─────────────┘17.3 Node Exporter 部署
在所有存储节点安装 Node Exporter:
bash
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvf node_exporter-1.8.1.linux-amd64.tar.gz
cp node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/创建 systemd 服务并启动:
bash
cat > /etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter17.4 GlusterFS Exporter 部署
bash
cd /tmp
wget https://github.com/ofesseler/gluster_exporter/releases/download/v0.2.7/gluster_exporter-0.2.7-linux-amd64.tar.gz
tar xvf gluster_exporter-0.2.7-linux-amd64.tar.gz
cp gluster_exporter /usr/local/bin/创建 systemd 服务:
bash
cat > /etc/systemd/system/gluster_exporter.service <<'EOF'
[Unit]
Description=GlusterFS Exporter
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/gluster_exporter --web.listen-address=:9189
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now gluster_exporter17.5 NFS-Ganesha 自定义 Exporter
创建 /usr/local/bin/ganesha_exporter.py:
python
#!/usr/bin/env python3
import dbus
import sys
import time
from prometheus_client import start_http_server, Gauge
EXPORTS_TOTAL = Gauge('ganesha_exports_total', 'Total NFS exports')
GANESHA_UP = Gauge('ganesha_up', 'NFS-Ganesha service status')
def collect():
try:
bus = dbus.SystemBus()
obj = bus.get_object('org.ganesha.nfsd', '/org/ganesha/nfsd/admin')
iface = dbus.Interface(obj, 'org.ganesha.nfsd.admin')
stats = iface.GetAllStats()
EXPORTS_TOTAL.set(len(stats.get('exports', [])))
GANESHA_UP.set(1)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
EXPORTS_TOTAL.set(0)
GANESHA_UP.set(0)
if __name__ == '__main__':
start_http_server(9580)
while True:
collect()
time.sleep(15)创建 systemd 服务并启动。
17.6 告警规则与 Alertmanager
Prometheus 告警规则
yaml
groups:
- name: nfs-ha
rules:
- alert: NodeDown
expr: up{job="node-exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.instance }} 不可达"
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "磁盘空间不足"
- alert: GaneshaDown
expr: ganesha_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "NFS-Ganesha 服务异常"Alertmanager 邮件配置
yaml
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alert@example.com'
route:
receiver: 'email-admin'
receivers:
- name: 'email-admin'
email_configs:
- to: 'admin@example.com'
send_resolved: true17.7 Grafana 仪表盘搭建
- 登录 Grafana
- 添加 Prometheus 数据源
- 导入 Node Exporter 仪表盘(ID: 1860)
- 自建 GlusterFS/Ganesha 仪表盘
推荐面板
- 卷状态
- Brick 状态
- 容量使用趋势
- 节点资源使用
- NFS 导出状态
- VIP 漂移事件
17.8 本章小结
- 监控应覆盖基础设施、存储服务、网络入口三层
- Prometheus + Grafana 是开源监控的主流方案
- GlusterFS 和 Ganesha 需要专门的 exporter
- 告警规则应根据实际业务需求定制
- 可视化仪表盘帮助快速定位问题
练习题
- 监控体系应覆盖哪几个层次?
- Node Exporter 暴露的指标端口是多少?
- 如何自定义 Ganesha 的监控指标?
- 设计一个你认为最重要的 NFS 高可用告警规则。