Prometheus监控系统

文章目录

Prometheus 监控系统详解与实战部署

一、Prometheus 概述

Prometheus 是一款开源的服务监控系统与时序数据库,以其灵活的数据模型、高效的采集机制和强大的查询能力被广泛应用于云原生、微服务等场景。其核心功能是通过周期性拉取(Pull)方式采集监控数据,存储于内置的时序数据库(TSDB)中,并支持基于规则的告警和丰富的可视化展示。

二、TSDB:为监控场景量身定制的存储引擎

Prometheus 采用 TSDB 作为存储引擎,完美适配监控数据的特性:

  • 高写入量:监控数据几乎是持续的顺序写入;
  • 低更新需求:数据采集后极少更新,几秒到几分钟内完成写入;
  • 区块删除为主:通常按时间范围批量删除历史数据,而非随机删除;
  • 大存储量:数据量常超过内存,缓存作用有限;
  • 顺序读写:读操作多为按时间升序/降序的连续查询,且并发读频繁。

三、Prometheus 核心特点

  1. 多维数据模型:通过"度量名称+键值对"标识时间序列数据,支持灵活的维度分析;
  2. 内置 TSDB:默认存储15天数据,也可对接 InfluxDB、OpenTSDB 等远端存储;
  3. PromQL 查询语言:专为时序数据设计,支持复杂的聚合、过滤和计算;
  4. Pull 采集模式:基于 HTTP 协议主动拉取目标数据,也可通过 Pushgateway 支持 Push 模式;
  5. 动态服务发现:支持静态配置、文件、DNS、Kubernetes 等多种服务发现机制;
  6. 丰富的生态集成:可作为数据源接入 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 工作机制

工作模式

  1. Prometheus Server 通过服务发现或静态配置获取监控目标(Target);
  2. 从目标的 Exporter 接口拉取指标数据,或通过 Pushgateway 拉取短期任务数据;
  3. 数据存储于 TSDB,支持通过 PromQL 查询;
  4. 基于告警规则生成告警,发送至 Alertmanager 处理;
  5. Grafana 对接 Prometheus 实现数据可视化。

工作流程

  1. 数据采集:Prometheus 以 Pull 方式从目标拉取数据,或通过 Pushgateway 接收 Push 数据;
  2. 数据存储:采集的时序数据写入本地 TSDB;
  3. 告警生成:基于配置的告警规则,触发告警并发送至 Alertmanager;
  4. 告警分发:Alertmanager 将告警路由到邮件、钉钉等接收方;
  5. 数据查询与展示:通过 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:配置数据源
  1. 访问 Grafana 界面:http://IP:3000,默认账号密码 admin/admin
  2. 进入 Configuration -> Data Sources -> Add data source,选择 Prometheus;
  3. 填写 Prometheus 地址(如 http://192.168.10.80:9090),点击 Save & Test
步骤3:导入监控面板
  1. 访问 Grafana 面板库,搜索适合的面板(如 Node Exporter 面板 ID:1860);
  2. 在 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 动态发现目标:

  1. 部署 Consul 并启动服务;
  2. 在 Consul 中注册监控目标(如 Node Exporter);
  3. 配置 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 联邦集群等高级特性。

官网地址:https://prometheus.io

GitHub 地址:https://github.com/prometheus

相关推荐
野奔在山外的猫17 小时前
【文档】配置 prometheus-webhook-dingtalk + alertmanager 细节
prometheus·webhook·dingtalk
m0_736927045 天前
从被动救火到主动预警,用 Prometheus + Alertmanager 跑通告警闭环
prometheus
Jabes.yang6 天前
Java求职面试: 互联网医疗场景中的缓存技术与监控运维应用
java·redis·spring security·grafana·prometheus·oauth2·互联网医疗
川石课堂软件测试6 天前
自动化测试之 Cucumber 工具
数据库·功能测试·网络协议·测试工具·mysql·单元测试·prometheus
K_i1346 天前
负载均衡:运维高可用的核心技术
负载均衡·grafana·prometheus
爱技术的小伙子7 天前
【Linux运维】 Prometheus + Grafana + Alertmanager 监控系统部署指南(CentOS & Ubuntu 通用版)
linux·运维·prometheus
川石课堂软件测试7 天前
MySQL数据库之DBA命令
数据库·网络协议·mysql·http·单元测试·prometheus·dba
神秘人X7077 天前
Docker监控:cAdvisor+Prometheus+Grafana实战指南
docker·grafana·prometheus
有谁看见我的剑了?8 天前
Prometheus pushgateway学习
学习·prometheus