1. Prometheus是什么?跟Grafana有什么关系

Prometheus 是一个开源的系统监控和警报工具,主要用于收集、存储和查询各种系统和应用程序的指标数据。它通过 HTTP 协议定期从目标服务拉取(Pull)指标数据,并将这些数据存储在本地的时间序列数据库中。Prometheus 的核心特点包括:

  1. 多维数据模型:支持使用标签(Label)对指标进行多维度区分。

  2. 灵活的查询语言(PromQL):提供强大的表达式语言用于查询和聚合时间序列数据。

  3. 实时警报功能:可以基于规则定义触发警报,结合 Alertmanager 进行通知管理。

  4. 易于集成:支持多种导出器(Exporter),可以轻松监控服务器、容器、数据库等。


Grafana 是一个开源的数据可视化工具,专注于展示时间序列数据。它与 Prometheus 通常一起使用,但并不局限于 Prometheus 数据源。Grafana 的主要作用是为用户提供一个直观的仪表盘界面,用于创建、查看和共享各种图表和监控面板。

Prometheus 和 Grafana 的关系:

  • 数据采集与存储:Prometheus 负责采集和存储指标数据。

  • 数据可视化:Grafana 提供图形化界面,连接 Prometheus 作为数据源,利用 PromQL 查询数据并生成图表。

  • 互补性工具:两者常被组合使用,构建完整的监控解决方案。例如,Prometheus 提供后端数据支持,而 Grafana 提供前端展示。

典型工作流

  1. Prometheus 从目标服务抓取指标。

  2. 指标数据存储到 Prometheus 的时序数据库。

  3. Grafana 配置 Prometheus 为数据源。

  4. 用户通过 Grafana 创建仪表板,使用 PromQL 查询数据并生成图表。

总结来说,Prometheus 是负责监控数据的采集和分析,而 Grafana 是负责监控数据的可视化,两者相辅相成,共同构成现代监控体系的核心组件。


2. 什么是时序数据库,有哪些常见的时序数据库,Prometheus也是时序数据吗

什么是时序数据库?

时序数据库(Time Series Database, TSDB) 是一种专门用于存储、管理和查询时间序列数据的数据库。所谓时间序列数据,是指按照时间顺序记录的数据点,通常由以下部分组成:

  • 时间戳(Timestamp):表示数据生成的时间;

  • 指标名称(Metric Name):标识数据来源或含义;

  • 标签(Tags/Labels):用于多维描述数据(如主机名、区域等);

  • 值(Value):实际测量或采集的数据。

特点:

  1. 高写入吞吐量:支持大量并发写入;

  2. 高效压缩与存储:针对时间序列数据优化压缩算法;

  3. 高效的时间范围查询:支持快速聚合、下采样等操作;

  4. 时间驱动的索引结构:优化基于时间窗口的查询效率;

  5. 多维查询能力:通过标签实现灵活的过滤和聚合。


常见的时序数据库有哪些?

数据库

描述

特点

Prometheus

专为监控系统设计的时序数据库

内置拉取式采集机制、强大的 PromQL 查询语言

InfluxDB

专注于时间序列数据的开源数据库

支持 SQL-like 查询语言 InfluxQL 和 Flux

OpenTSDB

基于 HBase 的分布式时序数据库

高扩展性,适合大规模部署

TimescaleDB

PostgreSQL 的插件,扩展其为时序数据库

完全兼容 PostgreSQL,支持复杂查询

VictoriaMetrics

Prometheus 的轻量级替代方案

更低资源消耗,更强的集群支持

Graphite

早期流行的时序数据存储工具

简单易用,但功能较基础


Prometheus 是时序数据库吗?

