1. 项目概述为什么选择PrometheusGrafana这套监控组合在运维和开发领域监控是保障系统稳定性的“眼睛”。当你的应用从单机走向集群从几个服务膨胀到几十上百个微服务时传统的日志查看和简单脚本监控就彻底不够用了。你需要一个能实时采集、存储、查询并能直观展示海量指标的系统。这就是Prometheus和Grafana这对黄金搭档大显身手的地方。Prometheus是一个开源的系统监控和警报工具包它通过主动“拉取”Pull的方式从你的应用、服务器、数据库等目标收集指标数据并存储在它内置的高性能时序数据库中。它的核心优势在于其强大的多维数据模型和灵活的查询语言PromQL让你能像写SQL一样对监控数据进行复杂的聚合、切片和计算。而Grafana则是一个顶级的开源数据可视化平台它本身不存储数据但能连接包括Prometheus在内的数十种数据源将枯燥的数字和曲线变成直观、美观、可交互的仪表盘Dashboard。我选择这套组合是因为它几乎成了云原生时代监控的事实标准。从个人项目到大型互联网公司都能看到它的身影。它部署相对简单生态极其丰富有成千上万的社区仪表盘模板而且完全免费开源。接下来我将带你从零开始一步步完成这套监控系统的安装与基础配置并分享我在实际部署中踩过的坑和总结的技巧。2. 环境准备与核心组件解析在动手安装之前理清整个架构和准备好运行环境至关重要。盲目安装只会导致后续配置混乱问题频发。2.1 系统环境与前置条件我建议在一台干净的Linux服务器上操作这里以最常用的CentOS 7.x或Ubuntu 20.04 LTS为例。这套组合对资源要求不高测试环境2核CPU、4GB内存、50GB磁盘就足够流畅运行了。关键前置依赖网络畅通确保服务器能访问互联网以下载安装包同时监控目标如其他服务器、应用的网络端口能被Prometheus服务器访问。防火墙与SELinux这是新手最容易栽跟头的地方。你需要开放相关端口或者直接在学习阶段临时关闭它们生产环境请谨慎。CentOS 7:# 临时关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 临时关闭SELinux setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/configUbuntu:# Ubuntu默认使用ufw可以禁用或开放端口 sudo ufw disable时间同步监控数据严重依赖准确的时间戳。务必配置NTP服务确保服务器时间准确。# CentOS yum install -y ntp systemctl start ntpd systemctl enable ntpd # Ubuntu sudo apt-get install -y ntp注意生产环境中请务必通过配置防火墙规则firewall-cmd或ufw精确开放所需端口如Prometheus的9090Grafana的3000并仔细规划SELinux策略而不是简单粗暴地关闭。这里为了方便演示采用了临时关闭的方式。2.2 组件架构与数据流理解很多人安装失败是因为没搞懂数据是怎么流动的。我们先花两分钟看明白这张逻辑图[你的应用/Node/MySQL...] --(暴露指标)-- [Prometheus Server] --(拉取存储)-- [时序数据库] ^ | | v [各种Exporter] [Grafana] --(查询展示)-- [浏览器仪表盘]数据暴露层被监控的目标需要以Prometheus能理解的格式暴露指标。常见方式有内置客户端库如果你的应用是用Go、Java、Python等写的可以直接集成Prometheus客户端库在代码中定义和暴露指标。Exporter对于黑盒系统如Linux主机、MySQL、Nginx我们使用独立的“导出器”。例如node_exporter用于收集主机指标CPU、内存、磁盘、网络它运行在目标主机上提供一个HTTP端点如http://主机IP:9100/metrics供Prometheus拉取。数据采集与存储层Prometheus Server是大脑。它定期可配置如15秒一次去访问配置好的目标列表称为targets的指标端点拉取数据并压缩存储在其内置的时序数据库中。数据可视化层Grafana是脸面。它通过配置好的数据源Data Source连接到Prometheus Server然后使用PromQL查询语言从Prometheus中取出数据渲染成各种图表曲线图、仪表盘、热图等并组织成功能丰富的仪表盘。搞清楚这个流程你就明白我们安装的核心就是部署Prometheus Server部署各种Exporter至少要有node_exporter监控主机本身最后部署Grafana并将两者连接起来。3. 分步安装与配置实战我们将按照“先监控对象再监控大脑最后配脸面”的顺序进行。这个顺序更符合逻辑也便于分步验证。3.1 第一步部署Node Exporter监控服务器本身Node Exporter是监控Linux主机资源的必备组件。我们首先在Prometheus Server所在的这台机器上安装它。下载与解压 访问Prometheus官网的下载页面找到最新版本的node_exporter。这里我们使用命令行操作。# 创建专用目录并进入 mkdir -p /opt/monitoring cd /opt/monitoring # 下载node_exporter (请替换为最新版本号例如1.7.0) wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz # 解压 tar xvf node_exporter-1.7.0.linux-amd64.tar.gz # 创建软链接方便管理 ln -s node_exporter-1.7.0.linux-amd64 node_exporter cd node_exporter启动与测试 Node Exporter是一个独立的二进制文件可以直接运行。# 前台启动测试 ./node_exporter如果看到类似“Listening on :9100”的输出说明启动成功。按CtrlC停止。现在打开浏览器访问http://你的服务器IP:9100/metrics你应该能看到大量以node_开头的指标文本例如node_cpu_seconds_total、node_memory_MemFree_bytes。这证明Exporter工作正常。配置为系统服务推荐 为了让Node Exporter在后台持续运行并在开机时自动启动我们将其配置为systemd服务。sudo vi /etc/systemd/system/node_exporter.service将以下内容写入文件[Unit] DescriptionNode Exporter Afternetwork.target [Service] Userroot ExecStart/opt/monitoring/node_exporter/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看到active (running)状态即表示服务已成功启动并设置开机自启。3.2 第二步部署Prometheus Server监控大脑现在我们来安装和配置监控系统的核心——Prometheus Server。下载与解压cd /opt/monitoring # 下载Prometheus (请替换为最新版本号例如2.51.2) wget https://github.com/prometheus/prometheus/releases/download/v2.51.2/prometheus-2.51.2.linux-amd64.tar.gz tar xvf prometheus-2.51.2.linux-amd64.tar.gz ln -s prometheus-2.51.2.linux-amd64 prometheus cd prometheus关键配置文件详解prometheus.yml 这是Prometheus的核心配置文件定义了拉取谁targets、拉取频率等。我们先备份原文件然后编辑。cp prometheus.yml prometheus.yml.bak vi prometheus.yml默认配置文件已经包含了一些示例。我们将其精简并修改为以下内容global: scrape_interval: 15s # 全局默认抓取间隔15秒一次是常用值 evaluation_interval: 15s # 规则评估间隔用于警报 alerting: alertmanagers: # 警报管理器配置本篇先不涉及可留空或注释 - static_configs: - targets: # - alertmanager:9093 rule_files: # 警报规则文件本篇先不涉及 # - first_rules.yml # - second_rules.yml scrape_configs: # 抓取配置这是核心部分 - job_name: prometheus # 第一个任务监控Prometheus自身 static_configs: - targets: [localhost:9090] # Prometheus Server自己的指标端点 - job_name: node # 第二个任务监控Linux节点 static_configs: - targets: [localhost:9100] # 本机的node_exporter labels: # 可以添加自定义标签便于在Grafana中分组筛选 instance: monitor-server-01 group: production # 如果你想监控其他服务器在这里继续添加 # - targets: [192.168.1.101:9100, 192.168.1.102:9100] # labels: # instance: app-server-01 # group: production配置解读scrape_configs下的每个job_name代表一组监控任务。targets列表就是Prometheus要去拉取数据的HTTP地址。labels可以为这组目标添加额外的维度标签在PromQL查询和Grafana分组时非常有用。启动与验证Prometheus 同样我们将其配置为systemd服务。sudo vi /etc/systemd/system/prometheus.service写入以下内容注意ExecStart和--config.file的路径[Unit] DescriptionPrometheus Server Afternetwork.target [Service] Userroot 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 UI监听地址和端口默认是:9090。保存后启动服务sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus sudo systemctl status prometheus初步验收 打开浏览器访问http://你的服务器IP:9090。状态页点击顶部导航栏的“Status” - “Targets”。你应该看到两个目标prometheus和node并且它们的State都是“UP”。这表示Prometheus已经成功拉取到自身和Node Exporter的指标。查询测试在“Graph”页面的查询框输入up点击“Execute”。你应该看到两条结果value都是1。up{jobnode}值为1表示node任务监控正常。再尝试输入node_memory_MemFree_bytes可以看到当前系统的空闲内存字节数。实操心得prometheus.yml是灵魂文件修改后必须重启Prometheus服务 (sudo systemctl restart prometheus) 才能生效。建议每增加一批监控目标就先用curl http://target_ip:port/metrics手动测试一下指标端点是否能访问确认无误后再添加到配置中可以避免很多“Target Down”的问题。3.3 第三步部署Grafana数据可视化脸面Prometheus的Web UI功能比较基础我们安装Grafana来打造强大的监控仪表盘。安装Grafana 这里我们使用官方提供的Yum/APT仓库安装便于后续升级。对于CentOS/RHEL: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/Debian:sudo 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启动Grafanasudo systemctl start grafana-server sudo systemctl enable grafana-server sudo systemctl status grafana-server初始登录与配置数据源打开浏览器访问http://你的服务器IP:3000。默认用户名和密码都是admin。首次登录会要求修改密码。登录后点击左侧齿轮图标“Configuration”选择“Data Sources”。点击“Add data source”选择“Prometheus”。在配置页面最关键的一项是“URL”填写你的Prometheus服务器地址例如http://localhost:9090如果Grafana和Prometheus装在同一台机器。其他参数保持默认即可。滚动到页面底部点击“Save Test”。如果出现绿色的“Data source is working”提示框恭喜你连接成功4. 构建你的第一个监控仪表盘数据源配好了现在我们用两种最实用的方法来创建仪表盘导入社区模板和手动创建。4.1 方法一导入现成的社区模板最快上手Grafana社区有海量用户分享的仪表盘模板对于主机监控有一个极其经典的模板。在Grafana首页点击左侧“”号选择“Import”。在“Import via grafana.com”输入框中输入模板ID1860这是Node Exporter Full的经典模板然后点击“Load”。在下一个页面为仪表盘起个名字如“Linux Server Overview”最关键的是在“Prometheus”下拉框中选择你刚才创建的数据源。点击“Import”。瞬间一个功能齐全、图表专业的主机监控仪表盘就出现了你可以看到CPU、内存、磁盘IO、网络流量、负载等所有关键指标的图表。4.2 方法二手动创建面板理解原理虽然导入模板很方便但理解如何手动创建一个面板能让你真正掌握Grafana。点击左侧“”号选择“Create Dashboard”然后点击“Add a new panel”。配置查询Query这是面板的核心。在“Data source”处选择你的Prometheus。在“Metrics browser”输入框中输入node_memory_MemFree_bytes。下方会预览出当前的曲线。但直接使用这个原始值字节数不直观。我们使用PromQL函数将其转换为更易读的“可用内存百分比”。将查询语句修改为(node_memory_MemFree_bytes node_memory_Cached_bytes node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100这个公式计算了空闲内存缓存缓冲区/ 总内存 * 100更准确地反映了系统实际可用的内存比例。配置可视化Visualization在右侧将“Panel title”修改为“可用内存百分比”。在“Visualization”下拉框中选择“Gauge”仪表或“Stat”统计值这样看起来更直观。对于“Gauge”可以设置阈值Thresholds例如将绿色区域设为20黄色10-20红色10这样一眼就能看出状态。应用与保存点击右上角的“Apply”保存这个面板然后点击仪表盘右上角的“Save dashboard”图标保存整个仪表盘。通过手动创建你不仅学会了操作更重要的是理解了PromQL的威力——它允许你对原始指标进行任意计算和组合这是构建定制化监控视图的基础。5. 生产环境进阶配置与优化基础的安装完成了但要用于生产环境还需要考虑更多。这里分享几个关键的进阶配置点。5.1 Prometheus数据持久化与保留策略默认情况下Prometheus数据存储在安装目录的data/下保留时间为15天。对于生产环境这可能需要调整。修改数据存储路径我们已经在systemd服务文件中通过--storage.tsdb.path参数指定了路径。确保该路径挂载的磁盘有足够空间监控数据增长很快。调整数据保留时间编辑Prometheus的systemd服务文件在ExecStart行添加参数--storage.tsdb.retention.time90d这会将数据保留时间延长至90天。修改后需要sudo systemctl daemon-reload和sudo systemctl restart prometheus。监控Prometheus自身Prometheus会监控自己。在http://localhost:9090/metrics中关注prometheus_tsdb_head_chunks和prometheus_tsdb_storage_blocks_bytes等指标可以了解数据存储状态。也可以在Grafana中导入ID为3662的“Prometheus 2.0 Stats”仪表盘来可视化监控Prometheus Server的健康状况。5.2 Grafana安全与用户管理默认的admin账户密码必须修改。此外对于团队使用需要配置更细致的权限。强制修改默认密码首次登录后立即修改。创建查看者Viewer账户对于只需要看仪表盘、不需要编辑的团队成员可以创建角色为“Viewer”的用户。进入“Server Admin” - “Users”点击“New user”创建。为其分配对特定文件夹Folder或仪表盘Dashboard的“View”权限。这可以在仪表盘或文件夹的“Permissions”设置中完成。配置外部认证可选对于企业可以配置LDAP、OAuth如GitHub、Google等外部认证统一账号体系。这需要在Grafana的配置文件/etc/grafana/grafana.ini中进行复杂配置。5.3 添加更多监控目标Exporter一个完整的监控系统不会只监控主机。你需要根据业务添加相应的Exporter。监控对象推荐Exporter默认端口关键指标举例MySQLmysqld_exporter9104mysql_global_status_questions(查询QPS),mysql_global_status_threads_connected(连接数)Redisredis_exporter9121redis_connected_clients(客户端数),redis_memory_used_bytes(内存使用)Nginxnginx-vts-exporter(需Nginx安装VTS模块) 或nginx-prometheus-exporter9913nginx_vts_server_requests_total(请求总数)DockercAdvisor8080container_cpu_usage_seconds_total,container_memory_usage_bytesKubernetes通过kube-state-metrics和cAdvisor多种kube_pod_container_status_restarts_total(容器重启次数)通用部署模式在目标服务器上下载并运行对应的Exporter同样建议配置为systemd服务。在Prometheus Server的prometheus.yml文件的scrape_configs部分新增一个job_name将新Exporter的地址添加到targets列表中。重启Prometheus服务。在Grafana官网搜索对应的仪表盘模板如搜索“MySQL Overview”导入并使用。6. 常见问题与故障排查实录即使按照步骤操作你也可能会遇到一些问题。这里记录了我遇到过的典型问题及其解决方法。6.1 Prometheus Target状态为“DOWN”这是最常见的问题表示Prometheus无法从目标拉取数据。网络连通性问题排查在Prometheus服务器上使用curl -v http://target_ip:port/metrics命令测试。如果连接超时或拒绝说明网络或防火墙有问题。解决检查目标服务器的防火墙是否放行了Exporter端口如9100。检查安全组如果使用云服务器规则。确保Prometheus服务器能路由到目标IP。Exporter服务未运行排查登录到目标服务器执行systemctl status node_exporter或其他Exporter服务名查看状态。检查端口是否监听netstat -tlnp | grep port。解决启动服务并检查Exporter的日志journalctl -u node_exporter -f看是否有错误。Prometheus配置错误排查仔细检查prometheus.yml中对应job的targets格式是否正确。必须是[host:port]的YAML列表格式。缩进也很重要。解决使用YAML语法检查工具或在线检查器验证配置文件格式。修改后务必重启Prometheus。6.2 Grafana中查询不到数据或显示“No data”在Grafana面板中看到“No data”提示。数据源配置错误排查在Grafana的“Data Sources”配置中检查Prometheus的URL是否正确。点击“Save Test”看是否成功。解决确保URL能通。如果是本机用localhost:9090如果是跨机器用IP或域名并确保端口可访问。查询语句PromQL错误排查这是手动创建面板时的高发区。在Grafana面板的“Query”编辑框点击“Query inspector”按钮可以查看原始查询请求和返回结果。如果返回错误通常是PromQL语法或指标名错误。解决先回到Prometheus自身的Web UI9090端口在“Graph”页面的查询框中测试你的PromQL语句确保能返回数据。Prometheus的“Graph”页面对错误有更直接的提示。常见的错误是指标名拼写错误或者使用了不存在的标签label进行过滤。时间范围选择问题排查检查Grafana仪表盘右上角的时间范围选择器。如果你选择了一个未来时间或者很久以前而数据保留时间没那么长自然没有数据。解决选择合适的时间范围例如“Last 6 hours”或“Last 1 day”。6.3 服务器资源占用过高运行一段时间后发现Prometheus或Grafana进程占用了大量CPU或内存。Prometheus采集目标过多或频率过高现象Prometheus进程CPU持续高位。排查检查prometheus.yml中配置的scrape_interval和scrape_configs中的目标数量。过于频繁的采集如1秒一次或成千上万个目标会给服务器带来巨大压力。解决合理设置全局和job级别的scrape_interval通常15s-1min足够。对于大规模集群考虑使用Prometheus的联邦Federation架构或Thanos/Cortex等长期存储方案。Grafana仪表盘面板过多或查询复杂现象打开某个仪表盘时浏览器卡顿或Grafana服务器负载升高。排查一个仪表盘内如果有几十个面板且每个面板的查询都涉及长时间范围的数据聚合如sum_over_time(metric[1d])会给Prometheus和Grafana都带来巨大计算压力。解决优化仪表盘设计避免在一个仪表盘堆砌过多面板。优化PromQL查询尽量使用记录规则Recording Rules将频繁计算的复杂查询预先计算好并存储为新指标。Prometheus本地存储压力现象磁盘IO高磁盘空间增长快。排查监控prometheus_tsdb_storage_blocks_bytes指标。检查--storage.tsdb.path所在磁盘的使用率。解决调整数据保留策略--storage.tsdb.retention.time清理过期数据。将数据目录放在高性能磁盘如SSD上。对于海量数据必须规划长期存储方案。6.4 如何更新Exporter或Prometheus版本软件需要定期更新以获取新功能和安全补丁。通用升级步骤下载新版本压缩包。停止旧服务sudo systemctl stop service_name。备份旧程序目录和数据尤其是Prometheus的data目录和配置文件。解压新版本替换二进制文件或整个目录注意更新软链接。检查新版本的配置文件是否有语法变更必要时合并配置。启动新服务sudo systemctl start service_name。观察日志和服务状态确认运行正常。重要提醒Prometheus的数据格式在不同大版本间可能不兼容。从2.x升级到另一个2.x小版本通常是安全的但跨大版本升级如1.x到2.x需要查阅官方升级指南可能需要迁移数据。在生产环境升级前务必在测试环境充分验证。这套监控组合的安装和初步配置就像搭好了舞台。真正的精彩在于你如何利用PromQL去挖掘数据以及如何设计Grafana仪表盘来讲述系统的故事。从监控基础资源开始逐步深入到应用内部的自定义业务指标你会发现自己对系统的洞察力得到了质的飞跃。开始可能会觉得配置繁琐但一旦跑通它带来的稳定性和可观测性价值会让你觉得所有投入都是值得的。