当前位置: 首页 > news >正文

Prometheus 监控系统详解

Prometheus 监控系统详解:从原理到实战

前言

在云原生与微服务快速发展的背景下,一套高效、灵活的监控系统成为保障业务稳定运行的核心基础设施。Prometheus 作为开源监控领域的标杆,凭借其多维数据模型、时序数据高效存储及丰富的生态组件,已成为容器化环境与分布式系统监控的首选方案。本文将从核心原理、生态组件、部署实战到高级配置,全面解析 Prometheus 监控系统。

一、Prometheus 核心原理

1.1 什么是 Prometheus?

Prometheus 是一款开源的时序数据库服务监控系统,由 SoundCloud 于 2012 年开发,2016 年加入 CNCF(云原生计算基金会),目前已成为云原生监控的事实标准。

其核心能力包括:

  • 基于 HTTP 的 pull 模式采集时序数据
  • 灵活的多维数据模型(指标名 + 键值对标签)
  • 强大的查询语言 PromQL
  • 内置时序数据库(TSDB)
  • 动态服务发现与静态配置结合
  • 原生支持告警与可视化集成

1.2 时序数据与 TSDB

监控数据的核心是时序数据(Time Series Data)—— 按时间顺序记录的系统/服务状态变化(如 CPU 使用率、接口响应时间)。Prometheus 内置的 TSDB(时序数据库)专为监控场景设计,具备以下特性:

特性说明
高写入性能每秒可处理百万级样本写入,适配监控高频采集场景
顺序写入为主数据按时间递增写入,避免随机 IO 损耗
按时间块存储数据按时间分片(默认 2 小时/块),便于批量删除
自动过期清理支持数据保留周期配置(默认 15 天)
压缩存储对重复标签、时序数据进行特殊压缩,节省磁盘空间

1.3 核心工作流程

在这里插入图片描述

  1. 数据采集:Prometheus Server 通过静态配置或服务发现识别监控目标(Target),定期从目标的 Exporter 接口(默认 /metrics)拉取(pull)数据;短期任务通过 Pushgateway 推送数据,再由 Server 拉取。

  2. 数据存储:采集的时序数据存储到内置 TSDB,按时间序列(Metric + Labels)索引。

  3. 数据查询:通过 PromQL 对存储的时序数据进行过滤、聚合、计算(如计算 5 分钟内的 CPU 平均使用率)。

  4. 告警触发:Prometheus Server 定期评估告警规则,当指标满足告警条件时,发送告警到 Alertmanager。

  5. 告警处理:Alertmanager 对告警进行去重、分组、路由,最终发送到邮件、钉钉等接收端。

  6. 可视化展示:通过 Grafana 对接 Prometheus 数据源,以图表形式展示监控数据。

二、Prometheus 生态组件

Prometheus 核心仅负责数据采集与存储,完整的监控体系需结合以下生态组件:

组件作用核心功能
Prometheus Server核心组件数据采集、存储、PromQL 查询、告警规则评估
Exporters指标暴露工具收集第三方服务(如 MySQL、Nginx)指标,转换为 Prometheus 格式并通过 HTTP 暴露
Alertmanager告警管理工具告警去重、分组、路由、抑制,支持多渠道通知
Pushgateway数据推送中转站接收短期任务的推送数据,供 Prometheus 拉取
Client Libraries应用埋点库为开发语言(Go、Java 等)提供原生指标采集接口
Grafana可视化平台对接 Prometheus 数据源,生成仪表盘与图表
Service Discovery服务发现机制动态识别监控目标(支持 Kubernetes、Consul 等)

2.1 常用 Exporters 介绍

Exporters 是连接 Prometheus 与被监控对象的桥梁,常见类型:

  • Node Exporter:监控服务器硬件与系统指标(CPU、内存、磁盘、网络等),是基础设施监控的必备组件。
  • mysqld_exporter:采集 MySQL 数据库指标(连接数、查询效率、锁状态等)。
  • nginx-vts-exporter:基于 Nginx 的 vts 模块,采集 Nginx 流量、请求量、响应时间等。
  • kube-state-metrics:监控 Kubernetes 资源对象(Pod、Deployment 等)的状态指标(副本数、重启次数等)。
  • cAdvisor:监控容器资源使用(CPU、内存、磁盘 IO 等),常与 Kubernetes 集成。
  • blackbox_exporter:监控网络端点可用性(HTTP 状态码、ICMP 连通性、TCP 端口存活等)。