是的,Prometheus 是一个内置的时序数据库。它专注于监控系统的数据采集和分析,具有以下特性:

  1. 采集方式

    • 使用 HTTP 接口从目标服务中“拉取”(Pull)数据;

    • 支持多种 Exporter(如 Node Exporter、MySQL Exporter)将现有服务指标暴露给 Prometheus。

  2. 存储方式

    • Prometheus 将采集到的指标以时间序列的形式存储在其本地的时序数据库中;

    • 每个时间序列包含一个指标名称和一组标签(Label);

    • 支持高效的压缩和查询。

  3. 查询语言

    • Prometheus 提供了强大的查询语言 PromQL,可以对时间序列数据进行聚合、计算、过滤等操作。

  4. 适用场景

    • 实时监控系统(如服务器性能监控、容器健康状态);

    • 微服务架构中的指标收集;

    • 结合 Grafana 实现可视化仪表板。

  5. 局限性

    • Prometheus 不适合长期存储历史数据;

    • 单节点存储容量受限,需结合远程存储(如 Thanos、VictoriaMetrics)实现扩展。


3. 为什么Prometheus又是监控又是时序数据库,其他的时序数据库可以作为监控吗

为什么 Prometheus 既是监控系统又是时序数据库?

Prometheus 的设计初衷是为了构建一个完整的监控解决方案,它不仅仅是一个存储时间序列数据的数据库,而是一个集采集、存储、查询、告警于一体的完整系统。以下是其“双重身份”的原因:


1. 专为监控场景优化的时序数据库

  • Prometheus 内置了一个轻量级的时序数据库(TSDB),专门用于存储从目标服务中拉取的指标数据;

  • 每个指标包含:

    • 时间戳(Timestamp)

    • 指标名称(Metric Name)

    • 标签(Labels)——用于多维过滤和聚合

  • 数据结构与查询语言(PromQL)紧密结合,适合实时监控和聚合分析。


2. 内置拉取式采集机制

  • Prometheus 提供了主动从目标服务(如 Node Exporter、Kubernetes API Server、MySQL Exporter 等)拉取指标的能力;

  • 支持多种协议(HTTP、HTTPS、gRPC);

  • 支持服务发现机制(如 Kubernetes、Consul、DNS 等)自动发现监控目标。


3. 强大的查询语言(PromQL)

  • PromQL 是 Prometheus 的核心功能之一,支持对时间序列数据进行:

    • 聚合(sum, avg, max, min)

    • 过滤(by <label>)

    • 数学运算(+, -, *, /)

    • 时间窗口统计(rate(), increase())


4. 告警系统集成

  • Prometheus 可配置规则文件(recording rules 和 alerting rules);

  • 当满足条件时触发告警,并将通知发送到 Alertmanager;

  • Alertmanager 支持多种通知方式(Email、Slack、PagerDuty、Webhook)。


总结:为什么 Prometheus 同时是监控与时序数据库?

功能

Prometheus 实现

采集

HTTP Pull + 多种 Exporter

存储

内置轻量时序数据库(TSDB)

查询

PromQL 查询语言

可视化

集成 Grafana

告警

Alertmanager


其他时序数据库可以作为监控吗?

是的,其他时序数据库也可以用于监控系统,但它们通常只提供“存储”能力,不具备 Prometheus 那样完整的生态链(采集、查询、告警)。下面是几个常见替代方案及其适用场景:


InfluxDB

  • 特点

    • 支持 SQL-like 查询语言(InfluxQL 和 Flux);

    • 可结合 Telegraf(采集器)实现监控数据收集;

    • 支持远程写入(Remote Write)给 Prometheus 使用。

  • 适用场景

    • 自定义监控系统;

    • IoT、日志类时间序列数据;

    • 企业内部监控平台。


VictoriaMetrics

  • 特点

    • 完全兼容 Prometheus 协议;

    • 支持单机版和集群版;

    • 更高效的压缩算法和更低的资源消耗;

    • 支持远程写入、联邦等高级特性。

  • 适用场景

    • Prometheus 替代品;

    • 大规模监控系统;

    • 需要长期存储或高可用部署的场景。


OpenTSDB

  • 特点

    • 基于 HBase 构建,适合大规模分布式部署;

    • 支持高并发写入;

    • 查询接口较原始,需配合 Grafana 或自研前端使用。

  • 适用场景

    • 大型企业级监控系统;

    • 已有 Hadoop/HBase 生态的项目。


