17.8.2 双活/多副本采集与去重策略
双活/多副本采集的核心目标是提升采集可靠性与读可用性,同时避免重复告警与重复计费。本节给出双活部署原理、配置示例、去重机制、排错与练习。
原理与架构草图#
双活采集与外部标签配置示例#
示例在同一目标上部署两套 Prometheus,保持抓取参数一致,并通过 external_labels 标识副本。
文件路径: /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
external_labels:
cluster: prod
replica: prom-a # prom-b 上改为 prom-b
scrape_configs:
- job_name: node
static_configs:
- targets: ["10.0.0.11:9100","10.0.0.12:9100"]
relabel_configs:
- source_labels: [__address__]
target_label: instance
服务启动(systemd):
# Prometheus A
sudo systemctl enable --now prometheus
# Prometheus B
sudo systemctl enable --now prometheus
关键参数解释:
- external_labels:用于远端查询组件去重,必须在所有副本保持一致但 replica 不同。
- scrape_interval/timeout:双活副本必须一致,避免样本时间戳差异过大导致去重失败。
去重策略(Thanos 示例)#
Prometheus 原生不做去重,需在查询层实现。以 Thanos Query 为例:
Thanos Query 启动示例:
thanos query \
--http-address=0.0.0.0:9090 \
--store=10.0.0.21:10901 \
--store=10.0.0.22:10901 \
--query.replica-label=replica
预期效果:
- 同一 job/instance 的多副本样本会按 replica 去重,仅保留一份时间序列。
告警去重与抑制示例#
Alertmanager 通过分组与去重键避免重复通知。
文件路径: /etc/alertmanager/alertmanager.yml
route:
group_by: ['alertname','job','instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 2h
receivers:
- name: 'ops'
email_configs:
- to: ops@example.com
PromQL 中过滤副本(可选):
up{job="node", replica="prom-a"}
排错清单与命令#
1) 副本间采集差异
# 观察抓取时延与样本数
curl -s "http://prom-a:9090/api/v1/query?query=scrape_duration_seconds" | jq '.data.result[0]'
curl -s "http://prom-b:9090/api/v1/query?query=scrape_samples_post_metric_relabeling" | jq '.data.result[0]'
说明: scrape_duration_seconds 过高说明目标响应慢;scrape_samples_post_metric_relabeling 差异大说明标签或 relabel 配置不一致。
2) 去重失败
# 检查外部标签是否一致
curl -s http://prom-a:9090/api/v1/status/config | jq '.data.yaml' | grep external_labels -A3
curl -s http://prom-b:9090/api/v1/status/config | jq '.data.yaml' | grep external_labels -A3
说明: cluster 必须一致,replica 必须不同。
3) 重复告警
# 检查 Alertmanager 是否分组正确
amtool check-config /etc/alertmanager/alertmanager.yml
说明: group_by 中缺少 instance 或 job 会导致过度合并或过度分裂。
安装与验证示例(Prometheus 双实例)#
# 安装(以二进制为例)
useradd -r -s /sbin/nologin prometheus
tar -xzf prometheus-2.51.0.linux-amd64.tar.gz -C /opt/
ln -s /opt/prometheus-2.51.0.linux-amd64 /opt/prometheus
install -m 755 /opt/prometheus/prometheus /usr/local/bin/prometheus
install -m 755 /opt/prometheus/promtool /usr/local/bin/promtool
# 准备目录
mkdir -p /etc/prometheus /var/lib/prometheus
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
# 校验配置
promtool check config /etc/prometheus/prometheus.yml
# 启动后验证
curl -s http://localhost:9090/-/ready
curl -s http://localhost:9090/api/v1/query?query=up | jq '.data.result[:2]'
练习#
1) 在两台主机部署 Prometheus A/B,对同一 Node Exporter 进行双活采集,并在查询层通过 Thanos Query 去重。
2) 将 external_labels 中 cluster 改成不一致,观察去重失效的表现并恢复。
3) 制作一个告警规则 up == 0,验证 Alertmanager 分组策略是否只通知一次。