前言

Prometheus 作为云原生时代的主流监控方案,单节点部署存在单点故障风险。生产环境中通常需要搭建多实例高可用架构,同时配合 Alertmanager 集群实现告警的高可用与去重。

本文记录完整的三节点高可用部署流程,适合运维学习和课程作业参考。


一、环境规划

1.1 节点规划

主机名 IP 地址 部署组件
Prometheus01 192.168.24.10 Prometheus + Node_exporter + Alertmanager + Grafana
Prometheus02 192.168.24.11 Prometheus + Node_exporter + Alertmanager
Prometheus03 192.168.24.12 Prometheus + Node_exporter + Alertmanager

1.2 端口说明

表格

组件 端口 用途
Prometheus 9090 指标查询 Web 界面
Alertmanager 9093 告警管理 Web 界面
Alertmanager 集群 9094 集群间 Gossip 通信
Node_exporter 9100 主机指标采集
Grafana 3000 可视化仪表盘

1.3 安装目录统一

将4个组件均解压至 /opt/monitor/ 目录下,便于统一管理:

/opt/monitor/
├── prometheus/
├── alertmanager/
├── node_exporter/
└── grafana/

二、第一台节点基础环境搭建(192.168.24.10)

2.1 前置准备

# 关闭防火墙(或按需放行端口)
systemctl stop firewalld
systemctl disable firewalld

# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 创建运行用户
useradd -M -s /sbin/nologin prometheus

# 创建统一目录
mkdir -p /opt/monitor

2.2 四个组件的 systemd 服务配置

四个组件分别编写 service 文件,统一用 systemd 管理。

Prometheus 服务
# /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/prometheus/prometheus \
    --config.file=/opt/monitor/prometheus/prometheus.yml \
    --storage.tsdb.path=/opt/monitor/prometheus/data/
Restart=always

[Install]
WantedBy=multi-user.target
Node_exporter 服务
# /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/node_exporter/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target
Alertmanager 服务(节点 1,后续会改集群参数)
# /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/alertmanager/alertmanager \
    --config.file=/opt/monitor/alertmanager/alertmanager.yml \
    --storage.path=/opt/monitor/alertmanager/
Restart=always

[Install]
WantedBy=multi-user.target
Grafana 服务

Grafana 安装包自带 service 文件,直接启用即可:

systemctl daemon-reload
systemctl start grafana
systemctl enable grafana --now

2.3 目录授权

bash

chown -R prometheus:prometheus /opt/monitor/prometheus
chown -R prometheus:prometheus /opt/monitor/alertmanager
chown -R prometheus:prometheus /opt/monitor/node_exporter

三、Prometheus 高可用配置

Prometheus 的高可用思路很简单:多台实例拉取相同的 targets,数据各自独立存储,任何一台挂掉不影响其他节点采集。

3.1 编辑 prometheus.yml

bash

vim /opt/monitor/prometheus/prometheus.yml

完整配置:

# ========== 全局配置 ==========
global:
  scrape_interval: 15s       # 每15秒抓取一次指标
  evaluation_interval: 15s   # 每15秒评估一次告警规则

# ========== Alertmanager 配置 ==========
# 配置所有 Alertmanager 节点地址,实现告警高可用
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - '192.168.24.10:9093'
      - '192.168.24.11:9093'
      - '192.168.24.12:9093'

# ========== 告警规则文件 ==========
rule_files:
  - "alert.yml"

# ========== 抓取任务配置 ==========
scrape_configs:
  # 监控 Prometheus 自身(3个节点)
  - job_name: 'prometheus'
    static_configs:
    - targets:
      - '192.168.24.10:9090'
      - '192.168.24.11:9090'
      - '192.168.24.12:9090'

  # 监控 Alertmanager 集群(3个节点)
  - job_name: 'alertmanager'
    static_configs:
    - targets:
      - '192.168.24.10:9093'
      - '192.168.24.11:9093'
      - '192.168.24.12:9093'

  # 监控主机指标(3台节点的 node_exporter)
  - job_name: 'node-exporter'
    static_configs:
    - targets: ['192.168.24.10:9100']
      labels:
        instance: Prometheus01
    - targets: ['192.168.24.11:9100']
      labels:
        instance: Prometheus02
    - targets: ['192.168.24.12:9100']
      labels:
        instance: Prometheus03