TimescaleDB(PostgreSQL 插件)

  • 特点

    • PostgreSQL 插件,完全兼容 SQL;

    • 支持复杂查询、连接操作;

    • 适合需要关系型+时间序列混合查询的场景。

  • 适用场景

    • 金融数据分析;

    • IoT + 关系型数据混合场景;

    • 对 SQL 有强依赖的团队。


4. 什么是客户端,什么是服务端。docker、mysql、redis等服务中区分客户端和服务端吗,cli是什么意思。

一、什么是客户端(Client)和服务端(Server)?

服务端(Server)

  • 是指提供资源、数据或功能的一方;

  • 通常持续运行,监听特定端口,等待客户端连接请求;

  • 示例:MySQL 服务器、Redis 服务器、Web 服务器(如 Nginx)、Docker Daemon。

客户端(Client)

  • 是指使用资源或调用服务的一方

  • 主动发起请求,获取或操作服务端的数据;

  • 示例:浏览器访问网页、mysql 命令行工具、redis-cli、Docker CLI。


二、在 Docker、MySQL、Redis 中如何区分客户端与服务端?

MySQL

角色

说明

服务端

mysqld 进程,负责管理数据库、响应客户端查询

客户端

mysql 命令行工具、JDBC、Python 的 pymysql、Navicat 等

Redis

角色

说明

服务端

redis-server,负责处理键值存储和网络请求

客户端

redis-cli、Java 的 Jedis、Python 的 redis-py

Docker

角色

说明

服务端

docker daemon(后台进程),负责容器生命周期管理、镜像构建等

客户端

docker CLI 命令行工具,向 daemon 发送命令(如 build、run、ps)

三、CLI 是什么意思?

CLI 全称是 Command Line Interface,即命令行接口。它是一种通过输入文本命令来与程序交互的方式。

特点:

  • 无需图形界面,适合自动化脚本、远程管理;

  • 快速、轻量,适合开发者和运维人员;

  • 支持参数化操作,可编写脚本批量执行任务。



5. Prometheus中区分客户端与服务端吗?Exporters的作用是什么

一、Prometheus 中区分客户端与服务端吗?

是的,Prometheus 架构中明确区分了服务端(Server)和客户端(Client)角色


Prometheus 服务端(Server)

  • 职责

    • 主动从目标服务拉取(Pull)指标;

    • 存储采集到的时间序列数据;

    • 提供 PromQL 查询接口;

    • 触发告警规则并通过 Alertmanager 发送通知;

  • 核心组件

    • prometheus-server:主服务进程;

    • rules.yml:定义记录规则和告警规则;

    • scrape_configs:配置哪些目标需要被采集。

Prometheus 客户端(Client / Exporter)

  • 职责

    • 暴露 /metrics 接口,提供标准化格式的监控指标;

    • 不主动推送数据给 Prometheus,而是等待 Prometheus 拉取;

  • 常见形式

    • 应用内建指标暴露(如 Spring Boot Actuator);

    • 独立运行的 Exporter(如 Node Exporter、MySQL Exporter);

  • 工作方式

    • Prometheus Server 根据配置定期访问客户端的 /metrics 接口;

    • 客户端返回文本格式的指标数据(如 http_requests_total{method="GET"} 12345);

二、Exporters 的作用是什么?

Exporter 是什么?

Exporter 是一种用于将第三方系统或应用程序的指标数据转换为 Prometheus 可识别格式暴露 HTTP 接口的服务。

核心作用:

功能

说明

指标收集

收集目标系统的性能指标(如 CPU 使用率、内存占用、数据库连接数等)

格式转换

将原始数据转换为 Prometheus 能理解的文本格式(如 Counter、Gauge 等)

HTTP 暴露

提供 /metrics 接口供 Prometheus Server 定期拉取数据


三、常见 Exporter 及其用途

Exporter 名称

用途

Node Exporter

监控服务器硬件和操作系统指标(CPU、内存、磁盘、网络等)

MySQL Exporter

监控 MySQL 数据库状态(连接数、慢查询、QPS 等)

Redis Exporter

监控 Redis 性能指标(内存使用、命中率、连接数等)

Blackbox Exporter

