深色模式
多活/同城告警去重
摘要:多活架构里一个底层故障(如共享存储)可能在 A、B 两个站点同时触发告警,值班人收到两份。本文用
group_by+inhibit+ 去重 key 把同源故障合并。
适用环境
- 至少两个站点(zone-a / zone-b)都上报同类告警
- 告警带有可标识“根因”的标签,如
root_cause_id
操作步骤
1. 给告警打“根因”标签
yaml
# 在 Prometheus rule 里带上层级标签
labels:
zone: zone-a
root_cause_id: storage-sh1
2
3
4
2
3
4
2. 用 inhibit 跨站点抑制
yaml
inhibit_rules:
# zone-b 的同类告警,被 zone-a 的 critical 抑制
- source_match: { severity: 'critical', zone: 'zone-a' }
target_match: { severity: 'warning', zone: 'zone-b' }
equal: ['root_cause_id']1
2
3
4
5
2
3
4
5
3. 用 group_by 聚合到根因
yaml
route:
group_by: ['root_cause_id', 'alertname']
group_wait: 30s
group_interval: 5m1
2
3
4
2
3
4
4. 集中到一个 Alertmanager
yaml
# 各站点 Prometheus 都指向同一个 Alertmanager 集群
alerting:
alertmanagers:
- static_configs:
- targets: ['am.cluster.example.com:9093']1
2
3
4
5
2
3
4
5
DANGER
多活 Alertmanager 必须跑 Gossip/集群模式共享 silences,否则在 A 站静默、B 站照样响。
验证
bash
amtool alert add alertname=StorageDown severity=critical zone=zone-a root_cause_id=storage-sh
amtool alert add alertname=StorageDown severity=warning zone=zone-b root_cause_id=storage-sh
amtool alert query # zone-b 应被 suppress1
2
3
2
3
常见坑
WARNING
root_cause_id靠人工打容易漏,最好由告警关联/拓扑系统自动注入,否则去重形同虚设。- 跨站点网络分区时 Gossip 会脑裂,silence 不同步,需监控集群健康。