Skip to content

第 17 章 监控告警体系建设

17.1 监控指标体系设计

完善的监控应覆盖以下层次:

层级关键指标工具
基础设施CPU、内存、磁盘、网络Node Exporter
GlusterFS卷状态、brick 状态、容量、自愈Gluster Exporter
NFS-Ganesha服务状态、导出数量自定义 Exporter
KeepalivedVIP 状态、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_exporter

17.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_exporter

17.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: true

17.7 Grafana 仪表盘搭建

  1. 登录 Grafana
  2. 添加 Prometheus 数据源
  3. 导入 Node Exporter 仪表盘(ID: 1860)
  4. 自建 GlusterFS/Ganesha 仪表盘

推荐面板

  • 卷状态
  • Brick 状态
  • 容量使用趋势
  • 节点资源使用
  • NFS 导出状态
  • VIP 漂移事件

17.8 本章小结

  • 监控应覆盖基础设施、存储服务、网络入口三层
  • Prometheus + Grafana 是开源监控的主流方案
  • GlusterFS 和 Ganesha 需要专门的 exporter
  • 告警规则应根据实际业务需求定制
  • 可视化仪表盘帮助快速定位问题

练习题

  1. 监控体系应覆盖哪几个层次?
  2. Node Exporter 暴露的指标端口是多少?
  3. 如何自定义 Ganesha 的监控指标?
  4. 设计一个你认为最重要的 NFS 高可用告警规则。