ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零搭建Prometheus+Grafana监控系统:Linux服务器运维实战指南

从零搭建Prometheus+Grafana监控系统:Linux服务器运维实战指南 在实际服务器运维和开发过程中监控是保障系统稳定性的基石。面对服务器CPU、内存、磁盘、网络等指标的波动如果仅靠登录服务器查看命令行不仅效率低下也难以发现趋势性问题和进行历史回溯。Prometheus 作为一款开源的系统监控和警报工具以其强大的数据模型和灵活的查询语言PromQL著称而 Grafana 则以其出色的数据可视化能力能将 Prometheus 采集的冰冷数据转化为直观的图表。两者结合是构建现代化监控体系的黄金搭档。很多初学者在面对 Prometheus 的配置文件、服务发现、Grafana 的面板配置时感到无从下手网络上零散的教程往往只解决单点问题难以形成从零到一的完整闭环。本文将聚焦于最核心、最通用的场景在一台或多台 Linux 服务器上从零开始部署 Prometheus 和 Grafana配置基础的系统监控并最终在 Grafana 中呈现一个完整的监控大盘。整个过程将遵循“先跑通再优化”的原则确保每一步都有明确的操作、验证和解释即使是运维新手也能跟随完成。1. 理解监控体系Prometheus 如何与 Grafana 协同工作在动手安装之前需要先厘清整个监控数据流的脉络。这有助于在后续配置和排错时能清晰地知道问题可能出现在哪个环节。1.1 核心组件与数据流向一个典型的 Prometheus Grafana 监控体系包含以下核心角色监控目标Targets即需要被监控的实体如你的 Web 服务器、数据库、应用程序等。这些目标需要暴露一个 HTTP 端点通常是/metrics以特定格式Prometheus 格式提供自身的指标数据。Prometheus Server这是监控体系的大脑。它主要做两件事拉取Scrape按照配置的时间间隔如15秒主动去访问各个监控目标的/metrics端点拉取指标数据。存储与查询将拉取到的时序数据存储在其内置的时序数据库中并提供 PromQL 查询语言接口供用户或 Grafana 查询数据。Grafana这是监控体系的眼睛。它自身不存储监控数据而是作为一个功能强大的可视化平台。数据源Data SourceGrafana 可以配置 Prometheus 作为其数据源这意味着 Grafana 知道去哪里查询数据。仪表盘Dashboard用户可以在 Grafana 中创建一个个仪表盘每个仪表盘由多个面板Panel组成。每个面板通过编写 PromQL 查询语句从 Prometheus 获取特定的指标数据并以折线图、仪表盘、表格等形式展示出来。整个数据流可以简化为监控目标暴露指标 - Prometheus 定时拉取并存储 - Grafana 查询 Prometheus 并可视化。1.2 关键概念指标Metric、标签Label与 PromQL指标Metric一个测量值如node_cpu_seconds_total表示 CPU 在各种模式下花费的总时间。它由指标名称和一组键值对标签唯一标识。标签Label为指标提供维度。例如node_cpu_seconds_total{cpu“0”, mode“user”}表示第0个CPU核心在用户模式下花费的时间。标签使得我们可以对数据进行切片、切块、聚合如求和、求平均。PromQLPrometheus 查询语言。它是从 Prometheus 获取所需数据的钥匙。例如rate(node_cpu_seconds_total{mode“idle”}[1m])可以计算过去1分钟内CPU空闲时间的每秒速率即CPU空闲率。理解这些概念对于后续在 Grafana 中配置查询语句至关重要。2. 环境准备与规划我们将在一台 CentOS 7 或 Ubuntu 20.04 的服务器上完成所有组件的部署。为了模拟真实场景我们假设这台服务器既是监控服务器运行 Prometheus 和 Grafana也是被监控的目标。2.1 服务器基础要求操作系统CentOS 7.x / 8.x 或 Ubuntu 18.04 / 20.04 / 22.04。本文以 CentOS 7.9 为例。权限需要 root 或具有 sudo 权限的账户。网络服务器需要能访问互联网以下载安装包。如果目标服务器在内网需提前下载好安装包。资源小型监控系统建议至少 2核 CPU4GB 内存20GB 磁盘空间。防火墙需要开放相关端口。我们将使用以下默认端口Prometheus:9090Grafana:3000Node Exporter:91002.2 安装规划与目录结构为了便于管理我们规划统一的安装目录/opt/monitoring。sudo mkdir -p /opt/monitoring cd /opt/monitoring后续所有组件的安装包都将解压到此目录下并通过系统服务systemd进行管理。3. 部署 Prometheus 及其生态组件Prometheus 本身负责拉取和存储数据但要监控 Linux 主机的基础资源如 CPU、内存、磁盘我们需要一个“桥梁”——Node Exporter。3.1 安装 Node Exporter用于采集主机指标Node Exporter 是一个 Prometheus 官方提供的采集器专门用于暴露 *NIX 内核包括 Linux的系统指标。下载并解压 访问 Prometheus 官方下载页 找到最新版本的node_exporter。使用wget下载。# 进入规划目录 cd /opt/monitoring # 下载请替换为最新版本号例如 1.6.1 wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz # 解压 tar xvf node_exporter-1.6.1.linux-amd64.tar.gz # 创建软链接便于管理和更新 ln -s node_exporter-1.6.1.linux-amd64 node_exporter创建系统服务 使用 systemd 管理 Node Exporter实现开机自启和便捷的启停。sudo vi /etc/systemd/system/node_exporter.service将以下内容写入文件[Unit] DescriptionNode Exporter Afternetwork.target [Service] Userroot Grouproot Typesimple ExecStart/opt/monitoring/node_exporter/node_exporter Restarton-failure [Install] WantedBymulti-user.target注意生产环境中建议创建一个专用的非 root 用户来运行这些服务以提升安全性。此处为简化流程使用 root。启动并验证服务# 重载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start node_exporter # 设置开机自启 sudo systemctl enable node_exporter # 查看服务状态 sudo systemctl status node_exporter如果状态显示为active (running)则启动成功。此时可以访问http://你的服务器IP:9100/metrics应该能看到大量以node_开头的指标文本这证明 Node Exporter 正在工作。3.2 安装 Prometheus Server下载并解压 同样在/opt/monitoring目录下操作。cd /opt/monitoring # 下载 Prometheus请替换为最新版本号例如 2.47.0 wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz tar xvf prometheus-2.47.0.linux-amd64.tar.gz ln -s prometheus-2.47.0.linux-amd64 prometheus配置 Prometheus Prometheus 的核心配置文件是prometheus.yml。我们需要编辑它告诉 Prometheus 去拉取 Node Exporter 的指标。cd /opt/monitoring/prometheus cp prometheus.yml prometheus.yml.bak # 备份原始配置 vi prometheus.yml修改后的prometheus.yml关键部分如下global: scrape_interval: 15s # 全局默认抓取间隔 evaluation_interval: 15s # 规则评估间隔 # 告警规则文件配置初期可暂不配置 # rule_files: # - first_rules.yml # - second_rules.yml # 抓取配置这里定义我们要监控的目标 scrape_configs: # 任务名称监控 Prometheus 自身 - job_name: prometheus static_configs: - targets: [localhost:9090] # Prometheus 自己的 metrics 地址 # 任务名称监控 Linux 主机 - job_name: node_exporter static_configs: - targets: [localhost:9100] # Node Exporter 的地址 # 可以添加标签便于在 Grafana 中区分不同主机 labels: instance: monitor-server # 给这台主机起个名字配置解释scrape_interval: Prometheus 多久抓取一次目标数据。job_name: 定义一个抓取任务组。targets: 指定要抓取的目标地址列表。localhost:9100就是我们的 Node Exporter。labels: 可以为这个任务下的所有目标添加额外的标签。这里我们为这台服务器添加了一个instance标签值为monitor-server。在有多台主机时这个标签非常有用。创建系统服务并启动sudo vi /etc/systemd/system/prometheus.service写入以下内容[Unit] DescriptionPrometheus Server Afternetwork.target [Service] Userroot Grouproot Typesimple ExecStart/opt/monitoring/prometheus/prometheus \ --config.file/opt/monitoring/prometheus/prometheus.yml \ --storage.tsdb.path/opt/monitoring/prometheus/data \ --web.listen-address:9090 Restarton-failure [Install] WantedBymulti-user.target启动参数解释--config.file: 指定配置文件路径。--storage.tsdb.path: 指定时序数据库数据存储路径。--web.listen-address: 指定 Web 服务监听地址和端口。启动服务sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus sudo systemctl status prometheus验证 Prometheus 访问http://你的服务器IP:9090应该能看到 Prometheus 的 Web UI。点击顶部菜单Status - Targets。这里可以看到我们配置的两个抓取任务prometheus和node_exporter状态应为UP。这证明 Prometheus 已经成功拉取到数据。在Graph页面输入up并执行查询。up{jobnode_exporter}的值应为1表示该抓取目标健康。4. 部署与配置 GrafanaGrafana 负责将 Prometheus 中的数据可视化。4.1 安装 Grafana对于 CentOS/RHEL 系统推荐使用 YUM 仓库安装。# 添加 Grafana 官方仓库 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 sudo systemctl start grafana-server sudo systemctl enable grafana-server sudo systemctl status grafana-server对于 Ubuntu/Debian 系统可以使用 APT 仓库步骤类似具体可参考 Grafana 官方安装文档 。4.2 初始登录与配置数据源登录访问http://你的服务器IP:3000。默认用户名和密码都是admin。首次登录会要求修改密码。添加数据源点击左侧导航栏的齿轮图标Configuration-Data sources。点击Add data source。选择Prometheus。在HTTP-URL中填写 Prometheus 的地址http://localhost:9090如果 Grafana 和 Prometheus 在同一台机器。如果不在同一台则填写http://Prometheus服务器IP:9090。其他选项保持默认滚动到页面底部点击Save test。如果显示 “Data source is working”则配置成功。4.3 导入官方监控大盘Dashboard从头创建监控面板非常耗时Grafana 社区提供了大量优秀的现成模板。我们将导入一个最常用的 Node Exporter 监控大盘。获取模板ID访问 Grafana 官方仪表盘库 搜索 “Node Exporter Full”。通常一个非常流行的模板 ID 是1860Node Exporter Full by rfmoz。记住这个 ID。导入仪表盘在 Grafana 中点击左侧田字格图标Dashboards-New-Import。在Import via grafana.com输入框中填入模板 ID1860然后点击Load。在下一步中选择我们刚刚创建的 Prometheus 数据源然后点击Import。查看监控大盘导入成功后你将立即看到一个功能极其丰富的 Linux 主机监控面板。它包含了 CPU、内存、磁盘、网络、系统负载、温度等几乎所有维度的图表。5. 核心配置详解与监控实践至此一个基础的监控系统已经搭建完成。但要真正用好它还需要理解一些关键配置和查询。5.1 Prometheus 配置进阶监控多台主机在实际环境中我们需要监控多台服务器。只需在prometheus.yml的node_exporterjob 下扩展targets列表即可。scrape_configs: - job_name: node_exporter static_configs: - targets: - 192.168.1.101:9100 # 服务器 A - 192.168.1.102:9100 # 服务器 B - 192.168.1.103:9100 # 服务器 C labels: group: production-servers # 为这组服务器添加一个公共标签注意每台目标服务器上都需要安装并运行 Node Exporter。修改配置后需要重启 Prometheus 服务sudo systemctl restart prometheus。5.2 Grafana 面板与 PromQL 查询解析导入的大盘虽然好用但理解其背后的查询逻辑才能应对定制化需求。我们以 CPU 使用率面板为例。在 Grafana 中编辑面板打开刚才导入的仪表盘找到显示CPU Usage的面板将鼠标悬停在标题上点击下拉菜单选择Edit。查看查询语句在编辑器的Query选项卡中你会看到类似以下的 PromQL100 - (avg by (instance) (rate(node_cpu_seconds_total{modeidle}[1m])) * 100)语句解析node_cpu_seconds_total{mode“idle”}筛选出 CPU 空闲时间的计数器。rate(...[1m])计算该计数器在过去1分钟内的每秒增长率。因为计数器是累加的rate函数将其转换为瞬时的“每秒增加多少秒”即 CPU 空闲时间的利用率。avg by (instance) (...)按instance标签就是我们之前配置的monitor-server进行分组求平均。如果有多核CPU这个操作会将所有核心的空闲率平均。100 - (... * 100)空闲率的百分比。用100减去它就得到了CPU 使用率。自定义查询你可以尝试修改这个查询。例如想查看用户态mode“user”的 CPU 使用率可以将idle改为user。修改后点击右上角Apply即可看到图表变化。5.3 添加自定义监控项示例监控磁盘 inodeNode Exporter 默认提供了node_filesystem_*系列指标来监控磁盘空间但有时磁盘空间未满inode 却耗尽了同样会导致问题。我们可以添加一个监控 inode 使用率的面板。**在 Grafana 仪表盘中点击顶部Add panel(加号图标) -Add new panel。在 Query 编辑框中输入以下 PromQL(1 - node_filesystem_files_free{device!~“tmpfs|rootfs”} / node_filesystem_files{device!~“tmpfs|rootfs”}) * 100解释node_filesystem_files文件系统总的 inode 数量。node_filesystem_files_free文件系统空闲的 inode 数量。{device!~“tmpfs|rootfs”}排除掉临时文件系统和 rootfs通常我们只关心持久化磁盘。公式(1 - 空闲/总数) * 100计算得出 inode 使用率百分比。配置可视化在右侧Visualization中选择Gauge仪表盘或Stat状态值。在Standard options-Unit中选择Percent (0-100)。可以设置阈值例如80为警告黄色90为危险红色。为面板设置一个标题如 “Disk Inode Usage”然后点击Apply保存到仪表盘。6. 生产环境考量与常见问题排查将监控系统用于生产环境除了功能实现还需要关注稳定性、安全性和可维护性。6.1 安全加固建议网络访问控制通过防火墙如firewalld或iptables限制对9090(Prometheus)、3000(Grafana)、9100(Node Exporter) 端口的访问仅允许运维网络或跳板机 IP 访问。服务运行账户为 Prometheus、Node Exporter 创建专用的非 root 系统账户并修改 systemd 服务文件中的User和Group字段。Grafana 认证务必修改默认密码。可以考虑配置更安全的认证方式如 LDAP、OAuth 或反向代理集成统一登录。Prometheus 数据持久化确保--storage.tsdb.path指向的目录有足够磁盘空间并考虑定期清理旧数据Prometheus 有自动保留策略或使用远程存储。6.2 常见问题与排查路径监控系统本身也可能出现问题。以下是几个典型问题的排查思路。问题现象可能原因检查步骤解决方案Grafana 中无数据显示 “No data”1. 数据源配置错误2. Prometheus 服务未运行3. Node Exporter 服务未运行4. 防火墙阻止访问1. 在 GrafanaData Sources中测试连接。2.systemctl status prometheus3.systemctl status node_exporter4.curl http://localhost:9090和curl http://localhost:9100/metrics在本机测试。5. 检查防火墙规则firewall-cmd --list-all(CentOS)。1. 修正数据源 URL。2. 查看日志journalctl -u prometheus -f启动服务。3. 查看日志journalctl -u node_exporter -f启动服务。4. 添加防火墙规则或关闭防火墙测试用。Prometheus Targets 页面显示状态为DOWN1. 目标地址/端口错误2. 目标服务未启动3. 网络不通1. 检查prometheus.yml中targets配置。2. 在 Prometheus 服务器上尝试telnet 目标IP 目标端口。3. 直接访问目标的/metrics端点如curl http://目标IP:9100/metrics。1. 修正配置文件并重启 Prometheus。2. 确保目标服务器上的 exporter 正在运行。3. 检查网络和防火墙。监控数据点间隔异常如远大于15秒1. 服务器负载过高抓取超时2. 网络延迟大3. Prometheus 配置的scrape_interval被覆盖1. 查看 Prometheus 日志是否有抓取错误。2. 在 Prometheus UI 的Targets页面查看最后一次抓取耗时。3. 检查 job 配置中是否有自定义scrape_interval。1. 优化目标服务器性能或调整 Prometheus 的scrape_timeout。2. 检查网络状况。3. 调整抓取间隔配置。磁盘空间增长过快Prometheus 存储了大量监控数据1. 检查--storage.tsdb.path目录大小。2. 查看 Prometheus 启动参数中的数据保留策略。1. 修改启动参数例如--storage.tsdb.retention.time30d表示保留30天数据。2. 手动清理旧数据目录需在服务停止时进行。6.3 性能与资源优化Prometheus 存储对于大规模监控内置的 TSDB 可能成为瓶颈。可以考虑使用远程存储适配器Remote Write将数据写入更强大的时序数据库如 Thanos、Cortex 或 VictoriaMetrics。Grafana 性能仪表盘面板过多、查询过于复杂会导致 Grafana 加载缓慢。应优化 PromQL 查询避免全时间范围、高精度查询对必要的大盘启用快照或缓存。监控目标数量单个 Prometheus 实例能稳定抓取的目标数量有限通常数千个。目标过多时需考虑使用 Prometheus 的联邦Federation或分片Sharding架构。7. 扩展方向与下一步搭建起基础监控只是第一步一个成熟的监控体系还包括告警、应用监控、日志聚合等。配置告警AlertmanagerPrometheus 可以配置告警规则rule_files当指标满足条件时将告警推送给 Alertmanager。Alertmanager 负责对告警进行去重、分组、静默并通过邮件、钉钉、企业微信、Webhook 等渠道发送通知。这是实现监控价值及时发现问题的关键一步。监控应用程序除了系统指标业务应用指标同样重要。几乎所有主流编程语言Go, Java, Python, Node.js等都有对应的 Prometheus 客户端库可以轻松地在代码中暴露自定义业务指标如 HTTP 请求数、请求延迟、业务计数器等。集成日志监控LokiGrafana Loki 是一个受 Prometheus 启发的日志聚合系统。它可以与 Grafana 无缝集成让你在同一个平台下既能查看指标图表又能搜索和查看相关日志实现真正的可观测性。容器与 Kubernetes 监控如果你使用 Docker 或 KubernetesPrometheus 生态有对应的 exporter如cAdvisor用于容器kube-state-metrics用于 K8s 对象状态。结合node_exporter可以构建全方位的容器集群监控。从安装部署到出图再到理解其原理和排查问题这个过程是掌握任何运维工具的标准路径。建议在熟悉当前单机部署后尝试将其扩展到多台服务器并着手配置第一个业务指标监控和告警规则让监控系统真正为你的业务稳定性保驾护航。
返回列表