
1. 为什么选择PrometheusGrafana监控方案第一次接触服务器监控时我被各种专业术语搞得晕头转向。直到发现了PrometheusGrafana这个黄金组合才真正找到了适合中小团队的轻量级监控方案。这套系统最吸引我的地方在于它的模块化设计——Prometheus负责数据采集和存储Grafana专注数据可视化各司其职又完美配合。相比传统监控工具这套方案有三个突出优势首先是开源免费不用支付高昂的许可费用其次是扩展性强社区提供了上百种Exporter支持各种中间件监控最重要的是上手简单我带着团队里的实习生用半天时间就搭好了基础监控。记得第一次在Grafana里看到实时跳动的服务器指标时那种一切尽在掌握的感觉特别踏实。实际使用中这套组合能覆盖绝大多数监控场景从服务器基础指标CPU/内存/磁盘到MySQL查询性能从Redis缓存命中率到Nginx请求流量甚至还能监控Windows服务器。去年双十一大促期间我们就是靠着它提前发现了数据库连接池瓶颈避免了线上事故。2. 环境准备与Prometheus安装2.1 基础环境配置我建议使用CentOS 7或Ubuntu 18.04以上版本作为基础系统。最近在阿里云上实测2核4G的轻量级服务器就能流畅运行整套监控系统。先确保防火墙放行必要端口# 开放Prometheus默认端口 sudo firewall-cmd --add-port9090/tcp --permanent # 开放Grafana默认端口 sudo firewall-cmd --add-port3000/tcp --permanent sudo firewall-cmd --reload内存方面有个坑要注意Prometheus默认会加载所有监控数据到内存如果监控目标较多建议单独准备一台8G以上内存的机器。我有次在2G内存的机器上监控50节点直接导致OOM崩溃。2.2 Prometheus二进制安装从官网下载最新稳定版目前是2.37.x系列我习惯把软件安装在/opt目录下wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz tar xvf prometheus-2.37.0.linux-amd64.tar.gz -C /opt ln -s /opt/prometheus-2.37.0.linux-amd64 /opt/prometheus创建专用系统用户运行服务更安全useradd --no-create-home --shell /bin/false prometheus chown -R prometheus:prometheus /opt/prometheus2.3 配置文件详解主配置文件prometheus.yml就像监控系统的大脑分享几个实用配置技巧global: scrape_interval: 30s # 生产环境可以适当调大 evaluation_interval: 30s rule_files: - alert.rules # 告警规则单独存放 scrape_configs: - job_name: prometheus static_configs: - targets: [localhost:9090] metrics_path: /metrics # 非标准路径时指定 scheme: https # 监控HTTPS服务时需设置遇到过的一个典型问题当监控目标超过20个时建议启用scrape_timeout默认10s并适当增大global: scrape_timeout: 20s3. 监控数据采集实战3.1 主机监控部署Node Exporter是采集主机指标的瑞士军刀安装后别忘了启用有用的采集器./node_exporter \ --collector.systemd \ --collector.systemd.unit-whitelist(docker|sshd|nginx).service \ --collector.processes \ --collector.tcpstat在Prometheus配置中添加target时我习惯用标签分组- job_name: node static_configs: - targets: [192.168.1.101:9100] labels: env: production role: web-server - targets: [192.168.1.102:9100] labels: env: staging role: db-master3.2 MySQL监控配置mysqld_exporter需要数据库账号授权建议创建专用监控账号CREATE USER exporterlocalhost IDENTIFIED BY StrongPassword WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO exporterlocalhost;配置文件中可以开启慢查询监控[client] userexporter passwordStrongPassword [collect] slow_log true3.3 服务发现优化静态配置管理起来太麻烦推荐使用文件服务发现。创建targets目录按服务分类存放scrape_configs: - job_name: node file_sd_configs: - files: - /etc/prometheus/targets/nodes/*.json示例node.json文件[ { targets: [192.168.1.101:9100], labels: { env: production, region: east-1 } } ]4. Grafana可视化实战4.1 安装与初始配置推荐使用官方仓库安装最新版sudo apt-get install -y apt-transport-https sudo apt-get install -y software-properties-common wget wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - echo deb https://packages.grafana.com/oss/deb stable main | sudo tee -a /etc/apt/sources.list.d/grafana.list sudo apt-get update sudo apt-get install grafana修改默认配置文件/etc/grafana/grafana.ini[security] admin_user admin admin_password SuperSecretPassword [server] http_port 3000 domain monitor.yourcompany.com4.2 仪表板设计技巧导入官方模板时我常用这几个经典Dashboard ID主机监控8919MySQL监控7362Redis监控763黑盒监控9965自定义面板时善用变量功能实现动态筛选# 主机选择变量 label_values(node_uname_info{jobnode}, instance) # 环境选择变量 label_values(up{jobnode}, env)告警配置有个实用技巧在Alert标签中使用模板变量{{ $labels.instance }} CPU使用率超过80% 当前值: {{ $value }}%5. 生产环境优化建议5.1 性能调优经验当监控数据量增大时这几个参数需要调整# prometheus启动参数 --storage.tsdb.retention.time30d # 数据保留周期 --storage.tsdb.retention.size512GB # 存储空间限制 --query.max-concurrency20 # 查询并发数对于高频监控指标可以在记录规则中预先计算groups: - name: node_rules rules: - record: instance:node_cpu:avg_rate5m expr: 100 - avg(irate(node_cpu_seconds_total{modeidle}[5m])) by (instance) * 1005.2 高可用方案我们采用的方案是双Prometheus实例VictoriaMetrics长期存储两个Prometheus实例配置相同的采集任务使用VictoriaMetrics的vmagent做数据去重Grafana连接VictoriaMetrics查询备份配置也很重要我写了个每日备份脚本#!/bin/bash BACKUP_DIR/backup/prometheus find $BACKUP_DIR -type f -mtime 7 -delete sudo systemctl stop prometheus tar czf $BACKUP_DIR/prometheus-$(date %F).tar.gz /opt/prometheus/data sudo systemctl start prometheus6. 常见问题排查指南遇到监控数据缺失时按照这个流程排查检查target状态http://prometheus:9090/targets手动访问Exporter接口curl http://target:port/metrics查看Prometheus日志journalctl -u prometheus -f检查网络连通性telnet target port一个典型的内存泄漏案例当看到Prometheus进程内存持续增长时可能是cardinality爆炸。用这个命令检查指标基数promtool tsdb analyze /opt/prometheus/dataGrafana面板显示No Data时先检查时间范围是否选择正确数据源连接是否正常查询语句是否有语法错误指标名称是否发生变化