☰
Node Exporter与Prometheus实现Linux系统监控实战指南
2026/11/2 2:35:30 网站建设 项目流程

1. 为什么选择node_exporter+Prometheus监控Linux系统

在运维领域,系统监控就像给服务器装上"健康监测仪"。传统的监控方案如Zabbix虽然功能全面,但配置复杂、资源消耗大。而Prometheus+node_exporter的组合,则像一把精准的手术刀——轻量、专注、响应迅速。

node_exporter是Prometheus生态中专用于*nix系统监控的采集器,它能暴露800+系统指标,包括:

  • CPU使用率(user/system/iowait等状态占比)
  • 内存消耗(已用/缓存/交换分区情况)
  • 磁盘I/O吞吐量和延迟
  • 网络带宽和错误包统计
  • 系统负载和进程状态

这些指标通过/metrics接口以文本形式暴露,Prometheus定时抓取后存入时间序列数据库。相比传统方案,这套组合有三大优势:

  1. 多维数据模型:每个指标可带多标签(如node_cpu_seconds_total{cpu="0",mode="user"}),便于细粒度分析
  2. 强大的PromQL:支持瞬时向量、区间向量查询,能直接计算CPU使用率等衍生指标
  3. 低侵入性:node_exporter仅需5MB内存,对生产环境影响极小

提示:虽然Windows系统可使用windows_exporter,但node_exporter在Linux下的指标覆盖更全面,特别是对/proc和/sys文件系统的深度采集。

2. 从零部署node_exporter实战指南

2.1 二进制包安装(推荐生产环境)

最新版node_exporter可从 GitHub Releases 获取。以1.6.1版本为例:

# 下载适用于Linux AMD64架构的版本 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-*.tar.gz cd node_exporter-*/ # 直接运行(默认监听9100端口) ./node_exporter

此时访问http://服务器IP:9100/metrics,将看到如下指标片段:

# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode. # TYPE node_cpu_seconds_total counter node_cpu_seconds_total{cpu="0",mode="idle"} 38245.67 node_cpu_seconds_total{cpu="0",mode="system"} 1045.32

2.2 配置系统服务实现开机自启

生产环境建议通过systemd管理服务:

