如何在Linux上配置高可用的监控报警系统

来源:程序开发作者:卡拉米头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何在Linux上配置高可用的监控报警系统》,敬请观看详情。单点监控服务一旦宕机,业务异常便无人知晓。Prometheus配合Alertmanager可通过多实例部署与Gossip机制避免报警丢失。本文说明用两台Linux主机搭建共享配置、独立存数的监控架构,借助Keepalived提供虚拟IP,Nginx转发请求,当某节点失效时报警链路仍正常运转,并给出具体配置片段与避坑要点。

在Linux环境下构建不会因单台机器故障而失灵的监控报警体系,核心思路是让数据采集与通知能力分散到多个节点,同时对外呈现统一入口。Prometheus负责指标拉取与规则评估,Alertmanager负责去重、分组与渠道发送,两者均支持水平复制,因此天然适合做高可用。

如何在Linux上配置高可用的监控报警系统

一、整体架构设计

我们准备两台Linux服务器,分别命名为 node-a 与 node-b,系统均使用 Ubuntu 22.04。两台机器上都运行 Prometheus 与 Alertmanager 实例,Prometheus 通过相同 scrape 配置抓取被监控目标,Alertmanager 之间通过 Gossip 协议同步通知状态,避免重复报警。前端使用 Keepalived 生成虚拟IP(VIP),Nginx 将流量转发到本地实例,当一台机宕机,VIP 漂移到另一台,监控界面与报警出口都不中断。

这种架构不需要共享存储,每个 Prometheus 本地保留自己的时序数据,短期故障恢复后历史仍在。若需要长期集中存储,可后续接入远程写组件,但高可用报警本身不依赖它。下表列出关键组件分工:

组件部署位置主要作用
Prometheusnode-a, node-b拉取指标、执行告警规则
Alertmanagernode-a, node-b接收告警、去重、发邮件或webhook
Keepalivednode-a, node-b管理VIP,故障转移
Nginxnode-a, node-b反向代理本地服务

二、Prometheus与Alertmanager基础配置

在两台机器上创建相同的 prometheus.yml,确保告警规则一致。下面示例中 Prometheus 抓取自身与另一台节点的 node_exporter,并将告警推给本地 Alertmanager。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - /etc/prometheus/rules/*.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['127.0.0.1:9093']

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9090']
  - job_name: 'node'
    static_configs:
      - targets: ['node-a:9100', 'node-b:9100']

告警规则文件可定义如实例宕机这类条件。例如当 node_up 指标为 0 持续一分钟即触发。两个节点的规则内容必须完全相同,否则会出现一边报警另一边静默的混乱。

Alertmanager 配置需开启集群模式,通过 --cluster.listen-address 与 --cluster.peer 参数互联。以下为 alertmanager.yml 示例,使用邮件发送,并配置分组等待时间:

global:
  smtp_smarthost: 'smtp.ipipp.com:587'
  smtp_from: 'alert@ipipp.com'
  smtp_auth_username: 'alert@ipipp.com'
  smtp_auth_password: 'password'

route:
  receiver: 'email'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

receivers:
  - name: 'email'
    email_configs:
      - to: 'admin@ipipp.com'

三、实现高可用与故障转移

启动 Alertmanager 时,node-a 执行如下命令,node-b 将 peer 指向 node-a 的 9094 端口:

# node-a
alertmanager 
  --config.file=/etc/alertmanager/alertmanager.yml 
  --cluster.listen-address=0.0.0.0:9094

# node-b
alertmanager 
  --config.file=/etc/alertmanager/alertmanager.yml 
  --cluster.listen-address=0.0.0.0:9094 
  --cluster.peer=node-a:9094

这样两个 Alertmanager 通过 Gossip 交换静默与通知状态,任意一方发出邮件后,另一方不会重复发送。Keepalived 的配置则保证 VIP 始终在健康节点。以下为 keepalived.conf 精简版,使用 VRRP 脚本检测 Nginx 存活:

vrrp_script chk_nginx {
  script "pidof nginx"
  interval 2
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 150
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.0.100
  }
  track_script {
    chk_nginx
  }
}

node-b 的 priority 设为 100 且 state 为 BACKUP。当 node-a 的 Nginx 停止,VIP 漂到 node-b,用户访问 192.168.0.100 依然能看到 Prometheus 页面并触发报警。需要注意,防火墙必须放行 9090、9093、9094 及 VRRP 协议,否则集群与漂移都会失败。

四、验证与常见误区

验证时可手动停掉 node-a 的 Prometheus 进程,观察 node-b 是否在评估周期内发出告警,并检查邮件是否只收到一次。也可用 curl 向任意 Alertmanager 提交静默,看另一台是否同步。很多人误以为两个 Prometheus 必须连同一个 Alertmanager 才算高可用,其实让每个 Prometheus 连本地 Alertmanager 再互联,才是官方推荐做法。

另一个常见错误是 scrape 配置写死单台 IP,导致 VIP 切换后抓取目标不变。应当将被监控主机名或域名写入配置,配合 DNS 或 hosts 文件解析,保证任意节点都能拿到全部目标。完成上述步骤后,一套在 Linux 上抗单点故障的监控报警系统便搭建完毕。

PrometheusAlertmanager高可用修改时间:2026-08-06 21:42:17

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。