在分布式系统中,监控是确保服务稳定性的关键基础设施。典型的监控架构由数据采集层(node-exporter)和数据处理层(Prometheus)组成,这种设计遵循了Unix"单一职责"的哲学理念。
node-exporter作为数据采集代理,需要部署在所有需要监控的宿主机上。它通过读取Linux系统的/proc和/sys虚拟文件系统获取硬件指标,这种设计有三大优势:
Prometheus则扮演着数据聚合器的角色,其核心能力体现在:
重要提示:生产环境建议将Prometheus部署在独立节点,避免监控系统与业务争抢资源。我曾遇到过因Prometheus与业务混部导致OOM的案例,最终通过专用节点部署解决了问题。
完整的数据生命周期包含四个阶段:
这种拉取模式(Pull)相比推送模式(Push)有两个显著优势:
官方Docker镜像prom/node-exporter提供了开箱即用的体验,但需要注意三个关键挂载点:
yaml复制volumes:
- /proc:/host/proc:ro # 进程信息
- /sys:/host/sys:ro # 系统信息
- /:/rootfs:ro # 根文件系统
这些挂载点对应着Linux系统的核心信息源:
避坑经验:曾遇到因忘记挂载/proc导致CPU指标缺失的情况。务必检查docker inspect确认挂载成功。
默认情况下node-exporter以nobody用户运行,这可能导致某些指标无法采集。推荐的安全实践是:
bash复制groupadd -r node_exporter
useradd -r -g node_exporter -s /sbin/nologin node_exporter
yaml复制user: "node_exporter"
code复制node_exporter ALL=(root) NOPASSWD: /bin/cat /proc/net/dev
node-exporter默认会采集所有可用指标,通过collector参数可以优化:
yaml复制command:
- '--collector.disable-defaults'
- '--collector.cpu'
- '--collector.meminfo'
- '--collector.filesystem'
实测表明,禁用不必要的采集器可降低30%的内存占用。建议根据实际需求选择采集器,常见的有:
Prometheus的TSDB采用多层存储设计:
code复制├── blocks
│ ├── 01BKGTZQ1SYQJTR4PB3C8PDHR
│ └── 01BKGTZQ1SYQJTR4PB3C8PDHR
└── wal
├── 00000001
└── 00000002
存储优化建议:
yaml复制command:
- '--storage.tsdb.retention.time=15d' # 保留周期
- '--storage.tsdb.wal-compression' # 启用WAL压缩
- '--storage.tsdb.retention.size=500GB' # 空间限制
静态配置适用于小型环境:
yaml复制static_configs:
- targets: ['10.0.1.2:9100', '10.0.1.3:9100']
动态发现支持多种方式:
yaml复制dns_sd_configs:
- names: ['_prometheus._tcp.example.com']
yaml复制file_sd_configs:
- files: ['/etc/prometheus/targets/*.json']
yaml复制http_sd_configs:
- url: 'http://nacos:8848/nacos/v1/ns/instance/list?serviceName=node-exporter'
基础HA部署:
进阶方案:
问题1:指标缺失
docker logs <container_id>curl http://localhost:9100/metricshttp://prometheus:9090/targets问题2:存储空间暴涨
http://prometheus:9090/tsdb-status--storage.tsdb.retention.time=7d--storage.tsdb.compression=enabledyaml复制global:
scrape_interval: 30s # 默认15s改为30s
yaml复制scrape_configs:
- metric_relabel_configs:
- source_labels: [__name__]
regex: '(node_cpu_seconds_total|node_memory_MemAvailable_bytes)'
action: keep
rate()大时间范围recording rules预计算CPU监控:
code复制100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
内存监控:
code复制node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100
磁盘预警:
code复制predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 4*3600) < 0
这些指标经过多年实战检验,能覆盖90%的硬件异常场景。建议配置对应的告警规则,形成完整的监控闭环。