4962 字
25 分钟
Prometheus (1):从零认识 Prometheus 与单机快速上手

第一篇:从零认识 Prometheus 与单机快速上手#

监控是运维的眼睛,也是保障系统稳定运行的基石。在云原生时代,Prometheus 已经成为事实上的监控标准。本篇文章专为“零基础”新手打造,我们将摒弃晦涩难懂的学术概念,用最接地气的大白话,带你彻底搞懂 Prometheus 的核心逻辑,并手把手完成单机环境的极速部署。

一、开篇:运维入门,为什么一定要先学会监控#

很多新手在学习服务器运维时,往往一上来就去折腾集群、高可用、负载均衡,却忽视了最基础的监控体系。

1.1 没有监控的真实窘境:故障全靠用户上报、排查全靠经验盲猜#

想象一下这个场景:你的应用突然变卡,甚至页面打不开。如果没有监控系统:

  • 发现问题:往往是客户发来投诉截图,“你们的网站怎么挂了?”,你才知道出事了。
  • 排查问题:你只能慌忙 SSH 登录服务器,疯狂敲 top、free、df -h,去翻看海量的业务日志。这不仅效率低下,而且如果服务已经因为 OOM(内存溢出)被内核强杀,你甚至连“犯罪现场”都找不到。

1.2 一套完整监控系统的核心价值#

一个优秀的监控系统,就像是医院的 ICU 监护仪,它的核心价值可以概括为三个阶段:

  • 事前预警:在磁盘即将写满、内存占用飙升到 90% 时提前给你发微信或钉钉告警,让你有充裕的时间介入处理。
  • 事中定位:故障发生时,通过可视化的历史趋势图,一秒定位是网络带宽跑满、还是数据库连接数耗尽导致的崩溃。
  • 事后复盘:保留故障发生前后的所有性能指标切片,为事后的故障复盘报告提供不可辩驳的数据支撑。

1.3 新手选型解惑:为什么优先学 Prometheus 而非 Zabbix#

老牌监控王者 Zabbix 和当红炸子鸡 Prometheus 经常被拿来比较。作为新手,为什么我强烈建议你先学 Prometheus?

为什么选择 Prometheus?
  1. 架构轻量化:Zabbix 依赖关系型数据库(如 MySQL),部署沉重;Prometheus 自带轻量级时序数据库(TSDB),单机就能轻松扛住百万级指标。
  2. 云原生友好:它是 Kubernetes 官方推荐的监控方案,与 K8s 生态深度绑定,学好了它,后续进阶云原生事半功倍。
  3. 生态组件丰富:万物皆可 Exporter。不管是 Linux、MySQL、Redis,还是你的 Java/Go 业务代码,都有现成的接入方案。
  4. 入门学习曲线平缓:配置全部基于直观的 YAML 文件,无需在复杂的 Web 界面里层层点击找配置。

二、小白友好版:Prometheus 核心概念扫盲#

2.1 Prometheus 到底是什么#

不要把 Prometheus 仅仅当成一个“数据库”。它其实是一整套一站式的监控告警解决方案。它不仅负责把数据存下来(时序数据库),还负责主动去各大应用那里“拉取”数据,同时自带了一套非常强大的查询语言(PromQL),并且无缝对接告警组件。

2.2 一张图看懂核心架构#

虽然我们这里没有画图,但你可以这样在脑海中构建它的运转模型:

  1. Prometheus Server(主服务):监控系统的“大脑”,负责定时向各个目标拉取数据,并把数据存在本地磁盘。
  2. Exporter(数据采集器):安装在被监控节点上的“小弟”,负责把系统的各类指标暴露出来给主服务抓取。
  3. Alertmanager(告警组件):负责当数据触发设定的阈值时,向你的邮箱或钉钉发送报警信息。
  4. Grafana(可视化组件):好马配好鞍,负责把 Prometheus 里冷冰冰的数据画成极其酷炫的图表大屏。

2.3 必须吃透的 5 个基础术语(大白话讲解)#

