Prometheus 监控 Ubuntu Server 全栈实战:Node Exporter 驱动的高性能服务器可观测体系

Prometheus 监控 Ubuntu Server 全栈实战:Node Exporter 驱动的高性能服务器可观测体系


在 Linux 服务器监控领域,Node Exporter 是 Prometheus 生态中最核心、最广泛的组件。它可以将 Ubuntu Server 的 CPU、内存、磁盘、网络、系统负载以及 systemd 服务状态等关键指标暴露为 Prometheus 格式,再结合 Grafana 仪表盘与告警规则,形成一条从硬件健康到服务状态的完整观测链。本文将带你从部署到高阶调优,一步到位地掌控你的 Ubuntu 服务器。


1. 为什么需要专门监控 Ubuntu Server?

  • 资源瓶颈早发现:CPU 持续高负载、内存泄漏、磁盘 I/O 饱和或空间耗尽,在影响业务前预警。
  • 服务状态透明化:通过 systemd 收集器,可实时监控任意 systemd 服务的存活、重启次数。
  • 硬件故障预测:磁盘 SMART 数据、传感器温度、RAID 状态等硬件级指标(配合 textfile 采集)。
  • 网络流量与错误:结合 node_network_* 指标可直观定位 DDoS、带宽瓶颈或网卡异常。
  • 合规与容量规划:长期趋势数据支撑资源扩容或迁移决策。

2. 部署 Node Exporter

Node Exporter 官方推荐以非 root 用户运行,监听在 9100 端口,通过 /metrics 提供指标。

2.1 使用官方二进制(推荐)
# 获取最新版(以 1.7.0 为例)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
cd node_exporter-1.7.0.linux-amd64
sudo cp node_exporter /usr/local/bin/

创建专用系统用户:

sudo useradd --no-create-home --shell /bin/false node_exporter

创建 systemd 服务文件 /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
    --collector.systemd \
    --collector.textfile.directory=/var/lib/node_exporter/textfile_collector \
    --web.listen-address=:9100

[Install]
WantedBy=multi-user.target

创建 textfile 目录并设置权限:

sudo mkdir -p /var/lib/node_exporter/textfile_collector
sudo chown -R node_exporter:node_exporter /var/lib/node_exporter

启动并设置开机自启:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
systemctl status node_exporter --no-pager

访问 http://<server_ip>:9100/metrics 确认指标输出。

2.2 使用 apt 安装(版本可能较老)
sudo apt update
sudo apt install prometheus-node-exporter
sudo systemctl enable --now prometheus-node-exporter

但通常建议使用官方最新二进制,以获取更多 collector 支持。

2.3 安全加固
  • 防火墙仅允许 Prometheus 服务器 IP 访问 9100 端口:
    sudo ufw allow from 10.0.0.100 to any port 9100
    
  • 或通过反向代理(Nginx/Caddy)添加 TLS 和 Basic Auth,Node Exporter 本身不支持认证。

3. 配置 Prometheus 抓取

prometheus.yml 中添加 Job:

scrape_configs:
  - job_name: 'ubuntu_servers'
    scrape_interval: 15s
    static_configs:
      - targets:
        - '192.168.1.10:9100'
        - '192.168.1.11:9100'
        labels:
          env: 'production'
          team: 'backend'

重载 Prometheus 后,即可在 UI 中查询 node_cpu_seconds_total 等指标。


4. 核心监控指标与 PromQL

