文章目录
- [Prometheus 监控系统详解与实战部署](#Prometheus 监控系统详解与实战部署)
-
- [一、Prometheus 概述](#一、Prometheus 概述)
- 二、TSDB:为监控场景量身定制的存储引擎
- [三、Prometheus 核心特点](#三、Prometheus 核心特点)
- [四、Prometheus 生态组件](#四、Prometheus 生态组件)
-
- [常用 Exporters 介绍](#常用 Exporters 介绍)
- [五、Prometheus 工作机制](#五、Prometheus 工作机制)
- [六、Prometheus 局限性](#六、Prometheus 局限性)
- [七、实战部署:从 0 到 1 搭建 Prometheus 监控系统](#七、实战部署:从 0 到 1 搭建 Prometheus 监控系统)
-
- [1. 部署 Prometheus Server](#1. 部署 Prometheus Server)
- [2. 部署 Exporters 监控各类目标](#2. 部署 Exporters 监控各类目标)
- [3. 部署 Grafana 实现可视化](#3. 部署 Grafana 实现可视化)
- [4. 服务发现配置](#4. 服务发现配置)
-
- (1)基于文件的服务发现
- [(2)基于 Consul 的服务发现](#(2)基于 Consul 的服务发现)
- 八、总结
Prometheus 监控系统详解与实战部署
一、Prometheus 概述
Prometheus 是一款开源的服务监控系统与时序数据库,以其灵活的数据模型、高效的采集机制和强大的查询能力被广泛应用于云原生、微服务等场景。其核心功能是通过周期性拉取(Pull)方式采集监控数据,存储于内置的时序数据库(TSDB)中,并支持基于规则的告警和丰富的可视化展示。
二、TSDB:为监控场景量身定制的存储引擎
Prometheus 采用 TSDB 作为存储引擎,完美适配监控数据的特性:
- 高写入量:监控数据几乎是持续的顺序写入;
- 低更新需求:数据采集后极少更新,几秒到几分钟内完成写入;
- 区块删除为主:通常按时间范围批量删除历史数据,而非随机删除;
- 大存储量:数据量常超过内存,缓存作用有限;
- 顺序读写:读操作多为按时间升序/降序的连续查询,且并发读频繁。
三、Prometheus 核心特点
- 多维数据模型:通过"度量名称+键值对"标识时间序列数据,支持灵活的维度分析;
- 内置 TSDB:默认存储15天数据,也可对接 InfluxDB、OpenTSDB 等远端存储;
- PromQL 查询语言:专为时序数据设计,支持复杂的聚合、过滤和计算;
- Pull 采集模式:基于 HTTP 协议主动拉取目标数据,也可通过 Pushgateway 支持 Push 模式;
- 动态服务发现:支持静态配置、文件、DNS、Kubernetes 等多种服务发现机制;
- 丰富的生态集成:可作为数据源接入 Grafana 实现可视化。
四、Prometheus 生态组件
Prometheus 核心功能由多个组件协同完成,部分组件为可选:
组件 | 功能说明 |
---|---|
Prometheus Server | 核心组件,负责数据采集(Retrieval)、存储(Storage)和查询(PromQL),并基于规则生成告警 |
Client Library | 客户端库,用于应用程序内置监控指标采集能力 |
Exporters | 指标暴露器,为不支持内置监控的应用提供数据采集接口(如 Node-Exporter 监控服务器,mysqld-exporter 监控 MySQL) |
Service Discovery | 服务发现,动态识别待监控目标(支持文件、K8s 等多种机制) |
Alertmanager | 告警管理,接收 Prometheus 告警并进行去重、分组、路由(如邮件、钉钉通知) |
Pushgateway | 数据中转站,接收短期任务的 Push 数据,供 Prometheus 拉取 |
Grafana | 可视化工具,对接 Prometheus 数据源生成监控面板 |
常用 Exporters 介绍
- Node-Exporter:采集服务器 CPU、内存、磁盘、网络等物理指标;
- mysqld-exporter/nginx-exporter:分别监控 MySQL 数据库和 Nginx 服务;
- Kube-State-Metrics:采集 Kubernetes 资源(Pod、Deployment 等)的状态指标;
- cAdvisor:监控容器的 CPU、内存、网络等资源使用情况;
- blackbox-exporter:监控业务容器的存活性。
五、Prometheus 工作机制
工作模式
- Prometheus Server 通过服务发现或静态配置获取监控目标(Target);
- 从目标的 Exporter 接口拉取指标数据,或通过 Pushgateway 拉取短期任务数据;
- 数据存储于 TSDB,支持通过 PromQL 查询;
- 基于告警规则生成告警,发送至 Alertmanager 处理;
- Grafana 对接 Prometheus 实现数据可视化。
工作流程
- 数据采集:Prometheus 以 Pull 方式从目标拉取数据,或通过 Pushgateway 接收 Push 数据;
- 数据存储:采集的时序数据写入本地 TSDB;
- 告警生成:基于配置的告警规则,触发告警并发送至 Alertmanager;
- 告警分发:Alertmanager 将告警路由到邮件、钉钉等接收方;
- 数据查询与展示:通过 Prometheus Web UI(PromQL)或 Grafana 查看监控数据。
六、Prometheus 局限性
- 非全量监控:专注于指标监控,不适合存储事件或日志,更侧重趋势分析而非精准数据;
- 本地存储有限:默认仅保存15天数据,长期存储需依赖远端存储(如 InfluxDB);
- 集群成熟度低:原生集群机制较弱,需通过 Thanos 或 Cortex 实现高可用与联邦集群。
七、实战部署:从 0 到 1 搭建 Prometheus 监控系统
1. 部署 Prometheus Server
步骤1:安装与配置
bash
# 关闭防火墙与SELinux
systemctl stop firewalld
setenforce 0
# 解压安装包
cd /opt
tar xf prometheus-2.35.0.linux-amd64.tar.gz
mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
步骤2:配置启动服务
创建系统服务文件:
bash
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
步骤3:启动并验证
bash
systemctl start prometheus
systemctl enable prometheus
# 验证端口(默认9090)
netstat -natp | grep :9090
访问 Web UI:http://IP:9090
,通过 Status -> Targets 查看监控目标状态。
2. 部署 Exporters 监控各类目标
(1)Node Exporter:监控服务器指标
安装与配置
bash
# 解压并部署二进制文件
cd /opt
tar xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin
# 创建系统服务
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl start node_exporter
systemctl enable node_exporter
接入 Prometheus
修改 Prometheus 配置文件 prometheus.yml
,添加监控目标:
yaml
scrape_configs:
- job_name: nodes
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.10.80:9100 # 替换为实际节点IP
- 192.168.10.13:9100
labels:
service: kubernetes
重载配置:
bash
curl -X POST http://192.168.10.80:9090/-/reload
(2)mysqld-exporter:监控 MySQL
安装与配置
bash
# 部署二进制文件
cd /opt
tar xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/
# 配置 MySQL 权限(在MySQL服务器执行)
mysql -uroot -p
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
flush privileges;
# 修改 MySQL 配置文件
vim /etc/my.cnf
[client]
host=localhost
user=exporter
password=abc123
# 创建系统服务
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl start mysqld_exporter
systemctl enable mysqld_exporter
接入 Prometheus
修改 prometheus.yml
添加 MySQL 监控:
yaml
scrape_configs:
- job_name: mysqld
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.10.14:9104 # MySQL服务器IP:端口
labels:
service: mysqld
重载配置生效。
3. 部署 Grafana 实现可视化
步骤1:安装与启动
bash
# 安装Grafana(以7.4.0为例)
yum install -y grafana-7.4.0-1.x86_64.rpm
# 启动服务
systemctl start grafana-server
systemctl enable grafana-server
# 验证端口(默认3000)
netstat -natp | grep :3000
步骤2:配置数据源
- 访问 Grafana 界面:
http://IP:3000
,默认账号密码admin/admin
; - 进入 Configuration -> Data Sources -> Add data source,选择 Prometheus;
- 填写 Prometheus 地址(如
http://192.168.10.80:9090
),点击 Save & Test。
步骤3:导入监控面板
- 访问 Grafana 面板库,搜索适合的面板(如 Node Exporter 面板 ID:1860);
- 在 Grafana 中点击 + Create -> Import,输入面板 ID 并加载,即可查看可视化监控数据。
4. 服务发现配置
Prometheus 支持动态发现监控目标,避免静态配置的繁琐,常用方式如下:
(1)基于文件的服务发现
通过 YAML/JSON 文件定义目标,Prometheus 定期加载:
bash
# 创建目标配置文件目录
mkdir /usr/local/prometheus/targets
# 定义节点监控目标
vim targets/node-exporter.yaml
- targets:
- 192.168.10.80:9100
- 192.168.10.14:9100
labels:
app: node-exporter
job: node
修改 Prometheus 配置:
yaml
scrape_configs:
- job_name: nodes
file_sd_configs:
- files:
- targets/node*.yaml # 支持通配符
refresh_interval: 2m # 每2分钟刷新
(2)基于 Consul 的服务发现
Consul 提供服务注册与健康检查,Prometheus 可通过 Consul 动态发现目标:
- 部署 Consul 并启动服务;
- 在 Consul 中注册监控目标(如 Node Exporter);
- 配置 Prometheus 对接 Consul:
yaml
scrape_configs:
- job_name: nodes
consul_sd_configs:
- server: 192.168.10.80:8500 # Consul地址
tags: ["nodes"] # 过滤标签
refresh_interval: 2m
八、总结
Prometheus 凭借其灵活的采集机制、强大的查询能力和丰富的生态,成为云原生监控的首选方案。通过本文的部署实践,可快速搭建一套涵盖服务器、数据库、中间件的全方位监控系统。结合 Grafana 的可视化和 Alertmanager 的告警能力,能有效提升系统的可观测性,及时发现并解决问题。
如需进一步扩展,可探索 Kubernetes 服务发现、远端存储集成或 Prometheus 联邦集群等高级特性。
GitHub 地址:https://github.com/prometheus