快速部署Prometheus:二进制部署、Docker部署、配置文件详解

好,咱们直接进入正题。Prometheus的部署方式其实就两种主流选择:二进制和Docker。我个人更推荐生产环境用二进制,测试环境用Docker。为什么?往下看你就明白了。

一、二进制部署:最稳的方式

二进制部署,说白了就是把Prometheus的可执行文件下载下来,直接跑。这种方式的好处是——没有依赖,没有容器层的性能损耗。我在项目中遇到过几次因为Docker daemon异常导致监控中断的事故,从那以后,核心监控节点我全换成了二进制。

1. 下载与解压

# 去官网下载最新版(或者用我下面这个链接)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

# 解压
tar -xzf prometheus-2.45.0.linux-amd64.tar.gz

# 进入目录
cd prometheus-2.45.0.linux-amd64/

解压后你会看到几个关键文件:prometheus(主程序)、promtool(检查工具)、prometheus.yml(配置文件)。嗯,这里要注意,promtool是个好东西,后面验证配置时会用到。

2. 启动命令

# 最简单的启动方式
./prometheus --config.file=prometheus.yml

# 带参数启动(我常用的方式)
./prometheus \
  --config.file=prometheus.yml \
  --storage.tsdb.path=/data/prometheus \
  --web.listen-address=0.0.0.0:9090 \
  --log.level=info

启动后,访问 http://你的IP:9090,看到Prometheus的Web界面就算成功了。

我的习惯:我会把数据目录单独挂载到一块SSD上。曾经因为默认路径在系统盘,结果日志把磁盘写满了,监控直接挂掉。从那以后,--storage.tsdb.path 我必指定。

二、Docker部署:快速但要注意坑

Docker部署适合快速验证,或者你已经在用容器化运维。但我要提醒你——Docker部署Prometheus,数据持久化是个大坑。

1. 简单启动

docker run -d \
  --name prometheus \
  -p 9090:9090 \
  prom/prometheus

这样启动,容器一删数据全丢。你想想看,生产环境谁敢这么干?

2. 带持久化的启动

# 先创建数据目录和配置文件目录
mkdir -p /data/prometheus/data
mkdir -p /data/prometheus/config

# 把prometheus.yml放到config目录下

# 启动容器
docker run -d \
  --name prometheus \
  --restart=always \
  -p 9090:9090 \
  -v /data/prometheus/data:/prometheus \
  -v /data/prometheus/config:/etc/prometheus \
  prom/prometheus
我曾经踩过的坑:容器内的Prometheus默认用户是nobody,如果你宿主机上的数据目录权限不对,启动会报错。解决方案:chown 65534:65534 /data/prometheus/data。65534就是nobody的UID。

三、配置文件详解:核心中的核心

配置文件 prometheus.yml 是Prometheus的大脑。说白了,它告诉Prometheus三件事:全局怎么跑、规则文件在哪、要抓谁的数据。

1. global 全局配置

global:
  scrape_interval: 15s      # 默认抓取间隔
  evaluation_interval: 15s  # 规则评估间隔
  scrape_timeout: 10s       # 抓取超时时间

这里有个细节:scrape_timeout 必须小于 scrape_interval。为什么?你想想看,如果超时时间比抓取间隔还长,那上一次抓取还没结束,下一次又开始了,数据会乱套。

参数 说明 我的建议值
scrape_interval 抓取频率 15s(默认)
evaluation_interval 告警规则评估频率 15s(默认)
scrape_timeout 单次抓取超时 10s

2. rule_files 规则文件

rule_files:
  - "rules/*.yml"    # 加载rules目录下所有yml文件
  - "alerts.yml"     # 加载单个文件

规则文件里放的是告警规则和记录规则。我个人习惯把告警规则和记录规则分开存放,比如 alerts/records/,这样维护起来清晰很多。

3. scrape_configs 抓取配置

这是最核心的部分。Prometheus要抓谁的数据,全在这里定义。

scrape_configs:
  # 抓Prometheus自身
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 抓node_exporter
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['192.168.1.10:9100', '192.168.1.11:9100']
重要概念:每个 job_name 代表一类监控目标。比如 node_exporter 负责所有机器的系统指标,mysql_exporter 负责数据库指标。这样分类,后面在Grafana里做面板时方便很多。

四、启动与验证:别急着上线

配置写好了,别急着直接启动。先用 promtool 检查一下配置有没有语法错误。

# 检查配置文件
./promtool check config prometheus.yml

# 如果输出 "SUCCESS" 说明没问题
# 如果有错误,会明确告诉你哪一行有问题

验证通过后,启动Prometheus。然后做三件事验证:

  1. 看Web界面:访问 http://IP:9090,确认页面能打开
  2. 看Targets状态:点击 Status -> Targets,所有目标应该是 UP 状态
  3. 查一条数据:在查询框输入 up,应该能看到返回结果
一个小技巧:如果Targets显示 DOWN,别慌。先检查网络通不通:curl http://目标IP:端口/metrics。如果curl能拿到数据,那就是Prometheus配置问题;如果curl都拿不到,那就是目标机器的问题。

嗯,到这里,Prometheus的部署和基本配置就完成了。下一章我们会聊Grafana的接入和可视化,到时候你会看到这些配置的价值。