监控目标关键指标PromQL 示例
CPU 使用率node_cpu_seconds_total{mode!="idle"}100 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
内存使用率node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
磁盘使用率node_filesystem_avail_bytes{mountpoint="/"}(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
磁盘 I/Onode_disk_io_time_seconds_totalrate(node_disk_io_time_seconds_total[5m]) * 100 (百分比)
网络流量node_network_receive_bytes_total / node_network_transmit_bytes_totalrate(node_network_receive_bytes_total{device="eth0"}[1m]) * 8 (bps)
网络错误node_network_receive_errs_totalrate(node_network_receive_errs_total{device="eth0"}[5m])
系统负载node_load1 / node_load5 / node_load15直接查看,结合 CPU 核数判断
系统运行时间node_boot_time_secondstime() - node_boot_time_seconds
systemd 服务状态node_systemd_unit_statenode_systemd_unit_state{name="nginx.service",state="active"}
打开文件数node_filefd_allocated / node_filefd_maximum(node_filefd_allocated / node_filefd_maximum) * 100

关键提醒

  • node_cpu_seconds_total{mode="idle"}rate 计算可以分核心或整体平均。
  • 磁盘使用率务必关注 mountpoint 标签,排除 tmpfs/boot 等不关心的分区。
  • systemd 收集器需要 --collector.systemd 启动参数,且 Node Exporter 需有权限访问 D-Bus(用 User=node_exporter 一般可满足,也可加 --collector.systemd.unit-whitelist=.+ 控制范围)。

5. Grafana 仪表盘推荐

直接导入社区仪表盘,零改动适配:

  • 1860(Node Exporter Full):最全面,涵盖 CPU、内存、磁盘、网络、文件系统、中断、上下文切换等。
  • 16098(Node Exporter / Systemd):包含 systemd 服务状态监控面板,可直观查看服务启停。
  • 405(Node Exporter Server Stats):轻量概览。

导入后只需修改数据源和调整 instance 变量,即可完美展示 Ubuntu 服务器的各项健康指标。


6. 告警规则实战

groups:
  - name: ubuntu_server_alerts
    rules:
      - alert: InstanceDown
        expr: up{job="ubuntu_servers"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "服务器 {{ $labels.instance }} 失联"

      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率持续超过 90%"

      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "可用内存不足 10%"

      - alert: DiskSpaceRunningOut
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "根分区使用率超过 85%"

      - alert: DiskReadLatencyHigh
        expr: rate(node_disk_read_time_seconds_total[5m]) > 0.1
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "磁盘读延迟升高"

      - alert: ServiceDown
        expr: node_systemd_unit_state{state="active"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "systemd 服务 {{ $labels.name }} 已停止"

      - alert: TooManyOpenFiles
        expr: (node_filefd_allocated / node_filefd_maximum) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "文件描述符使用率超过 80%"

可根据实际业务调整阈值和探测频率。


7. 进阶:自定义指标与硬件监控

7.1 Textfile Collector

通过 cron 任务或守护脚本将自定义指标写入 /var/lib/node_exporter/textfile_collector/*.prom 文件,格式为 Prometheus 指标文本。Node Exporter 会自动加载这些指标。

示例:监控本地证书有效期

#!/bin/bash
FILE=/var/lib/node_exporter/textfile_collector/cert_expiry.prom
EXPIRY=$(openssl x509 -enddate -noout -in /etc/ssl/certs/my.crt | cut -d= -f2)
SECS_LEFT=$(( $(date -d "$EXPIRY" +%s) - $(date +%s) ))
echo "cert_expiry_seconds $SECS_LEFT" > $FILE.tmp && mv $FILE.tmp $FILE

每分钟执行一次,即可在 Prometheus 中查询 cert_expiry_seconds

7.2 磁盘 SMART 监控

利用 smartctl 命令采集磁盘健康状态和温度,通过 textfile collector 暴露。社区已有现成脚本 smartctl_exporternode_exporter-smartmon

7.3 进程监控

配合 process-exporter 可监控特定进程存活和数量,但系统级 systemd 已能覆盖大部分场景。


8. 性能调优与多机管理

  • 降低采集频率:生产环境 15~30s 足够,网络延迟大时可放宽到 60s。
  • 按需禁用收集器:启动时追加 --no-collector.xxx 减少无用指标,降低 CPU 开销(例如不关心 CPU 调频可 --no-collector.cpufreq)。
  • 多台 Ubuntu 服务器:使用 Prometheus 的 file_sd 或基于 DNS 的服务发现统一管理 targets。
  • 标签规划:务必在 static_configs 中打上 envroledatacenter 等标签,便于多维度聚合告警。

9. 安全清单

  • Node Exporter 监听地址默认 0.0.0.0,必要时改为 127.0.0.1 再通过反向代理暴露。
  • 使用防火墙或 iptables 限制访问来源。
  • 如果必须公网暴露,组合使用 Nginx 反代 + TLS + HTTP Basic Auth。
  • 定期更新 Node Exporter 版本,关注安全公告。

一旦完成这套监控体系部署,你的每一台 Ubuntu Server 都将从“黑盒”变为完全透明的可观测节点。CPU 尖刺、内存泄漏、磁盘爆满、关键服务停止等故障都能在几秒到几分钟内被捕捉,并结合 Grafana 美观的面板和 Alertmanager 的告警通知,真正实现从被动救火到主动预警的运维升级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值