为了后续学习不迷路,这五个核心概念必须拿下:

  1. 时序数据(Time Series Data) 和 MySQL 这种关系型数据库里一条条独立的用户记录不同,时序数据就是**“带有时间戳的数值”**。比如:10:00 CPU使用率 45%,10:01 CPU使用率 48%。它记录的是一个事物随时间变化的轨迹。

  2. 指标(Metric)与标签(Label)

    • 指标(Metric):代表你要监控的具体事物,比如 http_requests_total(HTTP 请求总数)。
    • 标签(Label):给指标加的“筛选维度”。比如同样是请求总数,我们可以打上 method="GET" 或 status="200" 的标签。这样你就能轻松过滤出“所有返回 200 的 GET 请求”。
  3. Pull(拉取)模式 vs Push(推送)模式 传统监控(如 Zabbix 常用)多为 Push 模式:客户端主动向监控中心汇报数据(“大哥,这是我今天的数据,请查收”)。 Prometheus 采用的是 Pull 拉取模式:主服务根据配置表,定时主动去各个节点拉数据(“小弟们,把数据准备好,我每 15 秒来拿一次”)。 优势:Pull 模式极大降低了客户端的压力,且主服务端更容易掌控抓取频率,不会被海量客户端的推送打垮。

  4. Exporter(翻译官) Prometheus 只认识特定格式的数据(Prometheus 格式)。但 MySQL、Nginx 它们自己不懂这种格式。Exporter 就是中间的翻译官,它去读取 MySQL 的状态,然后翻译成 Prometheus 认识的格式,暴露在一个 HTTP 接口(通常是 /metrics)上等待拉取。

  5. 实例(Instance)与任务(Job)

    • 实例(Instance):一个暴露了 /metrics 接口的具体监控目标(比如一台 IP 为 192.168.1.10:9100 的服务器)。
    • 任务(Job):一组具有相同目的的实例的集合(比如 10 台 Web 服务器组成了一个名为 web-cluster 的 Job)。

三、环境准备与安装方式选型#

3.1 实验环境说明#

Prometheus 使用 Go 语言编写,编译后就是一个独立的二进制文件,极其轻量。

  • 推荐系统:CentOS 7+ / Ubuntu 18.04+ 等主流 Linux 发行版均可。
  • 硬件配置:极低!1核 2G 内存的云服务器或者虚拟机就足以跑通本教程的所有实验。
  • 前置要求:掌握基础的 Linux 目录操作、文件编辑(vim)及解压命令即可。

3.2 两种主流安装方式对比与选型建议#

我们将为你提供两种部署方案,你可以任选其一:

  1. 二进制包部署(方式一):
    • 特点:最纯粹、最底层。你需要手动创建目录、编写 systemd 守护进程。
    • 建议:如果你是想深入学习、或者要在传统物理机生产环境部署,强烈建议走一遍二进制安装,这能帮你彻底搞懂它的文件结构。
  2. Docker 一键部署(方式二):
    • 特点:极速、环境无污染、一行命令拉起。
    • 建议:如果你只是想快速体验验证功能,或者公司本身已经全盘容器化,选它准没错。

3.3 前置环境统一检查#

不管选哪种方式,先做一下基础检查:

环境预检
# 1. 确认系统网络畅通
ping -c 3 baidu.com
# 2. 检查 9090 端口是否被占用 (Prometheus 默认端口)
netstat -tulpn | grep 9090
# 若没有任何输出,说明端口空闲,可以放心安装

四、方式一:保姆级二进制包部署 Prometheus#

如果你选择了二进制包安装,请紧跟这一章节的脚步。

4.1 官方下载渠道与版本选择#

我们前往 Prometheus 官方下载页,选择 linux-amd64 的稳定版(LTS)。

下载与解压
# 进入临时目录
cd /tmp
# 下载最新版 Prometheus (以 2.45.0 LTS 为例,具体版本请参考官网)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
# 校验下载是否完整(可选)
ls -lh prometheus-2.45.0.linux-amd64.tar.gz
# 解压缩
tar -zxvf prometheus-2.45.0.linux-amd64.tar.gz

4.2 规范运维目录规划#

生产环境中,乱放文件是大忌。我们来建立一套规范的目录结构:

创建规范目录
# 创建程序目录、配置目录和数据目录
sudo mkdir -p /usr/local/prometheus
sudo mkdir -p /etc/prometheus
sudo mkdir -p /var/lib/prometheus
# 移动二进制文件到程序目录
cd prometheus-2.45.0.linux-amd64
sudo mv prometheus promtool /usr/local/prometheus/
sudo mv consoles console_libraries /etc/prometheus/
# 移动并重命名默认配置文件
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
# 创建专用的普通用户(安全最佳实践)
sudo useradd -M -r -s /sbin/nologin prometheus
sudo chown -R prometheus:prometheus /usr/local/prometheus /etc/prometheus /var/lib/prometheus

4.3 初识 prometheus.yml:默认配置逐行解读#

我们来看看核心的配置文件长什么样:

/etc/prometheus/prometheus.yml
# 全局配置段
global:
scrape_interval: 15s # 默认抓取间隔,每 15 秒向被监控端拉取一次数据
evaluation_interval: 15s # 告警规则评估间隔
# 告警配置段(暂时用不到,先跳过)
alerting:
alertmanagers:
- static_configs:
- targets:
# 抓取配置段(核心!)
scrape_configs:
# job_name 相当于一个分组标签
- job_name: "prometheus"
# 静态配置要抓取的目标
static_configs:
# 这里配置了抓取 Prometheus 本身的 9090 端口
- targets: ["localhost:9090"]
解析

默认的配置文件非常聪明,它配置了一个名为 prometheus 的任务,抓取目标是 localhost:9090。这意味着,Prometheus 启动后的第一件事,就是把自己给监控起来!

4.4 前台启动测试#

配置准备好后,我们先在终端前台运行一下试试水:

前台启动测试
# 使用指定配置文件和数据目录启动
/usr/local/prometheus/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/

如果看到输出日志最后有一句 Server is ready to receive web requests.,说明启动成功了!按 Ctrl+C 退出,接下来我们配置后台常驻。

4.5 配置 systemd 服务托管#

为了让 Prometheus 能开机自启并在后台稳定运行,我们需要编写一个 systemd 服务脚本。

创建 service 文件
sudo vim /etc/systemd/system/prometheus.service

填入以下内容:

/etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=multi-user.target

保存后,启动服务:

启动并设置开机自启
# 重载 systemd 配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start prometheus
# 设置开机自启
sudo systemctl enable prometheus
# 查看服务状态(看到绿色的 active (running) 即可)
sudo systemctl status prometheus

4.6 防火墙与端口放行#

Prometheus 默认监听 TCP 9090 端口提供 Web UI。你需要确保防火墙放行了该端口:

放行 9090 端口
# 如果你使用的是 firewalld (CentOS)
sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
sudo firewall-cmd --reload
# 如果你使用的是 ufw (Ubuntu)
sudo ufw allow 9090/tcp
云服务器提醒

如果你使用的是阿里云、腾讯云或 AWS 等云服务器,千万别忘了去云控制台的“安全组”中放行 9090 端口的入方向规则! 否则无论系统防火墙怎么配,浏览器都是打不开的。

4.7 服务可用性最终验证#

打开你的浏览器,访问:http://<你的服务器IP>:9090。 如果出现了一个清爽的、带有 Expression 搜索框的页面,恭喜你,二进制包部署大功告成!你可以直接跳到第 6 节阅读了。


五、方式二:Docker 一键部署 Prometheus#

如果你喜欢容器化的简洁优雅,请看这里。

5.1 Docker 环境前置准备#

确保你的机器上已经安装好了 Docker 引擎。

检查 Docker 状态
docker -v
# 输出类似 Docker version 24.0.5, build ced0996 即可
sudo systemctl status docker
# 确保 Docker 服务正在运行

5.2 配置文件前置准备#

为了防止容器重启导致配置丢失,我们需要在宿主机准备好配置文件和数据挂载目录。

准备挂载目录
# 创建挂载目录
mkdir -p /opt/prometheus/data
# 创建默认配置文件
cat <<EOF > /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
EOF
# 修改数据目录权限,确保容器内 nobody 用户有权写入 (UID 65534)
chmod 777 /opt/prometheus/data

5.3 容器启动命令逐行详解#

使用如下命令一键拉起 Prometheus 容器:

启动 Prometheus 容器
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /opt/prometheus/data:/prometheus \
prom/prometheus:v2.45.0
参数大揭秘
  • -d:后台静默运行。
  • --name prometheus:给容器起个好记的名字。
  • -p 9090:9090:端口映射,将宿主机的 9090 转发到容器内的 9090。
  • -v /opt/...:/etc/...:将宿主机的配置文件挂载到容器内。修改宿主机文件,重启容器即可生效。
  • -v /opt/.../data:/prometheus:数据持久化挂载,防止容器被删除后监控历史数据全部丢失。

5.4 容器运行状态验证#

验证容器状态
# 查看容器是否正常运行 (Up 状态)
docker ps | grep prometheus
# 查看启动日志,确认没有报错
docker logs prometheus

此时,浏览器访问 http://<你的服务器IP>:9090,同样可以看到原汁原味的 Prometheus 界面!

5.5 Docker 部署常用运维命令#

日常运维只需这几个命令:

Docker 运维常用命令
# 重启服务(通常在修改了 prometheus.yml 后使用)
docker restart prometheus
# 停止服务
docker stop prometheus
# 启动服务
docker start prometheus

六、Prometheus 核心配置文件与目录结构全解析#

无论你是通过二进制还是 Docker 部署,理解 Prometheus 的文件和目录结构都是日常运维的基础。Prometheus 的设计非常极简,没有复杂的注册表或隐藏的系统文件,一切都明明白白地摆在目录里。

6.1 核心文件与目录一览表#

以下是 Prometheus 运行所需的最核心文件与目录清单:

文件/目录名称类型核心作用与说明
prometheus可执行程序Prometheus 的主程序文件。所有核心逻辑(拉取数据、存储数据、提供查询API)都在这个二进制文件里。
promtool可执行程序官方自带的命令行实用工具。常用于校验配置文件语法是否正确,或者测试 PromQL 查询。
prometheus.yml配置文件最核心的主配置文件。定义了全局抓取间隔、告警组件地址、以及要去哪里抓取哪些目标(scrape_configs)。
data/数据目录时序数据库(TSDB)的物理存储目录。里面包含 wal 预写日志、chunks_head 等底层数据块。千万不要手动修改此目录下的文件!
rules/ (可选)目录存放告警规则或记录规则的 YAML 文件目录。通常会在 prometheus.yml 中使用 rule_files 字段引入这里的文件。
consoles/目录存放官方提供的 HTML 模板文件,用于控制台页面渲染。新手基本不需要改动。

6.2 配置文件(prometheus.yml)进阶认识#

在日常工作中,你打交道最多的就是 prometheus.yml。它通常由四个主要区块构成:

  1. global(全局配置):控制全局默认参数。比如 scrape_interval(默认多长时间去小弟那里拉一次数据)。
  2. alerting(告警配置):告诉 Prometheus,当你发现异常数据时,要把报警信息发送给哪个 Alertmanager 实例。
  3. rule_files(规则文件配置):加载外部的规则文件路径,包括报警规则(Alerting rules)和预计算规则(Recording rules)。
  4. scrape_configs(抓取配置):这是你以后每天都要修改的区块。在这里配置抓取任务(Job),每个任务下面配置具体的抓取目标(Target IP 和端口)。
生产环境避坑指南
  1. 配置文件语法极度严格:YAML 文件对空格缩进非常敏感。修改完 prometheus.yml 后,务必先用 promtool check config prometheus.yml 检查语法,确认无误后再重启服务,避免因多了一个空格导致整个监控系统崩溃。
  2. 数据目录隔离:在生产环境中,强烈建议将 data/ 目录挂载到独立的、高性能的 SSD 数据盘上,而不是和操作系统挤在同一块系统盘里,以防止监控数据写满导致系统死机。

七、第一个监控目标:监控 Prometheus 自身#

不管是哪种部署方式,现在你的 Prometheus 已经跑起来了。接下来,我们来把玩一下自带的 Web UI。

7.1 默认 self-scrape 任务的含义#

前面提到,prometheus.yml 里的默认配置让它抓取了自己。 在浏览器地址栏输入:http://<你的服务器IP>:9090/metrics,你会看到满屏幕密密麻麻的文本。 这就是传说中的 Prometheus 暴露格式。每一行都是一个监控指标,Prometheus Server 正是每隔 15 秒来这个页面,把这些文本拉走并存进本地数据库的。