黑盒探测,检查 HTTP、HTTPS、TCP、ICMP 是否可达

Pushgateway

允许临时任务(如 CronJob)推送指标,供 Prometheus 拉取

cAdvisor

容器资源监控(Docker 容器的 CPU、内存、网络等)

Kube State Metrics

Kubernetes 集群状态监控(Pod 状态、副本数、调度信息等)


6. 监控体系中,什么是拉模式,什么是推模式,Prometheus使用那种模式,为什么

一、什么是拉模式(Pull)和推模式(Push)?

拉模式(Pull Model)

  • 定义:由监控服务端主动向客户端发起请求,拉取指标数据;

  • 实现方式

    • 客户端暴露一个 HTTP 接口(如 /metrics);

    • 服务端定期访问这个接口获取指标;

  • 优点

    • 服务端控制采集频率,便于统一管理;

    • 不依赖客户端推送逻辑,架构简单;

  • 缺点

    • 若目标不可达,可能导致指标丢失;

    • 对服务端网络可达性要求高;

推模式(Push Model)

  • 定义:客户端主动将指标推送到服务端;

  • 实现方式

    • 客户端定时发送数据到远程存储(如 Pushgateway);

    • 常用于临时任务或无法被 Pull 的场景;

  • 优点

    • 更适合短生命周期任务(如 CronJob);

    • 网络结构更灵活,客户端可主动上报;

  • 缺点

    • 需要额外组件接收数据(如 Pushgateway);

    • 客户端需维护推送逻辑;

    • 可能导致时间序列重复或乱序;


二、Prometheus 使用哪种模式?为什么?

Prometheus 使用的是 拉模式(Pull Model)

原因如下:
  • 架构简洁

Prometheus Server 主动拉取客户端的 /metrics 接口;

客户端无需复杂逻辑,只需提供标准格式的文本响应;

减少了客户端开发和部署的负担。

  • 易于集成服务发现

Prometheus 支持与 Kubernetes、Consul、DNS 等集成,自动发现目标;

可动态调整采集对象,适用于云原生环境;

  • 采集频率统一管理

Prometheus Server 控制采集间隔(如 scrape_interval: 15s),确保所有目标一致;

易于做集中式性能分析和告警规则匹配;

  • 避免推送失败问题

在 Pull 模式下,如果某个目标暂时不可用,Prometheus 可在下次重试时继续采集;

而 Push 模式下,若推送失败且未做重试机制,可能导致数据丢失;

  • 标准化接口设计

所有 Exporter 提供统一 /metrics 接口,方便调试、测试和集成;

  • 适合长期运行的服务监控

大多数被监控服务是长期运行的(如 MySQL、Redis、K8s Pod);

这些服务天然支持 HTTP 接口,非常适合 Pull 模式;


7. 什么是Pushgateway,主要解决什么问题

一、什么是 Pushgateway?

Pushgateway 是 Prometheus 生态中的一个辅助组件,用于接收客户端主动推送的监控指标,并将这些指标暴露给 Prometheus Server 进行拉取(Pull)。

它本质上是一个中间缓存服务,允许客户端在无法被 Prometheus 主动拉取的情况下(如短生命周期任务、NAT 网络限制等),将自身的监控数据“推”到 Pushgateway,供 Prometheus 定期采集。


二、Pushgateway 的主要作用

核心功能

描述

支持 Push 模式采集

允许客户端主动推送指标,适用于 Pull 不可达的场景

临时任务指标上报

如 CronJob、脚本任务完成后推送结果指标

网络受限环境适配

在防火墙、NAT 或反向代理后方的服务可先推送到 Pushgateway

简化 Exporter 部署

对于无法长期运行的服务,可通过脚本推送一次性指标


三、Pushgateway 解决的主要问题

1. 短生命周期任务的监控缺失

  • Prometheus 默认使用 Pull 模式采集指标;

  • 如果某个任务只执行几秒就结束(如 Kubernetes CronJob),Prometheus 可能根本来不及拉取其指标;

  • 使用 Pushgateway 后,任务完成时可主动推送指标,确保数据不会丢失。