3.2 创建告警规则文件 alert.yml

bash

vim /opt/monitor/prometheus/alert.yml

yaml

groups:
- name: test-alert
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "实例 {{ $labels.instance }} 宕机"
      description: "{{ $labels.instance }} 已离线超过 1 分钟,请及时处理。"

3.3 重启生效

bash

systemctl restart prometheus

浏览器访问 http://192.168.24.10:9090 确认 Web 界面正常。


四、Alertmanager 集群高可用配置

Alertmanager 通过 Gossip 协议(9094 端口)组成集群,实现告警去重高可用。Prometheus 会同时向所有 Alertmanager 发送告警,集群内部自动合并,确保只发一次通知。

4.1 节点 1 的 alertmanager.service

# /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/alertmanager/alertmanager \
    --config.file=/opt/monitor/alertmanager/alertmanager.yml \
    --storage.path=/opt/monitor/alertmanager/ \
    --web.external-url=http://192.168.24.10:9093 \
    --cluster.listen-address=0.0.0.0:9094
Restart=always

[Install]
WantedBy=multi-user.target

节点 1 作为集群种子节点,只需要监听 9094 端口,不需要指定 peer。

4.2 节点 2 的 alertmanager.service

vim /usr/lib/systemd/system/alertmanager.service

完整内容:
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/alertmanager/alertmanager \
    --config.file=/opt/monitor/alertmanager/alertmanager.yml \
    --storage.path=/opt/monitor/alertmanager/ \
    --web.external-url=http://192.168.24.11:9093 \
    --cluster.listen-address=192.168.24.11:9094 \
    --cluster.peer=192.168.24.10:9094
Restart=always

[Install]
WantedBy=multi-user.target

4.3 节点 3 的 alertmanager.service

vim /usr/lib/systemd/system/alertmanager.service