7.2 Web UI 界面功能分区介绍#

回到主界面 http://<你的服务器IP>:9090:

  • 顶部导航栏:最核心的是 Alerts(告警规则)、Graph(图形化查询)、Status(状态管理)。
  • Expression 查询输入框:这里是输入 PromQL(查询语言)的地方。
  • Execute 按钮:执行查询。
  • Table / Graph 切换卡:Table 用于看当前最新时刻的具体数值,Graph 用于看历史趋势曲线。

7.3 第一次查询监控指标#

在 Expression 搜索框中输入: prometheus_build_info 然后点击 Execute。

在下方的 Table 视图中,你会看到类似这样的一行数据: prometheus_build_info{branch="HEAD", goversion="go1.20.5", revision="...", version="2.45.0"} 1

解读:

  • prometheus_build_info:指标名。
  • {} 里面的内容:这就是 标签(Label)。它告诉你当前编译的版本、Go 语言版本等细节。
  • 最后的 1:这是当前指标的值。

7.4 看懂 Graph 曲线图#

让我们查一个动态变化的值。在搜索框输入: process_resident_memory_bytes (这是查询 Prometheus 进程占用的物理内存字节数)

点击 Execute,然后切换到 Graph 选项卡。 你会看到一条随着时间波动的折线图。

  • 横坐标:时间轴(可以通过左上角的 - + 调整查看最近 1 小时或 1 天的趋势)。
  • 纵坐标:内存大小(字节)。鼠标悬停在曲线上,能看到精确到秒的具体数值。

7.5 Status 页面实用功能#

点击顶部导航栏的 Status 下拉菜单:

  1. Targets(目标面板):这是你以后每天都要看的地方! 这里列出了所有正在抓取的目标。如果状态显示绿色的 UP,说明拉取正常;如果显示红色的 DOWN,说明那个小弟挂了,或者网络不通。
  2. Configuration(配置面板):在这里可以直接查看当前内存中生效的 prometheus.yml 全文,非常适合排查“我明明改了配置为什么没生效”(通常是因为忘了重启服务)。
  3. Runtime & Build Information:查看当前数据库里存了多少数据块、系统启动了多长时间等运行状态。

八、本篇小结#

8.1 本篇核心知识点复盘清单#

恭喜你完成了 Prometheus 的初体验!回顾一下今天的收获:

  1. 理解了监控的核心价值:事前预警、事中定位、事后复盘。
  2. 掌握了 Prometheus 的核心架构(Pull 模式)与五大基础术语(时序数据、指标、标签、Exporter、实例)。
  3. 成功使用二进制或 Docker 方式在单机完成了 Prometheus 的部署与启动。
  4. 掌握了 Prometheus 核心配置文件(prometheus.yml)与底层目录结构的作用。
  5. 跑通了默认的 self-scrape 自身监控流程,并学会了使用内置 Web UI 查看基础指标和曲线图。

8.2 新手入门高频踩坑点快速自查#

遇到问题别慌,对照这里排查:

  • 浏览器打不开 9090 页面:
    • 检查服务是否真的启动(systemctl status prometheus 或 docker ps)。
    • 99% 的原因是云服务器安全组没开放 9090 端口。
  • 启动报错 address already in use:
    • 9090 端口被其他程序占用了,用 netstat -tulpn | grep 9090 揪出凶手并 kill 掉它。
  • 修改了 prometheus.yml 但界面上 Configuration 没变化:
    • 二进制部署记得执行 systemctl restart prometheus。
    • Docker 部署记得执行 docker restart prometheus。

下一篇预告:单机跑起来只是第一步。在下一篇文章中,我们将手把手教你安装部署最经典的 Node Exporter,把 Linux 服务器的 CPU、内存、磁盘监控起来,并接入酷炫的 Grafana 仪表盘!敬请期待。

Prometheus (1):从零认识 Prometheus 与单机快速上手
https://www.6ixblog.site/posts/prometheus-1/
作者
Licwic
发布于
2026-08-11
许可协议
CC BY-NC-SA 4.0