在现代IT基础设施管理中,监控系统如同人体的神经系统,需要实时感知各个组件的运行状态。Prometheus作为云原生时代的监控标杆,配合node-exporter这个"体检医生",能够全面采集主机层面的各项指标数据。这套组合在业界已经形成了事实上的标准方案,我经手过的数十个生产环境监控系统,90%都采用了这个基础架构。
为什么选择这个组合?首先Prometheus的拉取模式(Pull)相比传统推模式(Push)更适合动态云环境,其次它的多维数据模型和强大的PromQL查询语言,让监控数据具备了SQL般的灵活分析能力。而node-exporter作为官方推荐的采集器,覆盖了CPU、内存、磁盘、网络等所有基础指标,就像给每台服务器装上了全面的传感器阵列。
在生产环境部署前,需要做好容量规划。根据我的经验,单个Prometheus实例处理node-exporter数据时:
这里有个计算公式:
code复制所需磁盘空间 = 指标数量 × 采样间隔 × 保留时长 × 每个样本大小(约1-2字节)
安全方面容易踩坑,建议采取这些措施:
bash复制--web.listen-address=192.168.1.100:9100
bash复制iptables -A INPUT -p tcp --dport 9100 -s 监控服务器IP -j ACCEPT
iptables -A INPUT -p tcp --dport 9100 -j DROP
yaml复制tls_server_config:
cert_file: node_exporter.crt
key_file: node_exporter.key
prometheus.yml中最关键的是scrape_configs部分,这是我优化过的配置模板:
yaml复制scrape_configs:
- job_name: 'node'
scrape_interval: 15s
static_configs:
- targets: ['192.168.1.100:9100', '192.168.1.101:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '(.*):.*'
replacement: '$1'
几个经验技巧:
Prometheus的本地存储是个性能瓶颈,我总结的优化方案:
yaml复制storage:
tsdb:
retention: 15d
wal_compression: true
yaml复制storage:
tsdb:
memory_map: 4GB
yaml复制remote_write:
- url: "http://thanos:10908/api/v1/receive"
write_relabel_configs:
- action: keep
regex: 'up|node_memory_.*'
source_labels: [__name__]
node-exporter默认会采集所有可用指标,但有些指标可能敏感或不必要:
bash复制--collector.disable-defaults
--collector.filesystem
--collector.meminfo
--collector.cpu
建议禁用以下收集器:
通过textfile收集器可以添加自定义指标,这是我常用的脚本:
bash复制#!/bin/bash
echo '# HELP custom_app_status Application status' > /var/lib/node_exporter/app.prom
echo '# TYPE custom_app_status gauge' >> /var/lib/node_exporter/app.prom
echo 'custom_app_status{app="web"} $(systemctl is-active nginx | grep -cq active && echo 1 || echo 0)' >> /var/lib/node_exporter/app.prom
然后启动时加载:
bash复制--collector.textfile.directory=/var/lib/node_exporter
常见性能问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Prometheus内存持续增长 | 查询负载高 | 限制查询并发度 |
| node-exporter CPU占用高 | 采集间隔太短 | 调整scrape_interval |
| 磁盘空间不足 | 保留时间过长 | 设置合理的retention |
验证采集是否正常:
bash复制curl http://localhost:9100/metrics | grep 'node_'
promql复制up{job="node"}
promql复制100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
经过多个项目的积累,我总结出这些黄金法则:
标签命名规范:
告警规则设计:
yaml复制groups:
- name: host.rules
rules:
- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 5m
labels:
severity: critical
annotations:
summary: "Host out of memory ({{ $labels.instance }})"
这套配置方案在多个万级节点的生产环境稳定运行,关键是要根据实际业务特点持续优化。比如电商大促时需要临时调低采集间隔,而夜间可以适当放宽以减少资源消耗。监控系统本身也需要被监控,这是个有趣的递归问题 - 我们通常会用另一个独立的Prometheus实例来监控主监控系统。