ithuang
ithuang
发布于 2025-11-01 / 2 阅读
0

完整监控体系搭建

完整监控体系搭建 —— Prometheus + Grafana 可视化与告警

要构建一个完整的服务器监控体系,通常需要Node Exporter (数据采集)、Prometheus (数据存储与告警)、Grafana (数据可视化) 和 Alertmanager (告警通知) 四个核心组件协同工作。

整个数据流的逻辑如下:
Node Exporter 采集指标 → Prometheus 定期抓取并存储 → Grafana 可视化呈现
Prometheus 发现异常 → Alertmanager 推送告警

⚙️ 环境准备与资源规划

在开始前,请规划好硬件并完成系统准备:

  • 系统要求:一台搭载主流Linux发行版(如 Ubuntu 20.04+, CentOS 7+)的服务器。为了流畅体验,建议至少 2核 CPU,4GB 内存,并确保有 20GB 以上的可用磁盘空间。
  • 网络要求:确保服务器能正常访问外网,用于下载组件。下文所有在服务器本机执行的步骤,若无特殊说明,均使用 localhost,你也可以根据实际情况替换为服务器的公网或内网IP。
  • 组件端口规划:在防火墙中放行以下各组件的默认端口,便于后续访问。
    • Node Exporter: 9100
    • Prometheus: 9090
    • Grafana: 3000
    • Alertmanager: 9093

🚀 第一步:Node Exporter 部署与验证

Node Exporter 负责采集服务器的硬件和操作系统级别指标。

  1. 下载并解压:在需要被监控的服务器上执行以下命令。

    # 下载最新版本(以1.6.1为例,可去官网确认最新版本)
    wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
    tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
    cd node_exporter-1.6.1.linux-amd64
    
  2. 启动服务:

    # 直接后台运行
    ./node_exporter &
    
  3. 验证服务:通过浏览器访问 http://<服务器IP>:9100/metrics,如果能查看到大量以 node_ 开头的指标数据,即表示部署成功。

🗄️ 第二步:Prometheus 安装与配置

Prometheus 是整个监控体系的核心,负责从 Node Exporter 拉取并存储数据。

  1. 安装并启动:

    wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
    tar -xvf prometheus-2.48.0.linux-amd64.tar.gz
    cd prometheus-2.48.0.linux-amd64
    ./prometheus --config.file=prometheus.yml &
    
  2. 配置采集任务:编辑 prometheus.yml 文件,在 scrape_configs 下新增一个用于抓取 Node Exporter 的 job。

    # prometheus.yml
    global:
      scrape_interval: 15s # 全局抓取间隔
    
    scrape_configs:
      - job_name: 'prometheus' # 监控Prometheus自身
        static_configs:
          - targets: ['localhost:9090']
      - job_name: 'node'       # 新增job监控Node Exporter
        static_configs:
          - targets: ['localhost:9100']
    

    配置解释:

    • scrape_interval: 定义了Prometheus抓取指标数据的时间间隔,这里设为每15秒抓取一次。
    • scrape_configs: 抓取目标的配置段。
    • job_name: 'node': 我们为此抓取任务命名为node,便于在Prometheus中区分。
    • targets: 在此数组中指定需要抓取的Node Exporter实例的地址和端口。可以添加多个目标来实现对多台服务器的监控。
  3. 验证数据:访问 http://<服务器IP>:9090/targets,确认 node 这个 job 的状态为 UP。

📊 第三步:Grafana 安装与可视化

Grafana 负责将 Prometheus 中的枯燥数据转化为直观的图表。

  1. 安装并启动:

    wget https://dl.grafana.com/oss/release/grafana-10.3.0.linux-amd64.tar.gz
    tar -xvf grafana-10.3.0.linux-amd64.tar.gz
    cd grafana-10.3.0/bin
    ./grafana-server &
    

    启动后,通过 http://<服务器IP>:3000 访问,默认用户名/密码为 admin/admin。

  2. 配置数据源:登录后,点击左侧齿轮图标的 “Configuration” → “Data Sources” → “Add data source”,搜索并选择 “Prometheus”。在 “URL” 栏填入 http://localhost:9090,然后点击 “Save & test”。若提示绿色成功,则连接正常。

  3. 导入官方仪表盘:

    • 点击左侧 “+” → “Import”。
    • 在 “Import via grafana.com” 输入框填入官方 Node Exporter 全量展示面板的ID 1860,点击右侧的 “Load”。
    • 在底部 “Prometheus” 下拉框中选择刚创建的数据源,点击 “Import” 完成导入。
      导入成功后,你将立刻看到一个包含CPU、内存、磁盘I/O、网络等丰富指标的炫酷仪表盘。

🔔 第四步:告警规则配置与 Alertmanager 集成