2. 网络访问限制

  • 有些客户端位于内网或受防火墙保护,无法被 Prometheus Server 直接访问;

  • 客户端可以主动连接 Pushgateway(通常部署在公网或共享网络中),解决 Pull 模式下的网络可达性问题。

3. 动态 IP 或不可预测地址的服务

  • 一些动态 IP 分配或容器编排下地址不稳定的任务难以通过静态配置加入 Prometheus 抓取目标;

  • 推送方式避免了对目标地址的依赖。


8. 搭建Prometheus服务,并在要监控的机器上部署node export。

本文提供一个标准的部署流程,适用于物理机、虚拟机或 Kubernetes 环境下的 Linux 节点。


一、环境准备

组件

版本建议

操作系统

Ubuntu 20.04/22.04 或 CentOS 7+/Rocky Linux

Prometheus

最新稳定版(如 v2.48.x)

Node Exporter

最新稳定版(如 v1.6.x)

网络要求

Prometheus Server 可访问 Node Exporter 的 9100 端口


二、在 Prometheus Server 上安装 Prometheus

1. 下载并解压 Prometheus

# 下载 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.48.1/prometheus-2.48.1.linux-amd64.tar.gz

# 解压
tar xvfz prometheus-2.48.1.linux-amd64.tar.gz
cd prometheus-2.48.1.linux-amd64

2. 编辑配置文件 prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['<node-exporter-ip>:9100']  # 替换为你的 Node Exporter 地址

3. 启动 Prometheus

./prometheus --config.file=prometheus.yml

三、在目标机器上部署 Node Exporter

1. 安装 Node Exporter

# 下载 Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz

# 解压
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
cd node_exporter-1.6.1.linux-amd64

2. 启动 Node Exporter(前台测试)

./node_exporter

Node Exporter 默认监听端口 9100,访问 http://<ip>:9100/metrics 即可看到指标数据。


四、将 Node Exporter 配置为系统服务(推荐)

创建 systemd 服务文件:

sudo vim /etc/systemd/system/node_exporter.service

写入以下内容(根据实际路径修改):

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
ExecStart=/opt/node_exporter/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target

创建用户并启动服务:

sudo useradd --no-create-home --shell /bin/false node_exporter
sudo cp node_exporter /opt/node_exporter/
sudo chown -R node_exporter:node_exporter /opt/node_exporter

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

验证 Prometheus 是否成功采集 Node Exporter 指标

  1. 打开 Prometheus Web UI:http://<prometheus-server>:9090

  2. 进入 Status > Targets

  3. 查看 node job 下的节点状态是否为 UP


9. Prometheus Server 的默认端口是多少,Node Exporter的默认端口是多少

Prometheus Server 的默认端口:

  • 默认端口:9090

  • 用途:用于 Prometheus 自身的 Web UI 界面和 API 查询接口。

  • 访问方式

    • 浏览器访问:http://<prometheus-server-ip>:9090

    • 查询接口示例:http://<prometheus-server-ip>:9090/api/v1/query


Node Exporter 的默认端口:

  • 默认端口:9100

  • 用途:提供 /metrics 接口供 Prometheus 拉取主机性能指标(CPU、内存、磁盘、网络等)。

  • 访问方式

    • http://<node-exporter-ip>:9100/metrics —— 查看原始指标数据

    • http://<node-exporter-ip>:9100/ —— Node Exporter 主页


10. Grafana中的仪表盘是什么,数据源是什么

一、Grafana 中的仪表盘(Dashboard)是什么?

Grafana 仪表盘是一个可视化的展示界面,用于将监控数据以图表、面板、表格等形式组织呈现。它允许用户自定义多个 Panel(面板),并按需分组、布局和配置。

核心组成:

组成

描述

Dashboard

整体容器,包含多个 Panel

Panel(面板)

每个 Panel 显示一种类型的数据视图,如折线图、柱状图、饼图、表格等

Variable(变量)

可选,支持动态筛选(如选择某个主机名、服务名)

Row(行)

对 Panel 进行逻辑分组,便于管理与阅读


二、Grafana 的数据源(Data Source)是什么?