三、Prometheus 部署实战

3.1 环境准备

  • 操作系统:CentOS 7.x(或 Ubuntu 20.04+)
  • 依赖:wgettarsystemd(用于服务管理)
  • 关闭防火墙或开放必要端口(Prometheus 9090、Node Exporter 9100 等)
# 关闭防火墙与 SELinux(测试环境,生产环境建议配置规则)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3.2 Prometheus Server 部署

步骤 1:下载并安装
# 下载安装包(版本可替换为最新稳定版)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz# 解压并移动到安装目录
tar xf prometheus-2.45.0.linux-amd64.tar.gz
mv prometheus-2.45.0.linux-amd64 /usr/local/prometheus# 创建数据目录(必须手动创建,否则启动失败)
mkdir -p /usr/local/prometheus/data
步骤 2:配置文件解析(prometheus.yml)

核心配置文件结构:

global:                  # 全局配置scrape_interval: 15s   # 采集间隔(默认 15 秒)evaluation_interval: 15s  # 告警规则评估间隔scrape_timeout: 10s    # 采集超时时间alerting:                # Alertmanager 配置alertmanagers:- static_configs:- targets: ["192.168.10.80:9093"]  # Alertmanager 地址rule_files:              # 告警规则文件路径- "rules/*.yml"        # 规则文件存放目录scrape_configs:          # 采集目标配置- job_name: "prometheus"  # 任务名称(会作为标签添加到指标)static_configs:- targets: ["localhost:9090"]  # 监控自身
步骤 3:配置系统服务
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=30d \  # 数据保留 30 天(默认 15 天)--web.enable-lifecycle          # 启用配置热重载(通过 HTTP POST 触发)
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
User=root  # 生产环境建议使用专用用户(如 prometheus)[Install]
WantedBy=multi-user.target
EOF
步骤 4:启动并验证
# 启动服务
systemctl daemon-reload
systemctl start prometheus && systemctl enable prometheus# 验证端口(默认 9090)
netstat -natp | grep :9090  # 输出包含 prometheus 进程即正常# 访问 Web UI

浏览器访问 http://<服务器IP>:9090,通过 Status -> Targets 查看监控目标状态(UP 表示正常)。

3.3 常用 Exporters 部署

3.3.1 Node Exporter(监控服务器)
# 下载安装
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xf node_exporter-1.6.1.linux-amd64.tar.gz
mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/# 配置系统服务
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target[Service]
Type=simple
# 启用常用采集器(NTP、系统服务、TCP 连接等)
ExecStart=/usr/local/bin/node_exporter \--collector.ntp \--collector.systemd \--collector.tcpstat \--collector.mountstats
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 启动并验证
systemctl start node_exporter && systemctl enable node_exporter
netstat -natp | grep :9100  # 默认端口 9100

接入 Prometheus:在 prometheus.ymlscrape_configs 中添加:

- job_name: "nodes"static_configs:- targets:- "192.168.10.80:9100"  # 服务器1- "192.168.10.81:9100"  # 服务器2labels:env: "production"  # 自定义标签(用于区分环境)

执行 curl -X POST http://localhost:9090/-/reload 热重载配置。

