Prometheus + Grafana 监控体系搭建:从安装到仪表盘实战


阿里云特惠 - 新用户专享

Prometheus + Grafana 监控体系搭建:从安装到仪表盘实战

Prometheus + Grafana 是目前最流行的开源监控方案,被 Kubernetes、微服务等云原生生态广泛使用。对于个人开发者和中小公司,这套方案完全免费,而且能做到媲美商业监控产品的效果。本文从零开始搭建一套完整的监控体系。

一、监控体系架构

被监控的服务器/应用
    ↓ 暴露 /metrics 端点
各种 Exporter(node_exporter, mysqld_exporter 等)
    ↑ Prometheus 定期抓取(Pull 模式)
Prometheus Server(存储时序数据,支持 PromQL 查询)
    ↓
Alertmanager(告警路由:钉钉/邮件/Slack)
    ↓
Grafana(可视化仪表盘,订阅 Prometheus 作为数据源)

Prometheus 使用 Pull(拉取) 模式,主动从 Exporter 抓取数据,而不是等 Exporter 推送。这使得监控系统可以感知 Exporter 是否存活。

二、快速搭建(Docker Compose 版)

# compose.yaml(监控全家桶)
version: '3.9'
services:
  prometheus:
    image: prom/prometheus:v2.50.0
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus:/etc/prometheus          # 挂载配置目录
      - prometheus_data:/prometheus           # 持久化数据
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'   # 数据保留30天
      - '--web.enable-lifecycle'               # 支持 HTTP API 热重载
    restart: unless-stopped

  grafana:
    image: grafana/grafana:10.3.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=Admin@2026
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:v0.27.0
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager:/etc/alertmanager
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

三、Prometheus 配置文件

# prometheus/prometheus.yml
global:
  scrape_interval: 15s      # 每15秒抓取一次
  evaluation_interval: 15s  # 每15秒评估告警规则

rule_files:
  - "rules/*.yml"           # 告警规则文件

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

scrape_configs:
  # 监控 Prometheus 自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 监控 Linux 主机(需要安装 node_exporter)
  - job_name: 'node'
    static_configs:
      - targets:
          - '192.168.1.10:9100'  # 服务器1
          - '192.168.1.11:9100'  # 服务器2
    labels:
      env: production

  # 监控 MySQL(需要安装 mysqld_exporter)
  - job_name: 'mysql'
    static_configs:
      - targets: ['192.168.1.10:9104']

  # 监控 Nginx(需要安装 nginx-vts-exporter 或 nginx_prometheus_exporter)
  - job_name: 'nginx'
    static_configs:
      - targets: ['192.168.1.10:9113']

四、安装 Node Exporter(在每台被监控服务器上)

# 下载并安装 node_exporter
VERSION="1.7.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
sudo cp node_exporter-*/node_exporter /usr/local/bin/

# 创建 systemd service
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter

[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

# 验证(浏览器打开 http://服务器IP:9100/metrics)
curl http://localhost:9100/metrics | head -20

五、告警规则配置

# prometheus/rules/linux.yml
groups:
  - name: linux_alerts
    rules:
      # CPU 使用率超过 80% 持续 5 分钟
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务器 CPU 使用率过高"
          description: "{{ $labels.instance }} CPU 使用率为 {{ printf "%.1f" $value }}%"

      # 内存使用率超过 85%
      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务器内存使用率过高"
          description: "{{ $labels.instance }} 内存使用率为 {{ printf "%.1f" $value }}%"

      # 磁盘使用率超过 80%
      - alert: DiskUsageHigh
        expr: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 80
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "磁盘空间不足"
          description: "{{ $labels.instance }} 挂载点 {{ $labels.mountpoint }} 使用率 {{ printf "%.1f" $value }}%"

六、Grafana 配置数据源和导入仪表盘

  1. 登录 Grafana(http://localhost:3000,admin/Admin@2026)
  2. 添加数据源:Connections → Data sources → Prometheus,URL 填 http://prometheus:9090
  3. 导入社区仪表盘:Dashboards → Import → 输入模板 ID
仪表盘 Grafana ID 说明
Node Exporter Full 1860 Linux 服务器全面监控
MySQL Overview 7362 MySQL 性能监控
Nginx 9614 Nginx 请求监控
Redis Dashboard 763 Redis 监控

七、常用 PromQL 查询语句

# CPU 使用率
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率(%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 磁盘写入速率(MB/s)
rate(node_disk_written_bytes_total[5m]) / 1024 / 1024

# 网络入流量(Mbps)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 / 1024 / 1024

# 查看某个 target 最后一次成功抓取时间
up{job="node"}

总结

Prometheus + Grafana 这套方案上手成本低、扩展性强、社区活跃。从一台服务器开始,10分钟内就能看到 CPU、内存、磁盘的实时图表和历史趋势。配置好告警规则,才能从”发现问题”升级为”预防问题”。这是个人开发者和中小团队构建监控体系的最佳起点。

发表评论