保姆级教程:用Prometheus+AlertManager给你的服务器CPU、内存、磁盘上个“健康保险”
从零搭建服务器健康监控系统PrometheusAlertManager实战指南想象一下凌晨三点你的服务器突然因为CPU爆满而宕机而你还沉浸在梦乡中毫不知情。等到第二天早上客户投诉、数据丢失、服务中断的连锁反应已经无法挽回。这种噩梦般的场景正是我们需要给服务器上健康保险的原因。本文将手把手教你使用Prometheus和AlertManager这套黄金组合为你的Linux服务器打造全天候的健康监测与告警系统让你在问题发生前就能及时干预避免灾难性后果。这套方案特别适合拥有个人博客、测试环境或小型项目服务器的开发者与运维新手。你不需要成为监控专家只要跟着本文的步骤操作就能在几小时内建立起覆盖CPU、内存、磁盘等核心指标的监控体系。更重要的是我们会深入解释每个配置背后的逻辑让你不仅能知其然还能知其所以然未来可以根据实际需求灵活调整。1. 监控系统基础架构搭建在开始配置之前我们需要先了解整个监控系统的架构。Prometheus作为监控系统的核心负责定期从被监控的服务器我们称之为目标上拉取指标数据。这些数据通过运行在每台服务器上的Node Exporter组件采集。当指标超过预设阈值时Prometheus会触发告警规则将告警信息发送给AlertManager。AlertManager则负责对这些告警进行去重、分组并通过邮件、钉钉等渠道通知相关人员。1.1 安装Node ExporterNode Exporter是Prometheus生态中专用于采集主机级指标的组件。它能够收集CPU、内存、磁盘、网络等系统层面的监控数据。以下是安装步骤# 下载最新版Node Exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz # 解压文件 tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz # 移动二进制文件到系统目录 sudo mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/ # 创建系统服务文件 sudo tee /etc/systemd/system/node_exporter.service EOF [Unit] DescriptionNode Exporter Afternetwork.target [Service] Usernode_exporter Groupnode_exporter Typesimple ExecStart/usr/local/bin/node_exporter [Install] WantedBymulti-user.target EOF # 创建专用用户并启动服务 sudo useradd -rs /bin/false node_exporter sudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter安装完成后你可以通过curl http://localhost:9100/metrics验证Node Exporter是否正常工作。这个端点会返回大量的指标数据这些正是Prometheus将要收集的信息。1.2 安装与配置PrometheusPrometheus的安装过程与Node Exporter类似但配置更为复杂。我们需要明确告诉Prometheus从哪些目标采集数据以及如何识别这些数据。# 下载Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.33.1/prometheus-2.33.1.linux-amd64.tar.gz # 解压并移动文件 tar xvfz prometheus-2.33.1.linux-amd64.tar.gz sudo mv prometheus-2.33.1.linux-amd64 /usr/local/share/prometheus sudo ln -s /usr/local/share/prometheus/prometheus /usr/local/bin/prometheus接下来创建Prometheus的配置文件/etc/prometheus/prometheus.ymlglobal: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: node static_configs: - targets: [localhost:9100]这个基础配置告诉Prometheus每15秒从本地的Node Exporter端口9100采集一次数据。如果你有多台服务器需要监控只需在targets数组中添加更多的Node Exporter地址即可。创建系统服务文件/etc/systemd/system/prometheus.service[Unit] DescriptionPrometheus Afternetwork.target [Service] Userprometheus Groupprometheus Typesimple ExecStart/usr/local/bin/prometheus \ --config.file /etc/prometheus/prometheus.yml \ --storage.tsdb.path /var/lib/prometheus/ [Install] WantedBymulti-user.target最后创建用户并启动服务sudo useradd -rs /bin/false prometheus sudo mkdir /var/lib/prometheus sudo chown prometheus:prometheus /var/lib/prometheus sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus现在你可以通过浏览器访问http://服务器IP:9090来打开Prometheus的Web界面。在Status Targets页面你应该能看到node作业的状态为UP表示Prometheus已经成功连接到Node Exporter。2. 指标理解与告警规则配置监控系统的核心价值在于能够及时发现问题并通知相关人员。要实现这一点我们需要定义什么样的指标值算是有问题这就是告警规则的作用。在配置告警规则前我们需要先理解几个关键指标的含义。2.1 核心指标解析Node Exporter提供了数百个指标但对我们来说最重要的是以下几个CPU使用率node_cpu_seconds_total记录了CPU在各种模式下花费的时间单位秒。通过计算非空闲时间的比例我们可以得到CPU使用率。内存使用率node_memory_MemTotal_bytes和node_memory_MemAvailable_bytes分别表示总内存和可用内存。注意这里使用的是可用内存而非空闲内存因为Linux会利用空闲内存做缓存这部分内存实际上是可以立即回收的。磁盘使用率node_filesystem_size_bytes和node_filesystem_avail_bytes表示文件系统的总大小和可用空间。需要注意的是不同的文件系统类型如ext4、xfs需要分别处理。2.2 创建告警规则文件在Prometheus的配置目录下创建/etc/prometheus/rules/host.rules文件内容如下groups: - name: host-monitoring rules: - alert: HighCPUUsage expr: 100 * (1 - avg by(instance)(irate(node_cpu_seconds_total{modeidle}[5m]))) 80 for: 10m labels: severity: critical annotations: summary: 高CPU使用率 ({{ $value }}%) 在 {{ $labels.instance }} description: 实例 {{ $labels.instance }} 的CPU使用率已经超过80%持续10分钟 - alert: HighMemoryUsage expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 85 for: 15m labels: severity: critical annotations: summary: 高内存使用率 ({{ $value }}%) 在 {{ $labels.instance }} description: 实例 {{ $labels.instance }} 的内存使用率已经超过85%持续15分钟 - alert: HighDiskUsage expr: 100 * (node_filesystem_size_bytes{fstype~ext4|xfs} - node_filesystem_avail_bytes{fstype~ext4|xfs}) / node_filesystem_size_bytes{fstype~ext4|xfs} 90 for: 30m labels: severity: warning annotations: summary: 高磁盘使用率 ({{ $value }}%) 在 {{ $labels.mountpoint }} ({{ $labels.instance }}) description: 挂载点 {{ $labels.mountpoint }} (实例 {{ $labels.instance }}) 的磁盘使用率已经超过90%持续30分钟注意上述阈值CPU80%、内存85%、磁盘90%是示例值实际应用中需要根据你的服务器负载特性调整。生产环境通常需要更保守的阈值。为了让Prometheus加载这些规则我们需要修改prometheus.yml配置文件在global部分后添加rule_files: - /etc/prometheus/rules/*.rules然后重启Prometheus服务sudo systemctl restart prometheus2.3 阈值调整建议设置合理的告警阈值是一门艺术需要考虑以下因素服务器用途数据库服务器和Web服务器对资源的需求模式完全不同时间特性白天和夜晚的负载可能有显著差异业务关键性核心业务系统需要更敏感的告警以下是一些调整建议指标类型开发环境建议阈值生产环境建议阈值持续时间建议CPU使用率90%70-80%5-15分钟内存使用率90%80-85%10-30分钟磁盘使用率95%85-90%30-60分钟3. AlertManager配置与告警通知告警规则只是监控系统的一半另一半是如何有效地将这些告警传达给正确的人。这就是AlertManager的职责所在。AlertManager可以处理告警的去重、分组和路由确保你不会被同一问题的多个告警淹没同时相关的告警会被组织在一起发送。3.1 安装AlertManager# 下载AlertManager wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz # 解压并移动文件 tar xvfz alertmanager-0.23.0.linux-amd64.tar.gz sudo mv alertmanager-0.23.0.linux-amd64 /usr/local/share/alertmanager sudo ln -s /usr/local/share/alertmanager/alertmanager /usr/local/bin/alertmanager创建配置文件/etc/alertmanager/alertmanager.yml我们先配置一个简单的邮件通知route: group_by: [alertname, severity] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: email-notifications receivers: - name: email-notifications email_configs: - to: your-emailexample.com from: alertmanageryourdomain.com smarthost: smtp.yourdomain.com:587 auth_username: smtp-user auth_password: smtp-password require_tls: true创建系统服务文件/etc/systemd/system/alertmanager.service[Unit] DescriptionAlertManager Afternetwork.target [Service] Useralertmanager Groupalertmanager Typesimple ExecStart/usr/local/bin/alertmanager \ --config.file/etc/alertmanager/alertmanager.yml \ --storage.path/var/lib/alertmanager/ [Install] WantedBymulti-user.target创建用户并启动服务sudo useradd -rs /bin/false alertmanager sudo mkdir /var/lib/alertmanager sudo chown alertmanager:alertmanager /var/lib/alertmanager sudo systemctl daemon-reload sudo systemctl start alertmanager sudo systemctl enable alertmanager3.2 配置Prometheus与AlertManager通信为了让Prometheus能够将告警发送给AlertManager我们需要修改prometheus.yml文件添加以下内容alerting: alertmanagers: - static_configs: - targets: - localhost:9093重启Prometheus服务使配置生效sudo systemctl restart prometheus3.3 高级告警路由配置在实际生产环境中你可能希望不同类型的告警发送给不同的人或者在非工作时间只发送严重告警。这可以通过AlertManager的路由树实现。下面是一个更复杂的配置示例route: receiver: default-receiver group_by: [alertname, cluster] routes: - match: severity: critical receiver: critical-alerts group_wait: 10s repeat_interval: 30m - match_re: alertname: .*Disk.* receiver: storage-team group_interval: 5m receivers: - name: default-receiver email_configs: - to: teamexample.com - name: critical-alerts email_configs: - to: oncallexample.com webhook_configs: - url: http://alert-gateway/critical - name: storage-team email_configs: - to: storage-teamexample.com slack_configs: - api_url: https://hooks.slack.com/services/... channel: #storage-alerts这个配置实现了默认所有告警发送给团队邮箱严重(severitycritical)告警额外发送给值班人员并缩短重复间隔磁盘相关告警单独发送给存储团队并通过Slack通知4. 系统优化与实用技巧一个健壮的监控系统不仅需要正确配置还需要考虑性能和可用性。以下是几个提升监控系统效能的实用技巧。4.1 告警静默与维护窗口在进行系统维护时你可能希望暂时屏蔽某些预期的告警。AlertManager提供了静默(Silence)功能可以在Web界面(http://alertmanager-ip:9093)中配置。对于计划内的维护可以提前创建静默规则匹配特定的标签如instanceserver1设置静默的开始和结束时间添加注释说明静默原因4.2 监控系统自身的监控监控系统本身也需要被监控。建议为Prometheus和AlertManager设置基础的健康检查- alert: PrometheusDown expr: up{jobprometheus} 0 for: 1m labels: severity: critical annotations: summary: Prometheus down ({{ $labels.instance }}) description: Prometheus实例 {{ $labels.instance }} 已经下线超过1分钟 - alert: AlertManagerDown expr: up{jobalertmanager} 0 for: 1m labels: severity: critical annotations: summary: AlertManager down ({{ $labels.instance }}) description: AlertManager实例 {{ $labels.instance }} 已经下线超过1分钟4.3 性能优化建议随着监控目标的增加Prometheus的资源消耗也会增长。以下是一些优化建议调整抓取间隔对于不关键的指标可以适当延长scrape_interval限制指标数量在Node Exporter中使用--collector参数只启用需要的采集器长期存储考虑使用VictoriaMetrics或Thanos扩展存储能力分片对于大规模部署可以按业务线拆分Prometheus实例4.4 监控面板配置虽然Prometheus自带简单的图表功能但对于日常监控建议使用Grafana创建更丰富的仪表板。以下是一个快速安装Grafana的步骤# 在Ubuntu/Debian上安装 sudo apt-get install -y adduser libfontconfig1 wget https://dl.grafana.com/oss/release/grafana_8.3.4_amd64.deb sudo dpkg -i grafana_8.3.4_amd64.deb # 启动服务 sudo systemctl start grafana-server sudo systemctl enable grafana-server安装后访问http://grafana-ip:3000默认用户名和密码都是admin。添加Prometheus作为数据源后可以导入现成的Node Exporter仪表板ID1860。