告警是完整监控体系中不可或缺的一环,让你从被动发现变成主动响应。

  1. 创建告警规则文件:在 Prometheus 目录下创建一个告警规则文件,例如 node_rules.yml。

    # node_rules.yml
    groups:
    - name: node_alerts
      rules:
      # 告警1: CPU使用率过高
      - alert: HighCPUUsage
        expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务器 {{ $labels.instance }} CPU使用率过高"
          description: "当前CPU使用率: {{ $value | humanize }}% \n 已持续超过5分钟。"
      # 告警2: 内存可用量过低
      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务器 {{ $labels.instance }} 内存可用量过低"
          description: "当前内存使用率: {{ printf \"%.2f\" $value }}% \n 已持续超过5分钟。"
      # 告警3: 磁盘空间不足
      - alert: HighDiskUsage
        expr: (node_filesystem_size_bytes{fstype=~"ext4|xfs"} - node_filesystem_free_bytes{fstype=~"ext4|xfs"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "服务器 {{ $labels.instance }} 磁盘使用率过高"
          description: "挂载点 {{ $labels.mountpoint }} 当前使用率: {{ printf \"%.2f\" $value }}%"
    
  2. 修改 Prometheus 配置:编辑 prometheus.yml 文件,引入告警规则并指定 Alertmanager 的地址。

    # prometheus.yml
    global:
      scrape_interval: 15s
    
    # 1. 引入告警规则文件
    rule_files:
      - 'node_rules.yml'
    
    # 2. 配置Alertmanager地址
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
              - 'localhost:9093'
    
    # ... scrape_configs 部分保持不变
    
  3. 处理告警:配置 Alertmanager

    • 安装并启动:类似地,下载、解压并启动 Alertmanager。
    • 配置 alertmanager.yml:这是定义告警如何通知的核心。下面是一个通过QQ邮箱发送告警的示例。
    # alertmanager.yml
    global:
      resolve_timeout: 5m
      smtp_from: '你的QQ邮箱@qq.com'
      smtp_smarthost: 'smtp.qq.com:465'
      smtp_auth_username: '你的QQ邮箱@qq.com'
      smtp_auth_password: '你的QQ邮箱授权码'
      smtp_require_tls: false
    
    route:
      group_by: ['alertname']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 1h
      receiver: 'email-notifications'
    
    receivers:
    - name: 'email-notifications'
      email_configs:
      - to: '接收告警的邮箱@qq.com'
    

    注意:若要使用QQ邮箱,需登录网页版QQ邮箱,在 设置 -> 账户 中开启 POP3/SMTP服务 并获取一封授权码,用于 smtp_auth_password 字段。

✅ 验证与测试

启动所有服务后,你可以通过以下方式测试整个链路是否畅通:

  1. 检查 targets 状态:访问 http://<服务器IP>:9090/targets,确保所有目标状态皆为 UP。
  2. 检查 rules 状态:访问 http://<服务器IP>:9090/rules,验证告警规则已加载。
  3. 检查 alerts 状态:访问 http://<服务器IP>:9090/alerts,可查看告警规则的当前状态(未触发时为绿色 Inactive)。
  4. 触发测试告警:手动停止 Node Exporter 服务(kill 其进程),等待约15秒后,在 Prometheus 的 /alerts 页面应能看到相应告警变为红色 FIRING 状态。随后,你配置的邮箱将收到一封告警邮件。

💎 总结

至此,你已经成功搭建了一套从数据采集 (Node Exporter) → 存储告警 (Prometheus) → 可视化分析 (Grafana) → 通知推送 (Alertmanager) 的完整服务器监控体系。

进阶

我们基于指定的环境来修改配置。先明确架构:

  • Prometheus + Grafana + Alertmanager 所在主机:192.168.80.11
  • 被监控服务器:192.168.80.12、192.168.80.13
  • 各服务器都需要安装 Node Exporter 并开放 9100 端口

下面我会给出从安装到告警验证的完整命令,所有配置文件均按你的 IP 编写。


一、被监控端:安装 Node Exporter(在 12、13 上执行)

在 192.168.80.12 和 192.168.80.13 上都执行以下操作。

# 下载并解压
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvf node_exporter-1.6.1.linux-amd64.tar.gz
cd node_exporter-1.6.1.linux-amd64

# 直接后台运行
./node_exporter &

# 确认启动(应在本地能看到指标)
curl http://localhost:9100/metrics

防火墙放行(如果开启):

# iptables 或 firewalld,择一执行
sudo firewall-cmd --add-port=9100/tcp --permanent
sudo firewall-cmd --reload
# 或
sudo iptables -I INPUT -p tcp --dport 9100 -j ACCEPT

二、监控中心:Prometheus 配置(在 192.168.80.11 上执行)

1. 安装 Prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar -xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64

2. 配置 prometheus.yml

编辑 prometheus.yml,修改 scrape_configs,将两台服务器加入目标列表。

global:
  scrape_interval: 15s

# 告警规则文件
rule_files:
  - 'node_rules.yml'

# Alertmanager 地址(本机)
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_servers'
    static_configs:
      - targets:
        - '192.168.80.12:9100'
        - '192.168.80.13:9100'
        labels:
          env: 'production'

说明:同一 job_name 下的 targets 数组可包含多台机器,Prometheus 会自动为每条指标附加 instance="192.168.80.12:9100" 标签。

3. 创建告警规则文件 node_rules.yml

在 prometheus-2.48.0.linux-amd64 目录下创建该文件。

groups:
- name: node_alerts
  rules:
  # CPU 使用率 > 80%
  - alert: HighCPUUsage
    expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "服务器 {{ $labels.instance }} CPU 使用率过高"
      description: "实例 {{ $labels.instance }} 当前 CPU 使用率: {{ $value | humanize }}%,已持续超过 5 分钟。"

  # 内存可用率 < 20% (即使用率 > 80%)
  - alert: HighMemoryUsage
    expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "服务器 {{ $labels.instance }} 内存不足"
      description: "实例 {{ $labels.instance }} 当前内存使用率: {{ printf \"%.2f\" $value }}%,已持续超过 5 分钟。"

  # 磁盘使用率 > 85%
  - alert: HighDiskUsage
    expr: (node_filesystem_size_bytes{fstype=~"ext4|xfs"} - node_filesystem_avail_bytes{fstype=~"ext4|xfs"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100 > 85
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "服务器 {{ $labels.instance }} 磁盘使用率过高"
      description: "挂载点 {{ $labels.mountpoint }} 当前使用率: {{ printf \"%.2f\" $value }}%,已持续超过 5 分钟。"

4. 启动 Prometheus

./prometheus --config.file=prometheus.yml &

访问 http://192.168.80.11:9090/targets,应看到 node_servers 下两台机器状态均为 UP。


三、告警通知:Alertmanager 配置(在 192.168.80.11 上)

1. 安装 Alertmanager

wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz
cd alertmanager-0.26.0.linux-amd64

2. 创建 alertmanager.yml

此处以 QQ 邮箱为例。请提前在 QQ 邮箱设置中开启 SMTP 服务并获取授权码。

global:
  resolve_timeout: 5m
  smtp_from: '你的发送邮箱@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '你的发送邮箱@qq.com'
  smtp_auth_password: '你的QQ邮箱授权码'
  smtp_require_tls: false

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'email'

receivers:
- name: 'email'
  email_configs:
  - to: '接收告警邮箱@qq.com'

3. 启动 Alertmanager

./alertmanager --config.file=alertmanager.yml &

四、Grafana 可视化(在 192.168.80.11 上)

wget https://dl.grafana.com/oss/release/grafana-10.3.0.linux-amd64.tar.gz
tar -xvf grafana-10.3.0.linux-amd64.tar.gz
cd grafana-10.3.0/bin
./grafana-server &
  1. 访问 http://192.168.80.11:3000,默认账号 admin/admin。
  2. 添加数据源:URL 填 http://localhost:9090。
  3. 导入仪表盘:输入 Dashboard ID 1860,选择数据源后即可看到两台服务器的完整指标。

五、验证告警链路

  1. 检查规则状态:http://192.168.80.11:9090/rules 应看到 node_alerts 下的三条规则。

  2. 手动触发告警:在 192.168.80.12 上停掉 Node Exporter:

    pkill node_exporter
    

    等待约 15 秒后,Prometheus 的 /alerts 页面(http://192.168.80.11:9090/alerts)中应该会出现 TargetDown 之类的告警变为红色 FIRING,随后你的邮箱会收到邮件。(本配置里没有写 TargetDown 规则,若需此告警需单独添加,但手动停止后由于抓取失败,Prometheus 本身也会记录 alert,只是我们没有为该情况配置规则,你可以添加一条 up == 0 的规则来测试)。

    添加测试用规则(可临时放入 node_rules.yml):

    - alert: InstanceDown
      expr: up{job="node_servers"} == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "实例 {{ $labels.instance }} 已下线"
        description: "{{ $labels.instance }} 的 Node Exporter 已无法访问超过 1 分钟。"
    

    停止 Node Exporter 后,该告警将在 1 分钟后触发,邮箱会收到通知。


现在,你的 192.168.80.11 已作为监控中心,192.168.80.12 和 192.168.80.13 两端的服务器状态将被实时采集、可视化,并在 CPU、内存、磁盘超过阈值时自动发送邮件给你。如果需要调整告警阈值或添加更多机器,只需修改 prometheus.yml 的 targets 列表即可。