17.9.2 抓取频率与保留策略优化

2. 抓取频率与保留策略优化#

本节聚焦 Prometheus 抓取频率与保留策略的设计、配置与优化,包含原理草图、完整配置示例、排错与练习。

2.1 原理草图:抓取频率与TSDB保留如何影响资源#

文章图片

2.2 抓取频率设计原则(含示例)#

  • 业务指标分级:核心SLA(成功率、延迟)短间隔;容量/版本长间隔。
  • 变更敏感度:QPS、队列堆积短间隔;温度、版本长间隔。
  • 成本权衡:间隔越短,样本量与TSDB负载线性增长。

示例:分层抓取间隔

# /etc/prometheus/prometheus.yml
global:
  scrape_interval: 30s
  evaluation_interval: 30s

scrape_configs:
  - job_name: "core-api"
    scrape_interval: 10s
    static_configs:
      - targets: ["10.0.0.11:9100","10.0.0.12:9100"]

  - job_name: "edge-metrics"
    scrape_interval: 60s
    static_configs:
      - targets: ["10.0.0.21:9100","10.0.0.22:9100"]

预期效果:核心服务以 10s 抓取,边缘服务以 60s 抓取,降低总体样本量。

2.3 抓取频率优化方法(命令+配置)#

  • 按作业拆分:高频与低频指标拆分 job。
  • 减小采集范围:过滤冗余指标、降低高基数。
  • 动态策略:压测期间调短,结束回收。

示例:丢弃高基数指标

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: "k8s-cadvisor"
    scrape_interval: 30s
    static_configs:
      - targets: ["10.0.0.31:9100"]
    metric_relabel_configs:
      # 丢弃容器层高基数指标
      - source_labels: [__name__]
        regex: "container_.*"
        action: drop

生效方式

# 检查配置
prometheus --config.file=/etc/prometheus/prometheus.yml --check-config
# 平滑重载
curl -X POST http://127.0.0.1:9090/-/reload

2.4 保留策略与存储权衡(含示例)#

  • 短期高精度:7–30天用于排障与告警。
  • 长期趋势:远程存储降采样保存。
  • 合规要求:受审计期限约束。

示例:本地保留与远程写入

# /etc/systemd/system/prometheus.service
[Service]
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --storage.tsdb.retention.time=15d \
  --storage.tsdb.retention.size=50GB \
  --web.enable-lifecycle
# /etc/prometheus/prometheus.yml
remote_write:
  - url: "http://thanos-receiver.monitoring.svc:19291/api/v1/receive"

预期效果:本地保留 15 天或 50GB,长期数据下沉远程存储。

2.5 抓取频率与保留联动计算(命令+示例)#

样本量估算公式
样本量 ≈ 目标数 × 指标数 × 采集频率 × 保留时间

示例:粗估存储需求(PromQL)

# 每秒样本写入速率
rate(prometheus_tsdb_head_samples_appended_total[5m])

容量评估脚本(示意)

#!/usr/bin/env bash
# sample_rate: 每秒样本数
sample_rate=50000
# retention: 秒
retention=$((15*24*3600))
# bytes_per_sample: 约 1-2 bytes 压缩后,粗估 1.5
bytes_per_sample=1.5

total_bytes=$(awk -v r=$sample_rate -v t=$retention -v b=$bytes_per_sample \
  'BEGIN{printf "%.0f", r*t*b}')
echo "Estimated bytes: $total_bytes"

预期效果:快速估算 retention 带来的磁盘压力。

2.6 排错与优化建议(含命令)#

1) 抓取耗时过长

# 抓取耗时分位数
histogram_quantile(0.99, sum(rate(scrape_duration_seconds_bucket[5m])) by (le, job))

处理:降低抓取频率、拆分 job、增加 exporter 资源。

2) TSDB 磁盘快速上涨

# TSDB样本写入速率
rate(prometheus_tsdb_head_samples_appended_total[5m])

处理:清理高基数标签或提高 retention.size 告警阈值。

3) 规则评估压力

# 规则评估耗时
rate(prometheus_rule_evaluation_duration_seconds_sum[5m]) 
/
rate(prometheus_rule_evaluation_duration_seconds_count[5m])

处理:延长 evaluation_interval,优化 PromQL。

2.7 练习#

  1. 将核心服务抓取间隔从 30s 调整为 10s,验证样本写入速率变化(对比 rate(prometheus_tsdb_head_samples_appended_total[5m]))。
  2. 为高基数指标添加丢弃规则,观察 TSDB 增长速度。
  3. 设置 retention.time=7d、retention.size=20GB,验证是否触发历史数据裁剪(检查 prometheus_tsdb_blocks_loaded 变化)。

2.8 最佳实践小结#

  • 抓取频率分级、作业拆分、指标瘦身是核心优化手段。
  • 本地保留不超过 30 天,长期趋势交由远程存储。
  • 定期复盘样本写入速率与查询耗时,持续优化成本与性能平衡。