3.3.2 mysqld_exporter(监控 MySQL)
# 下载安装
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gz
tar xf mysqld_exporter-0.15.0.linux-amd64.tar.gz
mv mysqld_exporter-0.15.0.linux-amd64/mysqld_exporter /usr/local/bin/# 配置 MySQL 权限(创建专用用户)
mysql -uroot -p
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'Exporter@123';
FLUSH PRIVILEGES;
EXIT;# 创建 exporter 配置文件(避免污染 MySQL 主配置)
cat > /etc/mysqld_exporter.cnf <<'EOF'
[client]
host=localhost
user=exporter
password=Exporter@123
EOF# 配置系统服务
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=MySQL Exporter
After=mysqld.service[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/mysqld_exporter.cnf
Restart=on-failure[Install]
WantedBy=multi-user.target
EOF# 启动并验证
systemctl start mysqld_exporter && systemctl enable mysqld_exporter
netstat -natp | grep :9104  # 默认端口 9104

接入 Prometheus:在 prometheus.yml 中添加:

- job_name: "mysql"static_configs:- targets: ["192.168.10.80:9104"]  # MySQL 服务器地址

3.4 Grafana 部署与可视化

Grafana 是开源可视化平台,支持通过仪表盘展示 Prometheus 数据。

步骤 1:安装 Grafana
# 配置 Grafana 源(CentOS)
cat > /etc/yum.repos.d/grafana.repo <<'EOF'
[grafana]
name=grafana
baseurl=https://mirrors.aliyun.com/grafana/yum/rpm/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF# 安装并启动
yum install -y grafana
systemctl start grafana-server && systemctl enable grafana-server
netstat -natp | grep :3000  # 默认端口 3000
步骤 2:配置 Prometheus 数据源
  1. 浏览器访问 http://<IP>:3000,默认账号密码 admin/admin(首次登录需修改)。
  2. 点击 Configuration → Data Sources → Add data source,选择 Prometheus
  3. HTTP → URL 中输入 http://<Prometheus IP>:9090,点击 Save & Test(显示“Data source is working”即成功)。
步骤 3:导入仪表盘

Grafana 社区提供大量现成仪表盘,可直接导入:

  1. 访问 Grafana 仪表盘市场,搜索所需仪表盘(如 Node Exporter 对应 ID:1860,MySQL 对应 ID:7362)。
  2. 在 Grafana 中点击 + → Import,输入仪表盘 ID,选择 Prometheus 数据源,点击 Load 完成导入。

3.5 Alertmanager 部署与告警配置

Alertmanager 负责处理 Prometheus 发送的告警,支持多渠道通知。

步骤 1:安装 Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar xf alertmanager-0.25.0.linux-amd64.tar.gz
mv alertmanager-0.25.0.linux-amd64 /usr/local/alertmanager# 配置系统服务
cat > /usr/lib/systemd/system/alertmanager.service <<'EOF'
[Unit]
Description=Alertmanager
After=network.target[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \--config.file=/usr/local/alertmanager/alertmanager.yml \--storage.path=/usr/local/alertmanager/data
Restart=on-failure[Install]
WantedBy=multi-user.target
EOFsystemctl start alertmanager && systemctl enable alertmanager
步骤 2:配置告警规则(Prometheus 端)

在 Prometheus 目录创建规则文件 rules/node_rules.yml

groups:
- name: node-alertsrules:- alert: HighCPUUsage  # 告警名称expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80  # CPU 使用率 > 80%for: 2m  # 持续 2 分钟触发labels:severity: "critical"  # 告警级别annotations:summary: "高 CPU 使用率告警"description: "实例 {{ $labels.instance }} CPU 使用率超过 80%,当前值:{{ $value | humanizePercentage }}"

prometheus.yml 中引用规则文件:

rule_files:- "rules/*.yml"
步骤 3:配置 Alertmanager 路由(对接钉钉)

修改 alertmanager.yml

global:resolve_timeout: 5mroute:group_by: ['alertname']  # 按告警名称分组group_wait: 10s          # 组内等待时间group_interval: 10s      # 组间间隔时间repeat_interval: 1h      # 重复告警间隔receiver: 'dingtalk'     # 默认接收者receivers:
- name: 'dingtalk'webhook_configs:- url: 'http://<钉钉机器人Webhook地址>'  # 需提前创建钉钉机器人send_resolved: true  # 发送告警恢复通知

四、PromQL 入门与实战

PromQL 是 Prometheus 的查询语言,用于从时序数据中提取信息,支持过滤、聚合、时间范围查询等。

4.1 基本语法

  • 指标名 + 标签过滤node_cpu_seconds_total{mode="idle"}(筛选 idle 模式的 CPU 时间)
  • 时间范围node_memory_MemFree_bytes[5m](过去 5 分钟的内存空闲量)
  • 聚合函数sum(node_cpu_seconds_total) by (instance)(按实例汇总 CPU 时间)

4.2 常用查询示例

  1. CPU 使用率

    100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100)
    
  2. 内存使用率

    (1 - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes) * 100
    
  3. 磁盘使用率

    100 - (node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)
    
  4. MySQL 连接数

    mysql_connections
    

五、服务发现配置

在动态环境(如 Kubernetes、容器集群)中,静态配置监控目标难以维护,需通过服务发现动态管理。

5.1 基于文件的服务发现

通过 YAML/JSON 文件定义监控目标,Prometheus 定期读取文件更新目标列表:

# 创建目标配置目录
mkdir /usr/local/prometheus/targets# 定义节点目标(targets/nodes.yaml)
cat > /usr/local/prometheus/targets/nodes.yaml <<'EOF'
- targets:- "192.168.10.80:9100"- "192.168.10.81:9100"labels:env: "prod"
EOF# 在 prometheus.yml 中配置
scrape_configs:- job_name: "nodes-file-sd"file_sd_configs:- files: ["targets/nodes.yaml"]refresh_interval: 1m  # 1 分钟刷新一次

5.2 基于 Kubernetes 的服务发现

在 Kubernetes 集群中,Prometheus 可通过 API Server 动态发现 Pod、Node 等资源:

scrape_configs:- job_name: "k8s-pods"kubernetes_sd_configs:- api_server: "https://kubernetes.default.svc"  # 集群内 API 地址role: pod  # 发现 Pod 资源relabel_configs:  # 过滤需监控的 Pod(通过标签筛选)- source_labels: [__meta_kubernetes_pod_label_app]action: keepregex: "api-service"  # 仅保留 app=api-service 的 Pod

六、Prometheus 局限性与扩展方案

6.1 局限性

  • 本地存储有限:默认仅保留 15 天数据,不适合长期存储。
  • 原生高可用弱:单节点部署存在单点故障风险。
  • 不适合日志/事件存储:专注于指标监控,不适合存储非时序数据。

6.2 扩展方案

  • 长期存储:对接远端存储(如 Thanos、Cortex、InfluxDB)。
  • 高可用:通过 Thanos 实现 Prometheus 集群化,支持数据分片与联邦查询。
  • 多集群监控:使用 Prometheus Federation(联邦)实现跨集群数据聚合。

总结

Prometheus 凭借灵活的架构与丰富的生态,已成为云原生监控的核心工具。通过本文的部署实战与原理解析,可快速搭建从服务器、数据库到应用服务的全链路监控体系。在实际应用中,需结合业务场景优化采集频率、告警阈值,并通过 Thanos 等工具扩展其能力,以满足大规模、长期监控的需求。

如需进一步深入,建议参考官方文档与社区实践,持续优化监控策略。

http://www.dtcms.com/a/513935.html

相关文章:

  • 济南网站建设公司哪家好呼市做网站
  • 网站搭建和网站开发手机怎样建设网站
  • 郓城县网站建设抖音代运营公司经营范围
  • 手机建网站详细步骤百度seo推广方案
  • 做酒的网站网页链接怎么弄
  • 企业官方网站建设规划wordpress 在线点餐
  • 网站的网站建设wordpress写表格
  • 在线域名查询网站广州优化公司哪家好
  • 网站建设验收确认书无锡网站优化公司
  • 外贸网站优化在线推广地方网站有何作用
  • 北京云建站模板注册推广赚钱一个80元
  • WordPress外贸企业站主题动漫网站在线免费观看
  • 收费下载网站cms设计不错的网站
  • wordpress 进站插件开发者选项在哪里关闭
  • 学了lamp做网站就足够了吗湖北省建设规划网站
  • 担保网站建设保定网络营销网站
  • 网站建设店铺数据库做后台网站
  • 深圳市做网站前十强潍坊有哪些网站
  • 简要叙述如何规划建设一个企业网站南通市住房和城乡建设厅网站
  • 山东省建设厅网站多少自助建站网站公司
  • 郑州网站优化公司平台seo模拟点击
  • 湖州网站设计公司微慕wordpress插件
  • 教做潮男的网站WordPress编辑器加载慢
  • 企业网站维护报价简约网站设计欣赏
  • 肇庆 网站建设 域联如何在网站申请做co
  • 个人备案网站 论坛项目网站
  • 北京营销型网站建设爱站网自媒体数据
  • 怎么上传视频到公司网站安徽省建设工程专业技术资格评审标准条件
  • 做网站内嵌地图绵阳网站搜索排名
  • 未来做啥网站致富安阳网站公司