文章目录
Prometheus 监控系统
概述
- 定义:开源服务监控系统 & 时序数据库,提供通用数据模型、高效采集、存储和查询接口。
- 核心组件:Prometheus Server
- 数据采集:定期从静态配置或服务发现的目标中拉取数据(HTTP Pull,默认15秒/次)。
- 数据存储:内存暂存后持久化到磁盘(默认2小时回刷),支持WAL日志崩溃恢复。
- 告警处理:根据规则计算指标,触发告警后发送至Alertmanager。
- 数据源:
- Exporter:部署于被监控主机,暴露HTTP接口供Prometheus拉取指标。
- Pushgateway:接收短期任务主动推送的数据,供Prometheus拉取。
- 服务发现:支持静态配置或动态发现(如Kubernetes API集成)。
TSDB 存储引擎特点
- 适用场景:
- 海量时序数据存储,顺序写入为主。
- 数据按时间排序,极少更新。
- 块删除(按时间范围),非随机删除。
- 大体积数据,顺序读取为主,缓存效率低。
核心特点
- 多维数据模型:时间序列由指标名称 + 键值对标签标识。
- 内置时序数据库(TSDB):高效存储本地短期数据(默认15天)。
- PromQL查询语言:支持复杂多维查询。
- 混合采集模式:
- 默认HTTP Pull拉取。
- 通过Pushgateway支持Push模式。
- 动态服务发现:集成Kubernetes等系统,自动管理监控目标。
- 可视化集成:与Grafana无缝对接,提供仪表盘展示。
生态组件
组件 | 功能 |
---|---|
Prometheus Server | 核心组件,负责数据采集、存储、告警规则计算及PromQL查询。 |
Client Library | 为应用提供内置指标采集SDK(如Go、Java等语言支持)。 |
Exporters | 采集第三方系统指标并转换为Prometheus格式。常见Exporter: |
- Node Exporter:主机资源监控(CPU/内存/磁盘等)。 | |
- cAdvisor:容器资源监控。 | |
- kube-state-metrics:K8S资源对象状态监控(Pod/Deployment等)。 | |
- Blackbox Exporter:网络探测(HTTP/TCP/ICMP等)。 | |
Service Discovery | 动态发现监控目标(支持Kubernetes、Consul、DNS等)。 |
Alertmanager | 告警路由、去重、静默,支持邮件/钉钉/企业微信等通知渠道。 |
Pushgateway | 临时存储短期任务的推送数据,供Prometheus拉取。 |
Grafana | 可视化平台,集成Prometheus数据源,提供丰富的监控仪表盘。 |
工作流程
- 数据采集:Prometheus Server 基于服务发现或静态配置获取目标,并通过 exporter 拉取指标数据。
- 数据存储:采集到的数据通过 TSDB 存储到本地存储设备中。
- 告警生成:根据配置的告警规则,触发告警并发送到 Alertmanager。
- 告警通知:Alertmanager 发送告警通知到指定的接收方,如邮件、钉钉或企业微信。
- 数据查询:通过 Prometheus 自带的 Web UI 界面和 PromQL 查询语言查询监控数据。
- 数据可视化:Grafana 接入 Prometheus 数据源,将监控数据以图形化形式展示。
局限性
-
数据场景限制:适合指标监控,不适用于日志/事件存储。
-
长期存储:本地存储设计为短期保留,需借助InfluxDB等外部方案。
-
集群支持:原生集群机制不完善,可通过Thanos/Cortex实现高可用。
-
GitHub:github.com/prometheus
-
Node Exporter指标说明:链接
部署 Prometheus
1. Prometheus Server 部署
-
安装 Prometheus
- 上传并解压 Prometheus 安装包:
cd /opt/ tar xf prometheus-2.35.0.linux-amd64.tar.gz mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
- 配置文件
prometheus.yml
解析:global: scrape_interval: 15s # 数据采集间隔 evaluation_interval: 15s # 告警规则评估间隔 scrape_timeout: 10s # 数据采集超时时间 alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"]
- 上传并解压 Prometheus 安装包:
-
配置系统启动文件
- 创建
prometheus.service
: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.time=15d \ --web.enable-lifecycle ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF
- 创建
-
启动 Prometheus
systemctl start prometheus systemctl enable prometheus netstat -natp | grep :9090
- 访问
http://<Prometheus_IP>:9090
查看 Web UI。
- 访问
2. 部署 Exporters
-
Node Exporter(系统级监控)
- 安装 Node Exporter:
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
- 启动 Node Exporter:
systemctl start node_exporter systemctl enable node_exporter netstat -natp | grep :9100
- 修改 Prometheus 配置文件,添加 Node Exporter 目标:
- job_name: nodes metrics_path: "/metrics" static_configs: - targets: - 192.168.80.30:9100 - 192.168.80.11:9100 - 192.168.80.12:9100 labels: service: kubernetes
- 重新加载配置:
curl -X POST http://192.168.80.30:9090/-/reload
- 安装 Node Exporter:
-
MySQL Exporter
- 安装 MySQL Exporter:
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 用户权限:
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
- 启动 MySQL Exporter:
systemctl start mysqld_exporter systemctl enable mysqld_exporter netstat -natp | grep :9104
- 修改 Prometheus 配置文件,添加 MySQL Exporter 目标:
- job_name: mysqld metrics_path: "/metrics" static_configs: - targets: - 192.168.80.15:9104 labels: service: mysqld
- 安装 MySQL Exporter:
-
Nginx Exporter
- 安装 Nginx 和 Nginx VTS 模块:
./configure --prefix=/usr/local/nginx \ --add-module=/usr/local/nginx-module-vts make && make install
- 配置 Nginx:
http { vhost_traffic_status_zone; vhost_traffic_status_filter_by_host on; server { listen 8080; location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; } } }
- 启动 Nginx Exporter:
systemctl start nginx-exporter systemctl enable nginx-exporter netstat -natp | grep :9913
- 修改 Prometheus 配置文件,添加 Nginx Exporter 目标:
- job_name: nginx metrics_path: "/metrics" static_configs: - targets: - 192.168.80.15:9913 labels: service: nginx
- 安装 Nginx 和 Nginx VTS 模块:
3. 部署 Grafana
-
安装 Grafa