一、序言
本篇文章将介绍如何部署prometheus组件alertmanager高可用,参考官网文档:https://github.com/prometheus/alertmanager#high-availability
二、部署高可用架构
部署3个alertmanager 节点:
满足条件:
- 3个节点使用相同的配置
- 向集群宣告自己的通信接口
- 配置所有的集群成员通信接口
在高可用(多实例)部署时,必须每个实例单独使用自己的存储,原因是:
- Alertmanager 存储的是节点本地处理的告警状态(如分片数据、本地通知记录),这些数据是节点私有的,不需要也不应该共享。
1. 部署3个alertmanager 节点
这里使用docker-compose在一台主机上部署3个alertmanager 节点
root@localhost:~# tree alertmanager
alertmanager
├── alertmanager.yml
└── docker-compose.yml
docker-compose.yml:
- 集群通信端口使用的都是
9094,配置文件由当前目录下的alertmanager.yml映射到容器的/etc/alertmanager/alertmanager.yml,并且在本地声明了卷,并挂载到容器的/alertmanager目录,alertmanager指定存储目录为/alertmanager
version: '3.8'
services:
# 节点 0
alertmanager-0:
image: quay.io/prometheus/alertmanager
container_name: alertmanager-0
restart: always
ports:
- "9093:9093" # Web UI 端口
- "9094:9094" # 集群通信端口(用于节点间同步)
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager-0-data:/alertmanager
command:
- "--config.file=/etc/alertmanager/alertmanager.yml"
- "--storage.path=/alertmanager"
- "--web.listen-address=0.0.0.0:9093"
- "--cluster.listen-address=0.0.0.0:9094" # 集群监听端口
- "--cluster.peer=alertmanager-1:9094" # 对端连接指向节点1
- "--cluster.peer=alertmanager-2:9094" # 对端连接指向节点2
networks:
- alertnet
# 节点 1
alertmanager-1:
image: quay.io/prometheus/alertmanager
container_name: alertmanager-1
restart: always
ports:
- "9095:9093" # 避免端口冲突,映射到主机9095
- "9096:9094"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager-1-data:/alertmanager
command:
- "--config.file=/etc/alertmanager/alertmanager.yml"
- "--storage.path=/alertmanager"
- "--web.listen-address=0.0.0.0:9093"
- "--cluster.listen-address=0.0.0.0:9094"
- "--cluster.peer=alertmanager-0:9094" # 对端连接指向节点0
- "--cluster.peer=alertmanager-2:9094" # 对端连接指向节点2
networks:
- alertnet
# 节点 2
alertmanager-2:
image: quay.io/prometheus/alertmanager
container_name: alertmanager-2
restart: always
ports:
- "9097:9093" # 映射到主机9097
- "9098:9094"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager-2-data:/alertmanager
command:
- "--config.file=/etc/alertmanager/alertmanager.yml"
- "--storage.path=/alertmanager"
- "--web.listen-address=0.0.0.0:9093"
- "--cluster.listen-address=0.0.0.0:9094"
- "--cluster.peer=alertmanager-0:9094" # 对端连接指向节点0
- "--cluster.peer=alertmanager-1:9094" # 对端连接指向节点1
networks:
- alertnet
networks:
alertnet: # 自定义网络,确保节点间通信
volumes:
alertmanager-0-data: {}
alertmanager-1-data: {}
alertmanager-2-data: {}
alertmanager.yml:
alertmanager.yml配置就不过多介绍,是一个钉钉告警:
global:
resolve_timeout: 5m
route:
group_by: ['instance'] # 按告警名称分组
group_wait: 30s # 首次分组等待时间
group_interval: 5m # 同组告警更新间隔
repeat_interval: 1h # 未恢复告警的重复通知间隔
receiver: 'dingtalk-webhook' # 告警接收器对象
# 告警对象配置
receivers:
- name: 'dingtalk-webhook'
webhook_configs:
- url: 'http://192.168.25.225:8060/dingtalk/webhook1/send'
send_resolved: true
# 告警抑制配置
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance','target_type','env'] # 相同标签的告警才会被抑制
启动docker-compos:
docker-compose -f docker-compose.yml up
2. 修改prometheus配置
/etc/prometheus/prometheus.yml:
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093
- 127.0.0.1:9095
- 127.0.0.1:9097
将所有alertmanagers节点添加上,并重新加载prometheus;
3. alertmanagers 是如何同步告警的
Alertmanager 集群不依赖中心化存储(如数据库),而是通过 Gossip 协议(流言协议) 实现分布式状态同步。
Gossip 协议是一种去中心化的信息传播机制,类似 “谣言扩散”:每个实例(节点)会定期将自身的告警状态数据,随机同步给集群内的其他节点;收到数据的节点再继续转发给其他节点,最终在短时间内实现全集群数据一致。
官网高可用架构图如下:

2235

被折叠的 条评论
为什么被折叠?



