一、Prometheus是什么?
Prometheus(普罗米修斯)是一套开源的系统监控和告警框架,由SoundCloud开发,后捐赠给CNCF(云原生计算基金会)。它使用Go语言编写,具备强大的多维数据模型和灵活的查询语言PromQL。
Prometheus通常与Grafana配合使用:Prometheus负责数据采集和存储,Grafana负责可视化展示。
核心架构组件
| 组件 | 功能 |
|---|---|
| Prometheus Server | 核心服务,负责抓取和存储时序数据 |
| Exporter | 数据采集器,暴露指标接口(如node_exporter) |
| Alertmanager | 告警管理,负责告警路由、去重、通知 |
| Pushgateway | 短期任务推送网关 |
| Grafana | 数据可视化(第三方) |
二、Prometheus vs Zabbix:如何选择?
| 维度 | Prometheus | Zabbix |
|---|---|---|
| 开发语言 | Go | PHP + C + Go |
| 部署方式 | 二进制解压即用,极其轻量 | 需要数据库、PHP环境,部署复杂 |
| 学习曲线 | PromQL门槛较高 | Web界面友好,易于上手 |
| 监控方式 | 各类Exporter,基于HTTP拉取 | 模板+Agent,支持多种协议 |
| 数据存储 | 自带TSDB时序数据库 | 依赖MySQL/PostgreSQL |
| 适用场景 | 微服务、容器、Kubernetes | 传统物理机、网络设备、硬件 |
| 扩展性 | 原生支持服务发现,动态扩展 | 需要手动添加或通过API |
选型建议:
容器/K8s环境 → Prometheus(事实标准)
传统IDC、硬件监控 → Zabbix
混合环境 → 两者结合使用
三、极速部署指南
3.1 环境准备:时间同步
监控系统对时间精度要求极高,所有节点必须时间同步:
# 配置NTP定时同步(每2分钟)crontab -e*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null# 验证时间date
补充建议:生产环境推荐使用chrony替代ntpdate,精度更高且支持平滑调整:
yum install -y chronysystemctl enable --now chronydchronyc sources -v
3.2 下载与安装
# 创建应用目录mkdir -p /app/# 下载(生产环境选择LTS版本)# AMD64架构wget https://github.com/prometheus/prometheus/releases/download/v3.5.3/prometheus-3.5.3.linux-amd64.tar.gz# ARM64架构# wget https://github.com/prometheus/prometheus/releases/download/v3.5.3/prometheus-3.5.3.linux-arm64.tar.gz# 解压tar xf prometheus-3.5.3.linux-amd64.tar.gz -C /app/# 创建软链接(方便版本升级)ln -s /app/prometheus-3.5.3.linux-amd64/ /app/prometheus
目录结构说明:
/app/prometheus/├── prometheus # 主程序二进制文件├── promtool # 配置检查和调试工具├── prometheus.yml # 主配置文件├── consoles/ # 内置控制台模板├── console_libraries/ # 控制台模板库└── data/ # TSDB数据存储目录(启动后自动创建)
3.3 启动服务
方式一:前台启动(调试用)
cd /app/prometheus./prometheus
启动成功后可以看到关键日志:
msg="Server is ready to receive web requests."方式二:后台启动(临时方案)
nohup /app/prometheus/prometheus &>>/var/log/prometheus.log &方式三:Systemd管理(生产推荐)
cat > /usr/lib/systemd/system/prometheus.service << 'EOF'[Unit]Description=Prometheus ServerAfter=network.targetWants=network-online.target[Service]Type=simpleUser=prometheusGroup=prometheusExecStart=/app/prometheus/prometheus \--config.file=/app/prometheus/prometheus.yml \--web.listen-address=0.0.0.0:9090 \--web.max-connections=512 \--storage.tsdb.path=/app/prometheus/data/ \--storage.tsdb.retention.time=30dExecReload=/bin/kill -HUP$MAINPIDRestart=on-failureRestartSec=5sLimitNOFILE=65536[Install]WantedBy=multi-user.targetEOF
注意:Type必须设置为simple,不能用notify,因为Prometheus不支持sd_notify协议。
# 创建专用用户(安全最佳实践)useradd -r -s /sbin/nologin prometheuschown -R prometheus:prometheus /app/prometheus# 加载并启动systemctl daemon-reloadsystemctl enable --now prometheus.service# 检查状态systemctl status prometheus.service# 查看实时日志journalctl -f -u prometheus.service
3.4 开机自启动
配置开机自启动有两种方式:
方式一:Systemd enable(推荐)
# 设置开机自启(上面已包含,单独列出便于理解)systemctl enable prometheus.service# 验证是否已设置systemctl is-enabled prometheus.service# 输出 enabled 即表示成功
原理:systemctl enable 会在 /etc/systemd/system/multi-user.target.wants/ 下创建软链接,系统启动到多用户模式时自动拉起服务。
方式二:rc.local(传统方式,不推荐)
如果没有使用Systemd管理,也可以写入rc.local:
# 确保rc.local有执行权限chmod +x /etc/rc.d/rc.local# 追加启动命令cat >> /etc/rc.local << 'EOF'/app/prometheus/prometheus \--config.file=/app/prometheus/prometheus.yml \--web.listen-address=0.0.0.0:9090 \--web.max-connections=512 \ &>/var/log/prometheus.log &EOF
两种方式对比:
| 维度 | systemctl enable | rc.local |
|---|---|---|
| 服务管理 | 支持start/stop/restart/status | 仅启动,无法管理 |
| 依赖控制 | 可指定After/Wants依赖顺序 | 无依赖管理 |
| 异常重启 | 支持Restart=on-failure自动恢复 | 进程挂了不会自动拉起 |
| 日志管理 | journalctl统一管理 | 需手动管理日志文件 |
| 推荐程度 | 生产环境首选 | 仅作为备用方案 |
3.4 验证访问
浏览器访问:http://<服务器IP>:9090
Status → Targets:查看监控目标状态
Graph:执行PromQL查询
Alerts:查看告警规则
四、命令行核心选项详解
| 选项 | 说明 | 默认值 |
|---|---|---|
--config.file | 配置文件路径 | prometheus.yml |
--web.listen-address | Web监听地址和端口 | 0.0.0.0:9090 |
--web.max-connections | 最大并发连接数 | 512 |
--storage.tsdb.path | TSDB数据存储路径 | data/ |
--storage.tsdb.retention.time | 数据保留时间 | 15d |
--storage.tsdb.retention.size | 数据保留大小上限 | 0(无限制) |
--log.level | 日志级别(debug/info/warn/error) | info |
--log.format | 日志格式(logfmt/json) | logfmt |
--web.enable-lifecycle | 启用热重载API | false |
生产建议:添加--web.enable-lifecycle后,可以通过HTTP请求热重载配置,无需重启服务:
curl-X POST http://localhost:9090/-/reload五、配置文件深度解析
5.1 完整配置结构
# 全局配置global: scrape_interval: 15s # 数据采集间隔(多久拉取一次指标) evaluation_interval: 15s # 规则评估间隔(多久执行一次告警规则) scrape_timeout: 10s # 采集超时时间# 告警管理器配置alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093# 告警规则文件rule_files: - "rules/*.yml"# 数据采集配置(核心)scrape_configs:# 监控Prometheus自身 - job_name: "prometheus-server" static_configs: - targets: ["localhost:9090"]
5.2 采集配置方式
静态配置(适合固定节点):
scrape_configs: - job_name: "linux-nodes" static_configs: - targets: - "192.168.2.10:9100" - "192.168.2.11:9100" - "192.168.2.12:9100" labels: env: production team: ops
基于文件的服务发现(推荐,修改无需重启):
scrape_configs: - job_name: "linux-nodes" file_sd_configs: - files: - "targets/nodes/*.json" refresh_interval: 30s
对应的JSON文件:
[ {"targets": ["192.168.2.10:9100", "192.168.2.11:9100"],"labels": {"env": "production","datacenter": "bj" } }]
5.3 配置检查工具
修改配置后,务必先验证语法:
/app/prometheus/promtool check config /app/prometheus/prometheus.yml六、常用Exporter部署(补充)
Prometheus通过Exporter采集不同对象的指标:
| Exporter | 用途 | 默认端口 |
|---|---|---|
| node_exporter | Linux系统指标(CPU/内存/磁盘/网络) | 9100 |
| mysqld_exporter | MySQL数据库指标 | 9104 |
| redis_exporter | Redis指标 | 9121 |
| nginx-prometheus-exporter | Nginx指标 | 9113 |
| blackbox_exporter | HTTP/TCP/ICMP探测 | 9115 |
| cadvisor | 容器指标 | 8080 |
Node Exporter快速部署示例:
# 下载wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz# 解压并启动tar xf node_exporter-1.11.1.linux-amd64.tar.gz -C /app/ln-s /app/node_exporter-1.11.1.linux-amd64 /app/node_exporternohup /app/node_exporter/node_exporter &>/var/log/node_exporter.log &# 验证curl http://localhost:9100/metrics
七、安全加固建议(补充)
生产环境中Prometheus的安全不可忽视:
网络隔离:Prometheus端口不要暴露到公网,通过Nginx反向代理+认证访问
Basic Auth认证:
# web.yml(Prometheus原生支持)basic_auth_users: admin: $2y$10$xxx... # bcrypt加密的密码
启动时加载:
--web.config.file=/app/prometheus/web.ymlTLS加密:配置HTTPS避免数据被窃听
最小权限:使用非root用户运行服务
防火墙:仅允许Grafana和告警服务访问9090端口
八、常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 启动失败,Type=notify | Prometheus不支持notify | 改为Type=simple |
| Target状态DOWN | Exporter未启动/防火墙 | 检查端口连通性 |
| 数据丢失 | retention到期/磁盘满 | 调整retention或扩容 |
| 内存占用高 | 采集目标过多/查询复杂 | 优化标签、分片部署 |
| 配置重载失败 | YAML语法错误 | 使用promtool检查 |
九、总结
Prometheus部署清单:
所有节点时间同步(chrony/ntpdate)
二进制解压安装,创建软链接便于升级
使用Systemd管理,Type设为simple
配置文件使用file_sd_configs实现动态发现
修改配置前用promtool验证语法
生产环境开启认证和TLS
合理设置数据保留策略,监控磁盘使用
下一篇我们将介绍如何配置Grafana实现精美的监控大屏展示,敬请关注。
夜雨聆风