
在服务器运维和开发过程中你是否经常遇到这样的困扰服务器CPU突然飙高却不知是哪个进程导致内存使用率缓慢增长直至告警应用接口响应变慢却难以定位瓶颈面对这些“黑盒”问题传统的登录服务器查看命令输出的方式不仅效率低下而且无法进行历史回溯和趋势分析。本文将为你提供一套完整的解决方案使用Prometheus Grafana快速搭建一套功能强大、可视化效果出色的服务器监控系统。无论你是运维工程师、后端开发者还是对服务器监控感兴趣的技术爱好者只要跟着本文的步骤操作你都能在短时间内远少于三天从零开始完成环境部署、数据采集、面板配置的全过程最终获得一个直观、实时、可定制的监控“驾驶舱”。下面我们就从最基础的概念开始一步步实现它。1. 监控系统核心概念与架构在动手之前我们需要理解这套监控体系中的核心组件及其职责这有助于我们在后续配置和排错时心中有数。1.1 什么是 PrometheusPrometheus 是一个开源的系统监控和警报工具包最初由 SoundCloud 开发现在已成为云原生计算基金会CNCF的毕业项目。它的核心特点包括多维数据模型通过指标名称metric name和键值对标签key-value label来唯一标识时间序列数据。灵活的查询语言PromQL允许用户实时查询和聚合时间序列数据功能强大。不依赖分布式存储单个服务器节点即可自治通过拉取Pull模型从目标收集指标。通过 HTTP 拉取指标监控目标通过暴露一个 HTTP 端点来提供指标数据。多种可视化支持自带简单的表达式浏览器也完美集成 Grafana。简单来说Prometheus 主要负责数据的采集和存储。它像一个勤恳的数据收集员定期从各个被监控的服务器称为“Targets”那里抓取指标数据并存储在自己的时序数据库中。1.2 什么是 GrafanaGrafana 是一个跨平台的开源分析和可视化工具。它本身不存储数据而是作为一个功能强大的“仪表盘”可以从多种数据源如 Prometheus, MySQL, InfluxDB 等查询数据并将数据转化为精美的图表和警报。它的核心价值在于强大的可视化能力支持图表Graph、仪表盘Gauge、热图Heatmap等多种面板类型。灵活的数据源支持除了 Prometheus还支持 Elasticsearch, Loki, PostgreSQL 等数十种数据源。可交互的仪表盘支持变量、模板、下钻、时间范围控制方便多维度分析。警报管理可以基于查询结果设置警报规则并通过多种渠道如钉钉、邮件、Webhook通知。Grafana 主要负责数据的展示和告警。它像一个设计师将 Prometheus 收集来的原始数据加工成直观、易懂的监控图表。1.3 整体工作流程理解了两个核心组件后我们来看一下它们是如何协同工作的数据暴露在被监控的服务器上运行一个Exporter导出器。Exporter 是一个守护进程它将系统的各项指标如 CPU、内存、磁盘转换为 Prometheus 能够理解的格式并通过 HTTP 接口暴露出来。例如node_exporter用于暴露主机硬件和操作系统指标。数据抓取Prometheus Server 根据配置文件prometheus.yml中定义的“抓取任务scrape_configs”定期如每15秒去访问各个 Exporter 的 HTTP 端点拉取指标数据。数据存储与查询Prometheus 将抓取到的时序数据存储在本地的时序数据库中。用户可以通过 PromQL 语言查询这些数据。数据可视化Grafana 配置 Prometheus 作为其数据源。用户在 Grafana 中创建仪表盘Dashboard通过编写 PromQL 查询语句从 Prometheus 获取数据并选择合适的图表类型进行渲染展示。告警可选可以在 Prometheus 中定义告警规则Alerting Rules当条件触发时通过 Alertmanager 组件发送通知。也可以在 Grafana 中直接设置面板警报。整个架构清晰、解耦使得系统易于维护和扩展。2. 环境准备与规划在开始安装前我们需要规划好实验环境。为了模拟真实场景我们假设有一台需要被监控的 Linux 服务器称为“目标服务器”和一台用于运行 Prometheus 和 Grafana 的监控服务器称为“监控服务器”。在实际中这两者可以是同一台机器。本文实验环境说明操作系统CentOS 7.x / Rocky Linux 8.x 或 Ubuntu 20.04 LTS。本文命令以 CentOS/Rocky 为例Ubuntu 用户请注意包管理命令的差异apt代替yum。服务器角色监控服务器IP 为192.168.1.100将安装 Prometheus Server 和 Grafana。目标服务器IP 为192.168.1.101将安装node_exporter用于暴露主机指标。用户权限建议使用root用户或具有sudo权限的账户执行安装操作。防火墙与端口确保相关端口在防火墙中开放或直接关闭防火墙进行测试。Prometheus Server 默认端口9090Grafana 默认端口3000node_exporter 默认端口9100版本选择我们选择当前稳定且兼容性好的版本。请注意软件版本迭代较快以下版本仅为示例请以官网最新稳定版为准。Prometheus:2.45.0Grafana:10.0.3node_exporter:1.6.0重要提示生产环境请务必规划好数据存储目录、备份策略、访问权限和安全配置如启用 HTTPS、配置认证。本文侧重于快速搭建和入门安全配置会简要提及。3. 第一步安装与配置 Prometheus我们将首先在监控服务器192.168.1.100上安装 Prometheus。3.1 下载并安装 PrometheusPrometheus 是 Go 语言编写的二进制文件安装非常简单直接下载解压即可。创建专用用户和目录可选但推荐sudo useradd --no-create-home --shell /bin/false prometheus sudo mkdir /etc/prometheus /var/lib/prometheus sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus下载 Prometheus 安装包 访问 Prometheus 官方下载页 找到对应版本。使用wget直接在服务器下载。cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz解压并安装文件tar -xvf prometheus-2.45.0.linux-amd64.tar.gz cd prometheus-2.45.0.linux-amd64将二进制文件复制到系统目录sudo cp prometheus promtool /usr/local/bin/将配置文件和控制台文件复制到之前创建的目录sudo cp -r consoles console_libraries /etc/prometheus/ sudo cp prometheus.yml /etc/prometheus/修改目录所有权sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool3.2 配置 PrometheusPrometheus 的核心配置文件是/etc/prometheus/prometheus.yml。我们需要编辑它告诉 Prometheus 去哪里抓取数据。备份原始配置sudo cp /etc/prometheus/prometheus.yml /etc/prometheus/prometheus.yml.bak编辑配置文件sudo vi /etc/prometheus/prometheus.yml将其内容修改为如下所示。这是一个最基础的配置包含了 Prometheus 自身的监控和一个名为node_exporter的抓取任务指向我们的目标服务器。# 全局配置 global: scrape_interval: 15s # 默认抓取间隔每15秒抓取一次数据 evaluation_interval: 15s # 规则评估间隔每15秒评估一次告警规则 # 告警规则文件配置先留空后续可配置 rule_files: # - first_rules.yml # - second_rules.yml # 抓取配置列表 scrape_configs: # 监控 Prometheus 自身 - job_name: prometheus static_configs: - targets: [localhost:9090] labels: instance: prometheus-server # 监控目标服务器node_exporter - job_name: node_exporter static_configs: - targets: [192.168.1.101:9100] # 目标服务器的IP和node_exporter端口 labels: instance: target-server-01 # 给这个目标打上一个易读的标签 group: production-servers # 可以按组分类配置解释scrape_interval: 定义了 Prometheus 抓取目标的频率。job_name: 给一组监控目标起个名字。targets: 指定要监控的端点列表格式为主机:端口。labels: 可以为抓取到的所有时间序列数据添加额外的标签这对于在 Grafana 中按不同维度筛选数据非常有用。例如通过instance标签可以区分不同的服务器。3.3 创建 Systemd 服务单元文件为了便于管理启动、停止、开机自启我们为 Prometheus 创建 Systemd 服务。创建服务文件sudo vi /etc/systemd/system/prometheus.service写入以下内容[Unit] DescriptionPrometheus Monitoring System Documentationhttps://prometheus.io/docs/introduction/overview/ Afternetwork.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/usr/local/bin/prometheus \ --config.file/etc/prometheus/prometheus.yml \ --storage.tsdb.path/var/lib/prometheus/ \ --web.console.templates/etc/prometheus/consoles \ --web.console.libraries/etc/prometheus/console_libraries \ --web.listen-address0.0.0.0:9090 Restarton-failure [Install] WantedBymulti-user.target参数解释--config.file: 指定配置文件路径。--storage.tsdb.path: 指定时序数据库的存储路径。--web.listen-address: 指定 Prometheus Web UI 的监听地址和端口。0.0.0.0表示监听所有网络接口。重新加载 Systemd 并启动服务sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus # 设置开机自启检查服务状态和日志sudo systemctl status prometheus # 查看实时日志 sudo journalctl -f -u prometheus如果状态显示为active (running)并且日志没有明显的错误信息说明启动成功。验证访问 打开浏览器访问http://192.168.1.100:9090。你应该能看到 Prometheus 的 Web UI。点击顶部菜单栏的Status - Targets可以看到我们配置的两个抓取任务prometheus 和 node_exporter的状态。目前node_exporter应该是DOWN状态因为目标服务器上的node_exporter还没安装。4. 第二步在目标服务器安装 node_exporter现在我们需要在被监控的目标服务器192.168.1.101上安装node_exporter它负责收集主机层面的指标。下载 node_exportercd /tmp wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz tar -xvf node_exporter-1.6.0.linux-amd64.tar.gz cd node_exporter-1.6.0.linux-amd64安装并移动到系统目录sudo cp node_exporter /usr/local/bin/ sudo chown root:root /usr/local/bin/node_exporter创建 Systemd 服务sudo vi /etc/systemd/system/node_exporter.service写入以下内容[Unit] DescriptionNode Exporter Afternetwork.target [Service] Userroot Grouproot Typesimple ExecStart/usr/local/bin/node_exporter Restarton-failure [Install] WantedBymulti-user.target启动并启用服务sudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter sudo systemctl status node_exporter验证 在目标服务器上执行curl http://localhost:9100/metrics应该能看到大量以node_开头的指标输出。这证明node_exporter正在工作。重要配置防火墙 如果目标服务器开启了防火墙需要开放 9100 端口。# CentOS 7/Rocky 8 sudo firewall-cmd --permanent --add-port9100/tcp sudo firewall-cmd --reload # 或者临时关闭防火墙测试不推荐生产环境 # sudo systemctl stop firewalld返回监控服务器刷新 Prometheus Web UI 的 Targets 页面http://192.168.1.100:9090/targets。现在node_exporter任务的状态应该变成了绿色的UP。恭喜Prometheus 已经成功抓取到目标服务器的指标数据了5. 第三步安装与配置 Grafana接下来我们在监控服务器192.168.1.100上安装 Grafana用它来展示 Prometheus 中的数据。5.1 安装 GrafanaGrafana 提供了官方的 YUM/APT 仓库安装非常方便。添加 Grafana 仓库并安装以 CentOS/Rocky 为例sudo vi /etc/yum.repos.d/grafana.repo将以下内容粘贴进去[grafana] namegrafana baseurlhttps://packages.grafana.com/oss/rpm repo_gpgcheck1 enabled1 gpgcheck1 gpgkeyhttps://packages.grafana.com/gpg.key sslverify1 sslcacert/etc/pki/tls/certs/ca-bundle.crt然后安装sudo yum install -y grafana对于 Ubuntu/Debiansudo apt-get install -y software-properties-common wget wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - echo deb https://packages.grafana.com/oss/deb stable main | sudo tee -a /etc/apt/sources.list.d/grafana.list sudo apt-get update sudo apt-get install -y grafana启动并启用 Grafana 服务sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server sudo systemctl status grafana-server配置防火墙sudo firewall-cmd --permanent --add-port3000/tcp sudo firewall-cmd --reload访问 Grafana 打开浏览器访问http://192.168.1.100:3000。默认登录账号和密码都是admin。首次登录会要求修改密码请务必修改为一个强密码。5.2 添加 Prometheus 数据源登录 Grafana 后第一件事就是告诉 Grafana 数据从哪里来。点击左侧导航栏的齿轮图标Configuration-Data sources。点击Add data source按钮。在列表中选择Prometheus。在配置页面中只需填写一个关键字段URL:http://localhost:9090因为 Grafana 和 Prometheus 安装在同一台服务器上。如果分开部署则填写 Prometheus 服务器的实际地址如http://192.168.1.100:9090。其他选项保持默认滚动到页面底部点击Save test。如果配置正确你会看到绿色的 “Data source is working” 提示。5.3 导入官方仪表盘模板从头创建一个监控仪表盘需要编写大量的 PromQL 查询这对新手来说门槛较高。幸运的是Grafana 社区提供了大量优秀的仪表盘模板我们可以直接导入使用。对于主机监控最常用的是Node Exporter Full仪表盘。点击左侧导航栏的田字格图标Dashboards- Import。在Import via grafana.com输入框中输入仪表盘 ID1860然后点击Load。 仪表盘 ID1860对应的是 “Node Exporter Full” 的一个流行版本。你也可以在 Grafana Dashboards 官网 搜索 “node exporter” 找到其他版本。在下一个页面为仪表盘起个名字如 “Linux Server Metrics”并选择我们刚刚添加的 Prometheus 数据源然后点击Import。导入成功后你将立即看到一个信息量巨大、图表丰富的监控仪表盘这个仪表盘已经预置了 CPU、内存、磁盘、网络、系统负载等几乎所有关键指标的图表。6. 核心监控指标解读与 PromQL 初探现在你的监控大盘已经运行起来了。面对琳琅满目的图表我们该如何解读这需要理解一些核心的监控指标和基础的 PromQL。6.1 关键主机指标解读CPU 使用率100 - (avg by (instance) (rate(node_cpu_seconds_total{modeidle}[1m])) * 100)这个公式计算的是非空闲idle状态的 CPU 时间占比。rate函数计算每秒的增量[1m]表示过去1分钟的时间窗口。内存使用率(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100MemAvailable是内核估算的可用内存比MemFree更准确因为它包含了缓存和缓冲区中可回收的部分。磁盘使用率node_filesystem_avail_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/} * 100注意mountpoint标签可以筛选特定的挂载点。系统负载node_load1,node_load5,node_load15分别代表过去1、5、15分钟的系统平均负载。网络流量接收rate(node_network_receive_bytes_total{deviceeth0}[1m])发送rate(node_network_transmit_bytes_total{deviceeth0}[1m])device标签指定网卡名称。6.2 动手写一个简单的 PromQL让我们在 Grafana 中尝试创建一个简单的图表。在刚才导入的仪表盘右上角点击Add panel(加号图标) -Add a new panel。在面板编辑器的Query选项卡下数据源已选为 Prometheus。在Metrics browser输入框中尝试输入以下 PromQL 查询rate(node_network_receive_bytes_total{instancetarget-server-01, deviceeth0}[1m])这个查询会计算目标服务器eth0网卡过去1分钟的平均接收流量字节/秒。在右侧Panel options中给面板起个标题比如 “Network Receive Traffic”。点击右上角的Apply保存并返回仪表盘。你已经成功创建了第一个自定义查询通过修改instance和device标签的值你可以监控不同的服务器和网卡。7. 进阶配置与最佳实践基础搭建完成后我们可以考虑一些提升可靠性、安全性和效率的配置。7.1 Prometheus 数据持久化与保留策略默认情况下Prometheus 数据存储在/var/lib/prometheus下。对于生产环境你需要考虑存储空间确保该目录所在磁盘有足够空间。可以通过--storage.tsdb.retention.time参数控制数据保留时间默认为15天。例如保留90天--storage.tsdb.retention.time90d。备份定期备份storage.tsdb.path目录。远程存储对于海量数据可以考虑集成远程存储后端如 Thanos、Cortex 或 VictoriaMetrics。修改服务文件添加保留时间参数ExecStart/usr/local/bin/prometheus \ --config.file/etc/prometheus/prometheus.yml \ --storage.tsdb.path/var/lib/prometheus/ \ --storage.tsdb.retention.time90d \ # 添加此行 ...修改后执行sudo systemctl daemon-reload sudo systemctl restart prometheus。7.2 配置 Grafana 认证与域名访问生产环境默认的admin/admin和3000端口直接暴露是不安全的。修改默认端口编辑/etc/grafana/grafana.ini找到[server]章节修改http_port 3000。配置域名与反向代理强烈建议使用 Nginx 或 Apache 作为反向代理配置域名并启用 HTTPS。# Nginx 示例配置片段 server { listen 80; server_name grafana.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name grafana.yourdomain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }加强认证在grafana.ini中配置更复杂的[security]和[auth]选项或考虑集成 LDAP、OAuth 等外部认证。7.3 监控多个服务器要监控更多服务器只需在每台目标服务器上重复第四步安装node_exporter然后在监控服务器的prometheus.yml配置文件中在node_exporter的targets列表下添加新的 IP 和端口即可。- job_name: node_exporter static_configs: - targets: [192.168.1.101:9100, 192.168.1.102:9100, 192.168.1.103:9100] labels: group: production-servers也可以使用服务发现机制如基于文件、DNS、Consul、Kubernetes动态管理监控目标这在目标服务器频繁变动的环境中非常有用。7.4 添加其他 Exporternode_exporter只是监控主机本身。要监控特定服务需要安装对应的 ExporterMySQL:mysqld_exporterRedis:redis_exporterNginx:nginx-prometheus-exporter(需要 Nginx 启用stub_status模块)JVM 应用:jmx_exporterBlackbox:blackbox_exporter(用于监控 HTTP, TCP, ICMP 等端点的可用性)安装和配置方式与node_exporter类似通常也是下载二进制文件、创建服务、在prometheus.yml中添加新的抓取任务。8. 常见问题与排查思路在搭建和使用过程中你可能会遇到一些问题。以下是常见问题的排查思路。问题现象可能原因排查步骤与解决方案Prometheus Targets 页面显示 DOWN1. 网络不通或防火墙阻止。2.node_exporter服务未运行。3. Prometheus 配置中 targets 地址或端口错误。1. 从监控服务器ping和telnet目标服务器的 exporter 端口如telnet 192.168.1.101 9100。2. 在目标服务器检查node_exporter服务状态systemctl status node_exporter。3. 检查prometheus.yml中targets配置的 IP 和端口是否正确。Grafana 中查询不到数据1. Grafana 数据源配置错误。2. PromQL 查询语句错误。3. 时间范围选择不当。1. 在 Data sources 页面测试 Prometheus 数据源连接。2. 在 Prometheus 自带的 Web UI (http://prometheus:9090/graph) 中尝试相同的 PromQL看是否有数据。3. 检查 Grafana 仪表盘右上角的时间范围选择器是否选择了有数据的时间段。Prometheus 服务器磁盘空间增长过快1. 抓取目标过多或指标量巨大。2. 数据保留时间设置过长。1. 评估node_exporter等 exporter 的配置是否收集了过多不必要的指标可通过--collector.参数禁用某些收集器。2. 调整--storage.tsdb.retention.time参数缩短保留时间。3. 规划使用远程存储。node_exporter启动失败1. 端口被占用。2. 二进制文件权限问题。1. 使用 netstat -tlnpGrafana 登录后页面空白或报错1. 浏览器缓存问题。2. 插件或前端资源加载失败。1. 尝试浏览器无痕模式访问。2. 清除浏览器缓存。3. 检查 Grafana 服务器日志journalctl -f -u grafana-server。9. 总结与后续学习方向至此你已经成功搭建了一套由 Prometheus Grafana node_exporter 构成的服务器可视化监控系统。回顾一下我们完成的工作理解了监控架构明确了 Prometheus采集存储、Exporter暴露指标、Grafana可视化的角色。完成了环境部署在监控服务器安装了 Prometheus 和 Grafana在目标服务器安装了 node_exporter。进行了核心配置编写了 Prometheus 抓取配置在 Grafana 中添加了数据源并导入了仪表盘。实现了数据可视化通过现成的仪表盘可以实时查看服务器的 CPU、内存、磁盘、网络等关键指标。接触了 PromQL学会了如何编写简单的查询来获取特定数据。这套系统已经可以满足基本的服务器监控需求。但监控体系的建设远不止于此你可以从以下几个方向继续深入学习 PromQL这是挖掘监控数据价值的钥匙。掌握rate(),increase(),sum(),avg(),by等常用函数和聚合操作。配置告警在 Prometheus 中定义 Alerting Rules并配置 Alertmanager 将告警发送到邮件、钉钉、企业微信等实现故障的主动通知。监控更多对象将 MySQL、Redis、Nginx、JVM 应用等中间件和服务纳入监控范围。探索服务发现在动态环境如 Kubernetes中学习使用基于文件、DNS 或 Kubernetes 的服务发现来自动管理监控目标。构建业务监控在应用程序代码中集成 Prometheus Client如 Java 的micrometerPython 的prometheus_client暴露业务指标如接口 QPS、耗时、错误率实现真正的全栈可观测性。监控是保障系统稳定性的基石。希望本文能帮助你快速搭建起这块基石并以此为起点构建起越来越完善、强大的可观测性体系。如果在实践中遇到问题多查看官方文档和日志善用社区资源你的运维和开发体验一定会得到质的提升。