sudo cat <<EOF > /etc/systemd/system/node_exporter.service [Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter ExecStart=/usr/local/bin/node_exporter \ --collector.systemd \ --collector.tcpstat [Install] WantedBy=multi-user.target EOF # 创建专用用户 sudo useradd -rs /bin/false node_exporter # 复制二进制文件 sudo cp node_exporter /usr/local/bin/ # 启动服务 sudo systemctl daemon-reload sudo systemctl enable --now node_exporter

常用启动参数说明:

  • --web.listen-address=:19100修改监听端口
  • --collector.disable-defaults禁用默认采集器
  • --collector.filesystem.ignored-mount-points忽略特定挂载点

2.3 安全加固措施

暴露9100端口存在风险,建议:

  1. 使用Nginx反向代理添加Basic Auth:
location /metrics { auth_basic "Node Exporter"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://localhost:9100; }
  1. 或通过iptules限制访问IP:
iptables -A INPUT -p tcp --dport 9100 -s 监控服务器IP -j ACCEPT iptables -A INPUT -p tcp --dport 9100 -j DROP

3. Prometheus服务端配置详解

3.1 基础抓取配置

在prometheus.yml中添加job配置:

scrape_configs: - job_name: 'node' scrape_interval: 15s static_configs: - targets: ['192.168.1.10:9100', '192.168.1.11:9100'] relabel_configs: - source_labels: [__address__] target_label: instance regex: '(.*):.*' replacement: '$1'

关键配置解析:

  • scrape_interval:抓取频率,生产环境建议15-30s
  • metrics_path:默认为/metrics,如需修改需与node_exporter启动参数一致
  • relabel_configs:重写标签规则,示例中将IP:PORT格式转为纯IP

3.2 使用服务发现动态管理目标

对于大规模集群,建议使用文件服务发现:

  1. 创建目标列表文件nodes.json:
[ { "targets": ["10.0.1.2:9100"], "labels": { "env": "prod", "role": "db" } } ]
  1. 修改prometheus.yml:
scrape_configs: - job_name: 'node' file_sd_configs: - files: ['/etc/prometheus/nodes.json'] refresh_interval: 5m

3.3 关键指标告警规则示例

在rules/node.yml中定义告警规则:

groups: - name: node_alerts rules: - alert: HighCPUUsage expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 10m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}" description: "CPU usage is {{ $value }}%" - alert: MemoryPressure expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20 for: 5m labels: severity: critical

4. 高级监控场景实战

4.1 监控Docker容器

node_exporter默认只能监控主机,需配合cAdvisor:

docker run -d \ --name=cadvisor \ -v /:/rootfs:ro \ -v /var/run:/var/run:ro \ -v /sys:/sys:ro \ -v /var/lib/docker/:/var/lib/docker:ro \ -p 8080:8080 \ gcr.io/cadvisor/cadvisor:v0.47.0

Prometheus配置示例:

- job_name: 'cadvisor' static_configs: - targets: ['docker-host:8080']

4.2 自定义文本文件收集器

通过textfile收集器采集脚本输出:

  1. 创建采集目录:
mkdir -p /var/lib/node_exporter/textfile_collector
  1. 添加启动参数:
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
  1. 示例脚本/home/scripts/check_ssl.sh:
#!/bin/bash echo '# HELP ssl_expire_days SSL certificate expire days' > /var/lib/node_exporter/textfile_collector/ssl.prom echo '# TYPE ssl_expire_days gauge' >> /var/lib/node_exporter/textfile_collector/ssl.prom openssl x509 -enddate -noout -in /etc/nginx/ssl/cert.pem | awk -F= '/notAfter/{print "ssl_expire_days{domain=\"example.com\"} "(systime()-mktime(gensub(/ /," ","g",$2)))/86400}' >> /var/lib/node_exporter/textfile_collector/ssl.prom

4.3 使用Grafana可视化监控数据

推荐仪表盘模板:

  • Node Exporter Full:ID 1860
  • Linux Hosts Metrics:ID 11074

配置步骤:

  1. 添加Prometheus数据源
  2. 导入仪表盘JSON
  3. 调整变量如$interval和$datasource

关键面板建议:

  • CPU使用率:100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[$__rate_interval])) * 100)
  • 内存使用:(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
  • 磁盘空间:node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100

5. 性能调优与故障排查

5.1 资源占用优化

当监控数百节点时需注意:

  1. 禁用不必要采集器(如wifi、nfs):
--no-collector.wifi --no-collector.nfs
  1. 调整Prometheus存储参数:
storage: tsdb: retention: 15d wal_compression: true
  1. 使用Recording Rules预计算常用指标:
groups: - name: node_rules rules: - record: instance:node_cpu:avg_rate5m expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

5.2 常见问题处理

指标缺失排查流程:

  1. 检查node_exporter日志:
journalctl -u node_exporter -f
  1. 手动访问metrics接口:
curl -s http://localhost:9100/metrics | grep node_memory
  1. 验证Prometheus抓取状态:
    • 访问/targets查看job状态
    • 检查up{job="node"}指标是否为1

典型错误处理:

  • 出现"context deadline exceeded":增加scrape_timeout
  • 指标值异常:检查是否启用对应采集器(如网络指标需netdev采集器)
  • 时间戳不匹配:确保所有节点时间同步(chrony或ntpd)

我在实际运维中发现,当node_exporter版本低于1.3时,在多核CPU服务器上可能出现node_cpu指标不全的问题。解决方法很简单——升级到最新稳定版即可。另一个容易忽略的点是,如果使用非root用户运行,部分指标(如node_sockstat_*)会因权限不足无法采集,这时需要给该用户增加/proc和/sys的读取权限。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询