完整监控体系搭建 —— Prometheus + Grafana 可视化与告警
要构建一个完整的服务器监控体系,通常需要Node Exporter (数据采集)、Prometheus (数据存储与告警)、Grafana (数据可视化) 和 Alertmanager (告警通知) 四个核心组件协同工作。
整个数据流的逻辑如下:
Node Exporter 采集指标 → Prometheus 定期抓取并存储 → Grafana 可视化呈现
Prometheus 发现异常 → Alertmanager 推送告警
⚙️ 环境准备与资源规划
在开始前,请规划好硬件并完成系统准备:
- 系统要求:一台搭载主流Linux发行版(如 Ubuntu 20.04+, CentOS 7+)的服务器。为了流畅体验,建议至少 2核 CPU,4GB 内存,并确保有 20GB 以上的可用磁盘空间。
- 网络要求:确保服务器能正常访问外网,用于下载组件。下文所有在服务器本机执行的步骤,若无特殊说明,均使用
localhost,你也可以根据实际情况替换为服务器的公网或内网IP。 - 组件端口规划:在防火墙中放行以下各组件的默认端口,便于后续访问。
- Node Exporter:
9100 - Prometheus:
9090 - Grafana:
3000 - Alertmanager:
9093
- Node Exporter:
🚀 第一步:Node Exporter 部署与验证
Node Exporter 负责采集服务器的硬件和操作系统级别指标。
-
下载并解压:在需要被监控的服务器上执行以下命令。
# 下载最新版本(以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 xvfz node_exporter-1.6.1.linux-amd64.tar.gz cd node_exporter-1.6.1.linux-amd64 -
启动服务:
# 直接后台运行 ./node_exporter & -
验证服务:通过浏览器访问
http://<服务器IP>:9100/metrics,如果能查看到大量以node_开头的指标数据,即表示部署成功。
🗄️ 第二步:Prometheus 安装与配置
Prometheus 是整个监控体系的核心,负责从 Node Exporter 拉取并存储数据。
-
安装并启动:
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz tar -xvf prometheus-2.48.0.linux-amd64.tar.gz cd prometheus-2.48.0.linux-amd64 ./prometheus --config.file=prometheus.yml & -
配置采集任务:编辑
prometheus.yml文件,在scrape_configs下新增一个用于抓取 Node Exporter 的job。# prometheus.yml global: scrape_interval: 15s # 全局抓取间隔 scrape_configs: - job_name: 'prometheus' # 监控Prometheus自身 static_configs: - targets: ['localhost:9090'] - job_name: 'node' # 新增job监控Node Exporter static_configs: - targets: ['localhost:9100']配置解释:
scrape_interval: 定义了Prometheus抓取指标数据的时间间隔,这里设为每15秒抓取一次。scrape_configs: 抓取目标的配置段。job_name: 'node': 我们为此抓取任务命名为node,便于在Prometheus中区分。targets: 在此数组中指定需要抓取的Node Exporter实例的地址和端口。可以添加多个目标来实现对多台服务器的监控。
-
验证数据:访问
http://<服务器IP>:9090/targets,确认node这个job的状态为UP。
📊 第三步:Grafana 安装与可视化
Grafana 负责将 Prometheus 中的枯燥数据转化为直观的图表。
-
安装并启动:
wget https://dl.grafana.com/oss/release/grafana-10.3.0.linux-amd64.tar.gz tar -xvf grafana-10.3.0.linux-amd64.tar.gz cd grafana-10.3.0/bin ./grafana-server &启动后,通过
http://<服务器IP>:3000访问,默认用户名/密码为admin/admin。 -
配置数据源:登录后,点击左侧齿轮图标的 “Configuration” → “Data Sources” → “Add data source”,搜索并选择 “Prometheus”。在 “URL” 栏填入
http://localhost:9090,然后点击 “Save & test”。若提示绿色成功,则连接正常。 -
导入官方仪表盘:
- 点击左侧 “+” → “Import”。
- 在 “Import via grafana.com” 输入框填入官方 Node Exporter 全量展示面板的ID
1860,点击右侧的 “Load”。 - 在底部 “Prometheus” 下拉框中选择刚创建的数据源,点击 “Import” 完成导入。
导入成功后,你将立刻看到一个包含CPU、内存、磁盘I/O、网络等丰富指标的炫酷仪表盘。
🔔 第四步:告警规则配置与 Alertmanager 集成
告警是完整监控体系中不可或缺的一环,让你从被动发现变成主动响应。
-
创建告警规则文件:在 Prometheus 目录下创建一个告警规则文件,例如
node_rules.yml。# node_rules.yml groups: - name: node_alerts rules: # 告警1: CPU使用率过高 - alert: HighCPUUsage expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)) * 100 > 80 for: 5m labels: severity: warning annotations: summary: "服务器 {{ $labels.instance }} CPU使用率过高" description: "当前CPU使用率: {{ $value | humanize }}% \n 已持续超过5分钟。" # 告警2: 内存可用量过低 - alert: HighMemoryUsage expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80 for: 5m labels: severity: warning annotations: summary: "服务器 {{ $labels.instance }} 内存可用量过低" description: "当前内存使用率: {{ printf \"%.2f\" $value }}% \n 已持续超过5分钟。" # 告警3: 磁盘空间不足 - alert: HighDiskUsage expr: (node_filesystem_size_bytes{fstype=~"ext4|xfs"} - node_filesystem_free_bytes{fstype=~"ext4|xfs"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100 > 85 for: 5m labels: severity: warning annotations: summary: "服务器 {{ $labels.instance }} 磁盘使用率过高" description: "挂载点 {{ $labels.mountpoint }} 当前使用率: {{ printf \"%.2f\" $value }}%" -
修改 Prometheus 配置:编辑
prometheus.yml文件,引入告警规则并指定 Alertmanager 的地址。# prometheus.yml global: scrape_interval: 15s # 1. 引入告警规则文件 rule_files: - 'node_rules.yml' # 2. 配置Alertmanager地址 alerting: alertmanagers: - static_configs: - targets: - 'localhost:9093' # ... scrape_configs 部分保持不变 -
处理告警:配置 Alertmanager
- 安装并启动:类似地,下载、解压并启动 Alertmanager。
- 配置
alertmanager.yml:这是定义告警如何通知的核心。下面是一个通过QQ邮箱发送告警的示例。
# alertmanager.yml global: resolve_timeout: 5m smtp_from: '你的QQ邮箱@qq.com' smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '你的QQ邮箱@qq.com' smtp_auth_password: '你的QQ邮箱授权码' smtp_require_tls: false route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'email-notifications' receivers: - name: 'email-notifications' email_configs: - to: '接收告警的邮箱@qq.com'注意:若要使用QQ邮箱,需登录网页版QQ邮箱,在
设置->账户中开启POP3/SMTP服务并获取一封授权码,用于smtp_auth_password字段。
✅ 验证与测试
启动所有服务后,你可以通过以下方式测试整个链路是否畅通:
- 检查
targets状态:访问http://<服务器IP>:9090/targets,确保所有目标状态皆为UP。 - 检查
rules状态:访问http://<服务器IP>:9090/rules,验证告警规则已加载。 - 检查
alerts状态:访问http://<服务器IP>:9090/alerts,可查看告警规则的当前状态(未触发时为绿色 Inactive)。 - 触发测试告警:手动停止 Node Exporter 服务(
kill其进程),等待约15秒后,在 Prometheus 的/alerts页面应能看到相应告警变为红色FIRING状态。随后,你配置的邮箱将收到一封告警邮件。
💎 总结
至此,你已经成功搭建了一套从数据采集 (Node Exporter) → 存储告警 (Prometheus) → 可视化分析 (Grafana) → 通知推送 (Alertmanager) 的完整服务器监控体系。
进阶
我们基于指定的环境来修改配置。先明确架构:
- Prometheus + Grafana + Alertmanager 所在主机:
192.168.80.11 - 被监控服务器:
192.168.80.12、192.168.80.13 - 各服务器都需要安装 Node Exporter 并开放 9100 端口
下面我会给出从安装到告警验证的完整命令,所有配置文件均按你的 IP 编写。
一、被监控端:安装 Node Exporter(在 12、13 上执行)
在 192.168.80.12 和 192.168.80.13 上都执行以下操作。
# 下载并解压
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
cd node_exporter-1.6.1.linux-amd64
# 直接后台运行
./node_exporter &
# 确认启动(应在本地能看到指标)
curl http://localhost:9100/metrics
防火墙放行(如果开启):
# iptables 或 firewalld,择一执行
sudo firewall-cmd --add-port=9100/tcp --permanent
sudo firewall-cmd --reload
# 或
sudo iptables -I INPUT -p tcp --dport 9100 -j ACCEPT
二、监控中心:Prometheus 配置(在 192.168.80.11 上执行)
1. 安装 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar -xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64
2. 配置 prometheus.yml
编辑 prometheus.yml,修改 scrape_configs,将两台服务器加入目标列表。
global:
scrape_interval: 15s
# 告警规则文件
rule_files:
- 'node_rules.yml'
# Alertmanager 地址(本机)
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_servers'
static_configs:
- targets:
- '192.168.80.12:9100'
- '192.168.80.13:9100'
labels:
env: 'production'
说明:同一 job_name 下的 targets 数组可包含多台机器,Prometheus 会自动为每条指标附加 instance="192.168.80.12:9100" 标签。
3. 创建告警规则文件 node_rules.yml
在 prometheus-2.48.0.linux-amd64 目录下创建该文件。
groups:
- name: node_alerts
rules:
# CPU 使用率 > 80%
- alert: HighCPUUsage
expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "服务器 {{ $labels.instance }} CPU 使用率过高"
description: "实例 {{ $labels.instance }} 当前 CPU 使用率: {{ $value | humanize }}%,已持续超过 5 分钟。"
# 内存可用率 < 20% (即使用率 > 80%)
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "服务器 {{ $labels.instance }} 内存不足"
description: "实例 {{ $labels.instance }} 当前内存使用率: {{ printf \"%.2f\" $value }}%,已持续超过 5 分钟。"
# 磁盘使用率 > 85%
- alert: HighDiskUsage
expr: (node_filesystem_size_bytes{fstype=~"ext4|xfs"} - node_filesystem_avail_bytes{fstype=~"ext4|xfs"}) / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "服务器 {{ $labels.instance }} 磁盘使用率过高"
description: "挂载点 {{ $labels.mountpoint }} 当前使用率: {{ printf \"%.2f\" $value }}%,已持续超过 5 分钟。"
4. 启动 Prometheus
./prometheus --config.file=prometheus.yml &
访问 http://192.168.80.11:9090/targets,应看到 node_servers 下两台机器状态均为 UP。
三、告警通知:Alertmanager 配置(在 192.168.80.11 上)
1. 安装 Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz
cd alertmanager-0.26.0.linux-amd64
2. 创建 alertmanager.yml
此处以 QQ 邮箱为例。请提前在 QQ 邮箱设置中开启 SMTP 服务并获取授权码。
global:
resolve_timeout: 5m
smtp_from: '你的发送邮箱@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '你的发送邮箱@qq.com'
smtp_auth_password: '你的QQ邮箱授权码'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '接收告警邮箱@qq.com'
3. 启动 Alertmanager
./alertmanager --config.file=alertmanager.yml &
四、Grafana 可视化(在 192.168.80.11 上)
wget https://dl.grafana.com/oss/release/grafana-10.3.0.linux-amd64.tar.gz
tar -xvf grafana-10.3.0.linux-amd64.tar.gz
cd grafana-10.3.0/bin
./grafana-server &
- 访问
http://192.168.80.11:3000,默认账号admin/admin。 - 添加数据源:URL 填
http://localhost:9090。 - 导入仪表盘:输入 Dashboard ID
1860,选择数据源后即可看到两台服务器的完整指标。
五、验证告警链路
-
检查规则状态:
http://192.168.80.11:9090/rules应看到node_alerts下的三条规则。 -
手动触发告警:在
192.168.80.12上停掉 Node Exporter:pkill node_exporter等待约 15 秒后,Prometheus 的
/alerts页面(http://192.168.80.11:9090/alerts)中应该会出现TargetDown之类的告警变为红色 FIRING,随后你的邮箱会收到邮件。(本配置里没有写 TargetDown 规则,若需此告警需单独添加,但手动停止后由于抓取失败,Prometheus 本身也会记录 alert,只是我们没有为该情况配置规则,你可以添加一条up == 0的规则来测试)。添加测试用规则(可临时放入
node_rules.yml):- alert: InstanceDown expr: up{job="node_servers"} == 0 for: 1m labels: severity: critical annotations: summary: "实例 {{ $labels.instance }} 已下线" description: "{{ $labels.instance }} 的 Node Exporter 已无法访问超过 1 分钟。"停止 Node Exporter 后,该告警将在 1 分钟后触发,邮箱会收到通知。
现在,你的 192.168.80.11 已作为监控中心,192.168.80.12 和 192.168.80.13 两端的服务器状态将被实时采集、可视化,并在 CPU、内存、磁盘超过阈值时自动发送邮件给你。如果需要调整告警阈值或添加更多机器,只需修改 prometheus.yml 的 targets 列表即可。