第一篇:从零认识 Prometheus 与单机快速上手
监控是运维的眼睛,也是保障系统稳定运行的基石。在云原生时代,Prometheus 已经成为事实上的监控标准。本篇文章专为“零基础”新手打造,我们将摒弃晦涩难懂的学术概念,用最接地气的大白话,带你彻底搞懂 Prometheus 的核心逻辑,并手把手完成单机环境的极速部署。
一、开篇:运维入门,为什么一定要先学会监控
很多新手在学习服务器运维时,往往一上来就去折腾集群、高可用、负载均衡,却忽视了最基础的监控体系。
1.1 没有监控的真实窘境:故障全靠用户上报、排查全靠经验盲猜
想象一下这个场景:你的应用突然变卡,甚至页面打不开。如果没有监控系统:
- 发现问题:往往是客户发来投诉截图,“你们的网站怎么挂了?”,你才知道出事了。
- 排查问题:你只能慌忙 SSH 登录服务器,疯狂敲
top、free、df -h,去翻看海量的业务日志。这不仅效率低下,而且如果服务已经因为 OOM(内存溢出)被内核强杀,你甚至连“犯罪现场”都找不到。
1.2 一套完整监控系统的核心价值
一个优秀的监控系统,就像是医院的 ICU 监护仪,它的核心价值可以概括为三个阶段:
- 事前预警:在磁盘即将写满、内存占用飙升到 90% 时提前给你发微信或钉钉告警,让你有充裕的时间介入处理。
- 事中定位:故障发生时,通过可视化的历史趋势图,一秒定位是网络带宽跑满、还是数据库连接数耗尽导致的崩溃。
- 事后复盘:保留故障发生前后的所有性能指标切片,为事后的故障复盘报告提供不可辩驳的数据支撑。
1.3 新手选型解惑:为什么优先学 Prometheus 而非 Zabbix
老牌监控王者 Zabbix 和当红炸子鸡 Prometheus 经常被拿来比较。作为新手,为什么我强烈建议你先学 Prometheus?
为什么选择 Prometheus?
- 架构轻量化:Zabbix 依赖关系型数据库(如 MySQL),部署沉重;Prometheus 自带轻量级时序数据库(TSDB),单机就能轻松扛住百万级指标。
- 云原生友好:它是 Kubernetes 官方推荐的监控方案,与 K8s 生态深度绑定,学好了它,后续进阶云原生事半功倍。
- 生态组件丰富:万物皆可 Exporter。不管是 Linux、MySQL、Redis,还是你的 Java/Go 业务代码,都有现成的接入方案。
- 入门学习曲线平缓:配置全部基于直观的 YAML 文件,无需在复杂的 Web 界面里层层点击找配置。
二、小白友好版:Prometheus 核心概念扫盲
2.1 Prometheus 到底是什么
不要把 Prometheus 仅仅当成一个“数据库”。它其实是一整套一站式的监控告警解决方案。它不仅负责把数据存下来(时序数据库),还负责主动去各大应用那里“拉取”数据,同时自带了一套非常强大的查询语言(PromQL),并且无缝对接告警组件。
2.2 一张图看懂核心架构
虽然我们这里没有画图,但你可以这样在脑海中构建它的运转模型:
- Prometheus Server(主服务):监控系统的“大脑”,负责定时向各个目标拉取数据,并把数据存在本地磁盘。
- Exporter(数据采集器):安装在被监控节点上的“小弟”,负责把系统的各类指标暴露出来给主服务抓取。
- Alertmanager(告警组件):负责当数据触发设定的阈值时,向你的邮箱或钉钉发送报警信息。
- Grafana(可视化组件):好马配好鞍,负责把 Prometheus 里冷冰冰的数据画成极其酷炫的图表大屏。
2.3 必须吃透的 5 个基础术语(大白话讲解)
为了后续学习不迷路,这五个核心概念必须拿下:
-
时序数据(Time Series Data) 和 MySQL 这种关系型数据库里一条条独立的用户记录不同,时序数据就是**“带有时间戳的数值”**。比如:
10:00 CPU使用率 45%,10:01 CPU使用率 48%。它记录的是一个事物随时间变化的轨迹。 -
指标(Metric)与标签(Label)
- 指标(Metric):代表你要监控的具体事物,比如
http_requests_total(HTTP 请求总数)。 - 标签(Label):给指标加的“筛选维度”。比如同样是请求总数,我们可以打上
method="GET"或status="200"的标签。这样你就能轻松过滤出“所有返回 200 的 GET 请求”。
- 指标(Metric):代表你要监控的具体事物,比如
-
Pull(拉取)模式 vs Push(推送)模式 传统监控(如 Zabbix 常用)多为 Push 模式:客户端主动向监控中心汇报数据(“大哥,这是我今天的数据,请查收”)。 Prometheus 采用的是 Pull 拉取模式:主服务根据配置表,定时主动去各个节点拉数据(“小弟们,把数据准备好,我每 15 秒来拿一次”)。 优势:Pull 模式极大降低了客户端的压力,且主服务端更容易掌控抓取频率,不会被海量客户端的推送打垮。
-
Exporter(翻译官) Prometheus 只认识特定格式的数据(Prometheus 格式)。但 MySQL、Nginx 它们自己不懂这种格式。Exporter 就是中间的翻译官,它去读取 MySQL 的状态,然后翻译成 Prometheus 认识的格式,暴露在一个 HTTP 接口(通常是
/metrics)上等待拉取。 -
实例(Instance)与任务(Job)
- 实例(Instance):一个暴露了
/metrics接口的具体监控目标(比如一台 IP 为192.168.1.10:9100的服务器)。 - 任务(Job):一组具有相同目的的实例的集合(比如 10 台 Web 服务器组成了一个名为
web-cluster的 Job)。
- 实例(Instance):一个暴露了
三、环境准备与安装方式选型
3.1 实验环境说明
Prometheus 使用 Go 语言编写,编译后就是一个独立的二进制文件,极其轻量。
- 推荐系统:CentOS 7+ / Ubuntu 18.04+ 等主流 Linux 发行版均可。
- 硬件配置:极低!1核 2G 内存的云服务器或者虚拟机就足以跑通本教程的所有实验。
- 前置要求:掌握基础的 Linux 目录操作、文件编辑(vim)及解压命令即可。
3.2 两种主流安装方式对比与选型建议
我们将为你提供两种部署方案,你可以任选其一:
- 二进制包部署(方式一):
- 特点:最纯粹、最底层。你需要手动创建目录、编写 systemd 守护进程。
- 建议:如果你是想深入学习、或者要在传统物理机生产环境部署,强烈建议走一遍二进制安装,这能帮你彻底搞懂它的文件结构。
- 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.gz4.2 规范运维目录规划
生产环境中,乱放文件是大忌。我们来建立一套规范的目录结构:
# 创建程序目录、配置目录和数据目录sudo mkdir -p /usr/local/prometheussudo mkdir -p /etc/prometheussudo mkdir -p /var/lib/prometheus
# 移动二进制文件到程序目录cd prometheus-2.45.0.linux-amd64sudo 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 prometheussudo chown -R prometheus:prometheus /usr/local/prometheus /etc/prometheus /var/lib/prometheus4.3 初识 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 服务脚本。
sudo vim /etc/systemd/system/prometheus.service填入以下内容:
[Unit]Description=Prometheus ServerDocumentation=https://prometheus.io/docs/introduction/overview/After=network.target
[Service]User=prometheusGroup=prometheusRestart=on-failureExecStart=/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 prometheus4.6 防火墙与端口放行
Prometheus 默认监听 TCP 9090 端口提供 Web UI。你需要确保防火墙放行了该端口:
# 如果你使用的是 firewalld (CentOS)sudo firewall-cmd --zone=public --add-port=9090/tcp --permanentsudo 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 -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.ymlglobal: scrape_interval: 15s
scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"]EOF
# 修改数据目录权限,确保容器内 nobody 用户有权写入 (UID 65534)chmod 777 /opt/prometheus/data5.3 容器启动命令逐行详解
使用如下命令一键拉起 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 部署常用运维命令
日常运维只需这几个命令:
# 重启服务(通常在修改了 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。它通常由四个主要区块构成:
global(全局配置):控制全局默认参数。比如scrape_interval(默认多长时间去小弟那里拉一次数据)。alerting(告警配置):告诉 Prometheus,当你发现异常数据时,要把报警信息发送给哪个Alertmanager实例。rule_files(规则文件配置):加载外部的规则文件路径,包括报警规则(Alerting rules)和预计算规则(Recording rules)。scrape_configs(抓取配置):这是你以后每天都要修改的区块。在这里配置抓取任务(Job),每个任务下面配置具体的抓取目标(Target IP 和端口)。
生产环境避坑指南
- 配置文件语法极度严格:YAML 文件对空格缩进非常敏感。修改完
prometheus.yml后,务必先用promtool check config prometheus.yml检查语法,确认无误后再重启服务,避免因多了一个空格导致整个监控系统崩溃。- 数据目录隔离:在生产环境中,强烈建议将
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 下拉菜单:
- Targets(目标面板):这是你以后每天都要看的地方! 这里列出了所有正在抓取的目标。如果状态显示绿色的
UP,说明拉取正常;如果显示红色的DOWN,说明那个小弟挂了,或者网络不通。 - Configuration(配置面板):在这里可以直接查看当前内存中生效的
prometheus.yml全文,非常适合排查“我明明改了配置为什么没生效”(通常是因为忘了重启服务)。 - Runtime & Build Information:查看当前数据库里存了多少数据块、系统启动了多长时间等运行状态。
八、本篇小结
8.1 本篇核心知识点复盘清单
恭喜你完成了 Prometheus 的初体验!回顾一下今天的收获:
- 理解了监控的核心价值:事前预警、事中定位、事后复盘。
- 掌握了 Prometheus 的核心架构(Pull 模式)与五大基础术语(时序数据、指标、标签、Exporter、实例)。
- 成功使用二进制或 Docker 方式在单机完成了 Prometheus 的部署与启动。
- 掌握了 Prometheus 核心配置文件(
prometheus.yml)与底层目录结构的作用。 - 跑通了默认的
self-scrape自身监控流程,并学会了使用内置 Web UI 查看基础指标和曲线图。
8.2 新手入门高频踩坑点快速自查
遇到问题别慌,对照这里排查:
- 浏览器打不开 9090 页面:
- 检查服务是否真的启动(
systemctl status prometheus或docker ps)。 - 99% 的原因是云服务器安全组没开放 9090 端口。
- 检查服务是否真的启动(
- 启动报错
address already in use:- 9090 端口被其他程序占用了,用
netstat -tulpn | grep 9090揪出凶手并kill掉它。
- 9090 端口被其他程序占用了,用
- 修改了 prometheus.yml 但界面上 Configuration 没变化:
- 二进制部署记得执行
systemctl restart prometheus。 - Docker 部署记得执行
docker restart prometheus。
- 二进制部署记得执行
下一篇预告:单机跑起来只是第一步。在下一篇文章中,我们将手把手教你安装部署最经典的
Node Exporter,把 Linux 服务器的 CPU、内存、磁盘监控起来,并接入酷炫的 Grafana 仪表盘!敬请期待。