17.9.5 资源配额与扩容规划实践

在Prometheus资源配额与扩容规划实践中,应以实际负载为基准,从CPU、内存、磁盘IO和网络四个维度制定配额与扩容策略,确保采集、存储与查询在高峰期稳定运行。

原理草图:资源消耗与扩容路径

文章图片

资源配额制定方法#

  • CPU:抓取、压缩、规则评估与查询为主要消耗点。建议预留30%冗余。
  • 内存:WAL缓存、TSDB索引与查询缓存为主;活跃序列越多,内存需求越高。
  • 磁盘:保留周期与写入速率决定容量;建议SSD。
  • 网络:抓取与远程写入的出入带宽需与目标端匹配。

指标与容量估算示例(PromQL)#

# 样本写入速率(samples/s)
rate(prometheus_tsdb_head_samples_appended_total[5m])

# 活跃时间序列规模
prometheus_tsdb_head_series

# WAL写入压力
rate(prometheus_tsdb_wal_fsync_duration_seconds_sum[5m])

容量估算命令示例(Linux)#

# 估算当前TSDB目录大小与增长趋势
du -sh /var/lib/prometheus
df -h /var/lib/prometheus

# 观察Prometheus进程资源
ps -o pid,cmd,%cpu,%mem -C prometheus

容量规划流程(可执行示例)#

  1. 统计当前活跃序列、样本写入速率与保留周期。
  2. 计算日增量与总容量需求(可估算压缩比)。
  3. 评估CPU、内存基线,校验查询高峰与规则评估开销。
  4. 进行压力测试,形成扩容触发阈值。

简易估算脚本(样本写入速率 → 日增量)#

#!/usr/bin/env bash
# 文件: /opt/prometheus/estimate.sh
# 说明: 通过Prometheus API查询写入速率估算日数据量
PROM_URL="http://127.0.0.1:9090"
RATE=$(curl -s "${PROM_URL}/api/v1/query?query=rate(prometheus_tsdb_head_samples_appended_total[5m])" \
  | jq -r '.data.result[0].value[1]')
# 假设每样本平均1.5字节压缩后(示例值)
BYTES_PER_SAMPLE=1.5
DAY_BYTES=$(echo "$RATE * 86400 * $BYTES_PER_SAMPLE" | bc)
echo "estimated_day_bytes=${DAY_BYTES}"

预期效果:输出estimated_day_bytes=xxxx,用于粗略评估日增量。

扩容策略与配置示例#

  • 纵向扩容:提升CPU与内存,用于缓解查询与规则评估压力。
  • 横向扩容:分片或联邦,将目标与规则分摊到多个实例。
  • 远程存储:历史数据迁移至长期存储,减轻本地TSDB压力。

Prometheus配置(远程写入与保留周期)#

# 文件: /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

storage:
  tsdb:
    retention_time: 15d

remote_write:
  - url: "http://thanos-receive:19291/api/v1/receive"
    queue_config:
      max_shards: 8
      capacity: 5000

预期效果:本地保留15天数据,同时写入远程存储。

分片抓取(示例:两实例分摊目标)#

# Prometheus-A: 只抓取以 -a 结尾的job
scrape_configs:
  - job_name: 'node-a'
    static_configs:
      - targets: ['10.0.0.1:9100','10.0.0.2:9100']

# Prometheus-B: 只抓取以 -b 结尾的job
scrape_configs:
  - job_name: 'node-b'
    static_configs:
      - targets: ['10.0.1.1:9100','10.0.1.2:9100']

K8s资源配额示例(Request/Limit)#

# 文件: prometheus-deploy.yaml
resources:
  requests:
    cpu: "2"
    memory: "4Gi"
  limits:
    cpu: "4"
    memory: "8Gi"

预期效果:避免抢占导致的抖动,保证稳定抓取与查询。

排错与验证#

常见问题:
- 查询慢:检查查询并发、规则评估和高基数指标。
- WAL膨胀:检查远程写入阻塞与磁盘IO。
- OOM:活跃序列过高或内存限制过小。

排错命令:

# Prometheus进程内存峰值
ps -o pid,cmd,%mem,rss -C prometheus

# 查看WAL与TSDB目录情况
ls -lh /var/lib/prometheus/wal
ls -lh /var/lib/prometheus/blocks

# 观察规则评估耗时
curl -s http://127.0.0.1:9090/metrics | grep prometheus_rule_evaluation_duration_seconds

练习#

  1. 用PromQL获取prometheus_tsdb_head_series并估算内存需求(假设每序列占用2KB)。
  2. 将本地保留周期从30d调整为15d,观察磁盘变化。
  3. 在两台Prometheus上进行分片抓取,并对比CPU与查询延迟变化。
  4. 模拟远程写入阻塞,观察WAL增长与磁盘占用变化。