部署 Prometheus Server:二进制与 Docker 实战
Prometheus Server 是整个 APM 指标采集体系的核心,负责从各类 exporter 拉取指标、存储时序数据并通过 PromQL 提供查询。本章从原理出发,覆盖两种主流部署方式——二进制直接安装与 Docker 容器化运行,并重点解决存储路径配置与持久化、启动验证、常见错误等工程化问题。
原理概述
Prometheus Server 的时序数据库(TSDB)将采集到的样本按时间序列存储在本地文件系统中。默认数据目录为 data/,可通过 --storage.tsdb.path 参数指定。该目录包含 .wal、.block 等子目录,其读写性能直接影响采集吞吐与查询响应。因此,存储路径必须配置在独立磁盘或高性能卷上,并启用持久化机制。
二进制部署直接与操作系统交互,资源开销最小;Docker 部署则提供环境隔离、快速编排和与容器编排平台(如 Kubernetes)的天然集成。两种方式各有适用场景,下表快速对比:
| 对比维度 | 二进制部署 | Docker 部署 |
|---|---|---|
| 安装复杂度 | 中等(手动配置 systemd) | 低(一条命令启动) |
| 资源消耗 | 最低 | 轻微额外开销(容器运行时) |
| 环境隔离 | 依赖主机 OS | 完全容器化隔离 |
| 持久化配置 | 本地目录固定 | Host Volume / Named Volume |
| 升级回滚 | 自行管理版本 | 镜像标签切换,回滚快 |
| 生产推荐 | 裸金属 / VM | Kubernetes / 微服务 |
选型建议: 若你使用纯物理机或传统虚拟化环境,推荐二进制 + systemd 管理;若团队已采用容器编排平台,直接走 Docker 部署并挂载持久化卷。
二进制部署:逐步骤执行
1. 下载并解压
获取 Prometheus 官方最新版(或者固定生产版本)。以 Linux amd64 为例:
wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
tar xzf prometheus-2.53.0.linux-amd64.tar.gz
cd prometheus-2.53.0.linux-amd64/
2. 配置 prometheus.yml
编辑配置文件,至少定义全局参数与默认 job:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
生产环境下需增加存储路径参数,可创建 /etc/prometheus/prometheus.yml 并指定数据目录。
3. 启动二进制进程
直接前台启动(用于测试):
./prometheus --config.file=prometheus.yml --storage.tsdb.path=/data/prometheus
使用 systemd 管理(生产推荐),创建 /etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus Server
After=network.target
[Service]
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus/data
Restart=always
User=prometheus
Group=prometheus
[Install]
WantedBy=multi-user.target
随后启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
Docker 部署:一行命令完成
拉取官方镜像并启动,同时挂载主机卷以实现数据持久化:
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /host/prometheus/data:/prometheus \
-v /host/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
-v /host/prometheus/data:/prometheus:容器内的/prometheus(默认 TSDB 路径)映射到宿主机目录,保证容器重启后数据不丢失。-v /host/prometheus/prometheus.yml:挂载自定义配置文件。- Docker Compose 方式更便于管理,适用于多服务环境。
⚠ 权限陷阱: 挂载的宿主机目录必须具有
uid:gid 权限(默认容器内 prometheus 用户 uid 为 65534)。执行 chown 65534:65534 /host/prometheus/data,否则容器启动时会因写权限失败。
持久化与存储路径配置要点
| 配置项 | 说明 | 建议值 |
|---|---|---|
--storage.tsdb.path | TSDB 数据目录 | SSD 挂载的独立分区,如 /data/prometheus 或 /var/lib/prometheus |
--storage.tsdb.retention.time | 数据保留时间 | 默认 15d,生产可设为 30d 或 90d |
--storage.tsdb.retention.size | 数据保留大小(如果超过则删除旧数据) | 按磁盘容量设置,如 100GB |
| Docker 卷类型 | Host Volume / Named Volume | 生产环境推荐 Named Volume 便于备份 |
验证启动状态与 Web UI
无论哪种部署方式,验证步骤完全一致:
- 检查进程存活:
ps aux | grep prometheus # 二进制 docker ps | grep prometheus # Docker - 访问 Web UI: 浏览器打开
http://<server-ip>:9090,确认出现 Prometheus 图形界面。 - 查看 Target 状态: 导航栏
Status > Targets,确保 Prometheus 自身 job 为 UP。 - 验证 /metrics 端点:
应输出大量带curl http://localhost:9090/metrics | head -20# HELP和# TYPE的指标行。
快速健康检查 API: GET
/-/ready 返回 200 表示服务就绪;GET /-/healthy 返回 200 表示健康。
常见错误与解决方法
- "Permission denied" 写数据目录:原因 data 目录权限不足。修正:
sudo chown -R 65534:65534 /data/prometheus(二进制);Docker 中确保宿主机挂载目录可写。 - "error loading config: couldn't parse configuration file":YAML 缩进错误。使用
promtool check config prometheus.yml校验。 - "404 page not found" 访问 Web UI:启动时未绑定正确 IP 或端口被占用。检查启动日志中
Listening on :9090消息,或改用--web.listen-address=0.0.0.0:9090。 - Docker 容器频繁重启:查看
docker logs prometheus,常见原因同上权限或配置错误。
性能与稳定性优化
- 存储路径选择 SSD:Prometheus 的 WAL 和 compaction 对磁盘 I/O 敏感,务必使用低延迟存储。
- 设置合理的 retention 策略:同时配置时间与大小上限,防止磁盘写满。
--storage.tsdb.retention.time=30d --storage.tsdb.retention.size=100GB。 - 二进制部署启用 systemd Restart:确保 Server 崩溃后自动拉起。
- Docker 启动添加资源限制:使用
--memory=2g --cpus=2避免被其他容器抢占。 - 开启 Web 压缩:
--web.enable-remote-write-receiver与--web.enable-lifecycle按需开启,后者支持热加载配置。 - 日志分级:
--log.level=info生产环境中降低为warn可减少磁盘写入。
小实验: 部署完成后,执行
curl -X POST http://localhost:9090/-/reload 热加载配置(需开启 --web.enable-lifecycle),观察 Target 列表无断开。验证生活质量的提升!