[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/alertmanager/alertmanager \
    --config.file=/opt/monitor/alertmanager/alertmanager.yml \
    --storage.path=/opt/monitor/alertmanager/ \
    --web.external-url=http://192.168.24.12:9093 \
    --cluster.listen-address=192.168.24.12:9094 \
    --cluster.peer=192.168.24.10:9094
Restart=always

[Install]
WantedBy=multi-user.target

节点 2 和节点 3 通过 --cluster.peer 指向节点 1 加入集群,只要连上任意一个节点就能自动发现全部成员。


五、克隆虚拟机并配置另外两台节点

第一台全部配置好后,直接克隆出另外两台,效率最高。

5.1 克隆步骤

  1. 关闭 Prometheus01:shutdown -h now
  2. 在 VMware 中右键 → 管理 → 克隆 → 完整克隆
  3. 克隆两份,分别命名为 Prometheus02、Prometheus03
  4. 逐台开机修改,避免 IP 冲突

5.2 修改 IP 地址

bash

[root@prometheus02 ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.24.11/24 ipv4.gateway 192.168.24.2 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@prometheus02 ~]# nmcli c up ens160

# 节点2:192.168.24.11
# 节点3:192.168.24.12
节点3同节点2

5.3 修改主机名

bash

# 节点2
hostnamectl set-hostname Prometheus02

# 节点3
hostnamectl set-hostname Prometheus03

5.4 修改 alertmanager.service

分别替换节点 2 和节点 3 的 service 文件,然后:

bash

systemctl daemon-reload
systemctl restart alertmanager

5.5 关闭多余的 Grafana

节点 2、3 不需要 Grafana,停掉即可:

bash

systemctl stop grafana-server
systemctl disable grafana-server

5.6 启动全部服务

bash

systemctl start prometheus
systemctl start node_exporter
systemctl start alertmanager
systemctl enable prometheus node_exporter alertmanager

六、Grafana 配置数据源

Grafana 只在节点 1 部署,统一做可视化。

  1. 浏览器访问 http://192.168.24.10:3000,默认账号密码 admin/admin
  2. 左侧菜单 → ConnectionsData sourcesAdd data source
  3. 选择 Prometheus
  4. Prometheus server URL 填写:http://192.168.24.10:9090
  5. 底部点击 Save & test,绿色提示成功即可

后续可以导入 Node Exporter 仪表盘(推荐 ID:1860 / 8919)做主机监控展示。


七、163 邮箱告警配置

7.1 开启 163 邮箱 SMTP 服务

  1. 登录 mail.163.com
  2. 设置 → POP3/SMTP/IMAP → 开启 IMAP/SMTP 服务
  3. 短信验证后获取授权码(注意:不是登录密码)

7.2 修改 alertmanager.yml

global:
  resolve_timeout: 5m
  # 163邮箱SMTP配置
  smtp_smarthost: 'smtp.163.com:465'
  smtp_from: 'xxx@163.com'
  smtp_auth_username: 'xxx@163.com'
  smtp_auth_password: '你的授权码'
  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: '收件人@163.com'
    send_resolved: true   # 告警恢复也发通知

inhibit_rules: []

7.3 同步配置到三台节点

bash

scp /opt/monitor/alertmanager/alertmanager.yml root@192.168.24.11:/opt/monitor/alertmanager/
scp /opt/monitor/alertmanager/alertmanager.yml root@192.168.24.12:/opt/monitor/alertmanager/

三台都重启:

bash

systemctl restart alertmanager

八、验证与测试

8.1 检查配置文件

bash

# 检查 Alertmanager 配置
cd /opt/monitor/alertmanager
./amtool check-config alertmanager.yml

# 检查 Prometheus 配置
cd /opt/monitor/prometheus
./promtool check config prometheus.yml

8.2 查看 Prometheus Targets

访问 http://192.168.24.10:9090StatusTargets

确认 9 个目标(3 prometheus + 3 alertmanager + 3 node-exporter)全部 UP

8.3 查看 Alertmanager 集群状态

访问 http://192.168.24.10:9093Status → 找到 Cluster 区域

正常会显示 3 个节点的 IP 和端口,说明集群组建成功。

8.4 发送测试告警(v2 API)

注意:Alertmanager 0.27+ 版本已移除 v1 API,使用 v2 接口

bash

curl -X POST http://localhost:9093/api/v2/alerts \
  -H "Content-Type: application/json" \
  -d '[{
    "labels": {"alertname": "TestAlert", "instance": "example", "severity": "warning"},
    "annotations": {"summary": "测试告警"}
  }]'

发送后立刻刷新 Alerts 页面,三台 Alertmanager 都能看到同一条告警 → 集群同步正常。

8.5 验证邮件接收

触发告警后等待几十秒,检查 163 邮箱收件箱是否收到告警邮件。

查看邮箱

点开邮箱:


九、常见问题与排错

1. Target 显示 DOWN

  • 检查对端服务是否启动:systemctl status xxx
  • 检查防火墙是否放行端口
  • 两台机器之间 ping 测试网络连通性

2. Alertmanager 集群只有自己

  • 确认 9094 端口防火墙已放行
  • 检查 --cluster.listen-address 是否绑定了正确的网卡地址
  • 三台节点之间能否互相 telnet 9094 端口

3. 邮件发不出去

  • 550 认证失败:用的是邮箱登录密码,必须换成 SMTP 授权码
  • 连接超时:465 端口出站被拦截,换 25 端口或检查服务器网络
  • 进垃圾箱:163 反垃圾策略,把发件地址加入白名单

4. v1 API 报错 deprecated

Alertmanager 0.27 及以上版本移除了 v1 API,统一使用 /api/v2/alerts,并加上 Content-Type: application/json 请求头。


总结

本文完整实现了 Prometheus + Alertmanager 的三节点高可用架构:

  • Prometheus 高可用:多实例独立采集,任一节点故障不影响整体监控
  • Alertmanager 集群:Gossip 协议同步告警,自动去重,避免重复通知
  • Grafana 可视化:统一展示监控数据
  • 邮件告警:163 邮箱 SMTP 实现告警通知

这套架构是生产环境 Prometheus 监控的基础入门方案,后续可以在此基础上扩展 Thanos / VictoriaMetrics 实现长期存储,或者接入 Webhook 对接企业微信、钉钉等告警渠道。

更多推荐