数据源是 Grafana 获取监控数据的来源,可以是时间序列数据库、日志系统、指标采集工具等。Grafana 支持多种数据源插件,常见的包括:

数据源类型

描述

Prometheus

最常用的数据源之一,适合拉取式指标监控

InfluxDB

支持 SQL-like 查询语言 InfluxQL 和 Flux

MySQL / PostgreSQL

关系型数据库,适用于结构化数据可视化

Loki

日志聚合系统,常用于 Kubernetes 日志查询

Elasticsearch

用于展示日志、全文搜索类数据

Graphite

早期流行的时序数据库

OpenTSDB

基于 HBase 的分布式时序数据库

Tempo

分布式追踪系统(Trace)可视化

Zabbix

传统监控系统集成


三、Grafana 仪表盘与数据源的关系

  • 仪表盘本身不存储数据,而是通过 Panel 配置从数据源中获取数据;

  • 每个 Panel 必须绑定一个数据源,并提供查询语句或表达式;

  • 同一个 Dashboard 可以使用多个不同的数据源。


11. 搭建Grafana来展示Prometheus中的数据

一、环境准备

组件

版本建议

操作系统

Ubuntu 20.04/22.04 或 CentOS 7+/Rocky Linux

Prometheus

最新稳定版(如 v2.48.x)

Node Exporter(可选)

最新稳定版(如 v1.6.x)

Grafana

最新稳定版(如 v10.1.x)

网络要求

Grafana 可访问 Prometheus 的 9090 端口


二、安装 Grafana

方法 1:Ubuntu / Debian 安装方式

# 添加 Grafana APT 仓库
sudo apt install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_10.1.5_amd64.deb
sudo dpkg -i grafana_10.1.5_amd64.deb

# 启动并启用 Grafana 服务
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

三、配置 Prometheus 数据源

步骤:

  1. 打开 Grafana Web UI:

    http://<your-grafana-ip>:3000

    初始用户名和密码为:admin/admin

  2. 登录后点击左侧菜单 Configuration > Data Sources

  3. 点击 Add data source

  4. 选择 Prometheus

  5. 填写 Prometheus 地址(假设 Prometheus Server 运行在本地):

    URL: http://localhost:9090
  6. 点击 Save & Test

    • 如果显示 “Data source is working”,说明连接成功


四、导入 Prometheus 监控仪表盘

Grafana 提供了多个官方预设仪表盘,最常用的是:

Node Exporter 主机监控仪表盘(推荐 ID: 1860)

步骤:

  1. 在 Grafana 首页点击 Create > Import

  2. 输入 Dashboard ID:1860

  3. 点击 Load

  4. 选择 Prometheus 数据源(下拉框中选择你刚刚添加的数据源)

  5. 点击 Import

你现在将看到 CPU、内存、磁盘、网络等主机资源的实时监控面板。


五、验证是否成功采集 Prometheus 指标

点击 Grafana 左侧菜单 Explore

选择 Prometheus 数据源

输入 PromQL 查询语句测试:

node_cpu_seconds_total{mode!="idle"}


12. Prometheus和Grafana是使用什么语言开发的

Prometheus 开发详情

  • 后端语言:Go

    • Prometheus 是用 Go 语言编写的一个独立可执行程序;

    • 高性能、跨平台,适合构建监控系统;

    • 提供 HTTP 接口供外部访问(如 http://localhost:9090);

  • 前端界面:静态页面

    • Prometheus 自带一个简单的 Web UI,用于查询和图形展示;

    • 不依赖复杂的前端框架,仅使用 HTML/CSS/JS 实现基本功能;


Grafana 开发详情

  • 后端语言:Go

    • Grafana 的后端使用 Go 编写;

    • 负责处理插件加载、数据源管理、权限控制、API 请求等;

  • 前端语言:TypeScript + React

    • Grafana 的可视化界面是基于现代前端技术栈构建的;

    • 使用 React 框架实现动态交互式仪表盘;

    • 支持插件扩展机制,允许开发者使用 JS/TS 构建自定义 Panel 插件;

以他人的幸福为幸福,以他人的享乐为享乐。