强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

VictoriaMetrics 完全指南 / 07 - 数据保留与降采样

07 · 数据保留与降采样

本章目标

  • 掌握 VictoriaMetrics 的数据保留配置
  • 了解降采样(downsampling)策略
  • 学会设计数据生命周期管理方案
  • 掌握长期存储的最佳实践

7.1 数据保留配置

7.1.1 基础保留期设置

# 单节点版:保留 90 天
victoria-metrics -retentionPeriod=90d

# 集群版:在 vmstorage 上设置
vmstorage -retentionPeriod=90d

7.1.2 时间单位

单位含义示例
h小时720h (30 天)
d90d
w12w
m3m
y1y

7.1.3 分区保留策略

从 v1.93.0 起,支持按时间段设置不同保留期:

# 最近 7 天保留原始精度
# 7-30 天保留降采样数据
# 30-365 天保留更粗糙的数据
victoria-metrics \
    -retentionPeriod=1y \
    -dedup.minScrapeInterval=0s

注意:分区保留(per-day index)可以提升删除过期数据的效率。启用 -disablePerDayIndex=false(默认开启)时,每个自然天有独立的索引,删除时直接删除整个目录。


7.2 降采样(Downsampling)

7.2.1 什么是降采样

降采样是将高精度数据聚合为低精度数据的过程,用于减少长期存储的磁盘占用。

原始数据 (15s 间隔):
10:00:00  72.5
10:00:15  72.6
10:00:30  72.4
10:00:45  72.7
10:01:00  72.3
...
(一天 = 5760 个点)

降采样后 (5m 间隔):
10:00:00  avg=72.5  max=72.7  min=72.3  count=20
10:05:00  avg=72.1  max=72.8  min=71.5  count=20
...
(一天 = 288 个点)

7.2.2 vmselect 降采样

在查询时通过 vmselect 进行实时降采样:

# 配置降采样规则
# 格式:-dedup.minScrapeInterval=<间隔>
vmselect \
    -dedup.minScrapeInterval=15s \
    -search.maxStalenessInterval=5m

7.2.3 vminsert 级别去重

# 写入时去除重复数据(间隔内的重复值被丢弃)
vminsert \
    -dedup.minScrapeInterval=15s

提示:如果 Prometheus 配置了两个副本(HA pair),在 vmselect 和 vminsert 上都设置 -dedup.minScrapeInterval 与 Prometheus 的 scrape_interval 一致,可以自动去除重复数据。

7.2.4 vmauth + 多降采样策略

生产环境可以通过多层查询实现长期降采样:

架构:
┌────────────────────────────────────────────────────┐
│                    vmauth / vmauth                   │
│              (查询路由 / 负载均衡)                    │
└──────────────┬─────────────────────────────┬────────┘
               │ 查询最近 7 天                │ 查询 > 7 天
               ▼                              ▼
┌──────────────────────────┐  ┌──────────────────────────┐
│  vmselect (高精度)       │  │  vmselect (降采样)        │
│  vmstorage: 15s 保留 90d │  │  vmstorage: 5m 保留 1y    │
│  (dedup=0s)              │  │  (dedup=5m)               │
└──────────────────────────┘  └──────────────────────────┘

7.3 按指标类型设置保留期

7.3.1 使用外部标签区分

# 为不同优先级的指标添加 source 标签
# 在 Prometheus remote_write 中
remote_write:
  - url: "http://vm-high:8428/api/v1/write"
    write_relabel_configs:
      - source_labels: [__name__]
        regex: "(http_request_duration|error_rate|.*_critical.*)"
        action: keep
    # → 高优先级 VM 实例,保留 180 天

  - url: "http://vm-low:8428/api/v1/write"
    write_relabel_configs:
      - source_labels: [__name__]
        regex: "(go_.*|process_.*|node_exporter.*)"
        action: keep
    # → 低优先级 VM 实例,保留 30 天

7.3.2 推荐的保留策略

数据类别采集间隔保留期降采样策略
关键业务指标 (SLI)10-15s1-2 年30 天后降采样到 1m
基础设施指标15-60s90 天14 天后降采样到 5m
调试指标15s7 天不降采样
审计/合规指标实时3-7 年90 天后降采样到 5m

7.4 磁盘空间规划

7.4.1 存储大小估算公式

磁盘空间 ≈ 活跃序列数 × 每样本字节数 × 每天样本数 × 保留天数 × 1.3 (索引开销)

示例:
  活跃序列数 = 100 万
  每样本字节数 = 0.2 bytes (VM 压缩后)
  每天样本数 = 86400 / 15 = 5760 (15s 间隔)
  保留天数 = 90 天

  磁盘空间 = 1,000,000 × 0.2 × 5760 × 90 × 1.3
           = 100,000,000 × 0.2 × 5760 × 90 × 1.3 / 1,000,000,000
           ≈ 13.5 GB

7.4.2 不同场景的存储估算

活跃序列采集间隔保留期预估磁盘空间
10 万15s30d~1.5 GB
100 万15s90d~13.5 GB
500 万15s90d~67 GB
1000 万15s90d~135 GB
1000 万15s1 年~550 GB
5000 万15s1 年~2.7 TB

注意:以上估算基于典型压缩率(0.2 bytes/sample)。实际值可能因指标特征(计数器 vs gauge、值变化率)有 ±30% 波动。

7.4.3 使用 TSDB 状态 API 验证

# 查看当前存储状态
curl -s 'http://localhost:8428/api/v1/status/tsdb' | python3 -m json.tool

返回示例:

{
    "status": "success",
    "data": {
        "totalSeries": 1234567,
        "totalLabelValuePairs": 5678,
        "seriesCountByMetricName": [
            {"name": "cpu_usage", "value": 100000},
            {"name": "http_requests_total", "value": 50000}
        ],
        "seriesCountByLabelName": [
            {"name": "host", "value": 500},
            {"name": "job", "value": 50}
        ],
        "memoryAllocBytes": 1073741824
    }
}

7.5 备份与恢复窗口

保留期应与备份策略配合:

保留期与备份策略对照:

保留 30 天  → 每天备份,保留 7 天
保留 90 天  → 每天备份,保留 14 天
保留 1 年   → 每天备份 + 每月归档,保留 30 天
保留 3 年   → 每天备份 + 每月归档 + 每季度冷归档

7.6 数据生命周期管理最佳实践

7.6.1 分层存储方案

┌─────────────────────────────────────────────────┐
│                 数据生命周期                      │
├────────┬────────┬────────┬────────┬──────────────┤
│ 热数据  │ 温数据  │ 冷数据  │ 归档   │ 销毁         │
│ 0-7d   │ 7-30d  │ 30-90d │ 90d-1y │ > 1y        │
├────────┼────────┼────────┼────────┼──────────────┤
│ SSD    │ SSD    │ HDD    │ 对象存储│ 删除         │
│ 15s 原始│ 15s 原始│ 5m 降采样│ 1h 降采样│              │
│ 内存缓存│ 部分缓存│ 无缓存   │ 仅查询API│              │
└────────┴────────┴────────┴────────┴──────────────┘

7.6.2 自动清理脚本

#!/bin/bash
# vm-storage-cleanup.sh
# 监控磁盘使用率,在接近阈值时告警

THRESHOLD=85
DATA_PATH="/var/lib/victoria-metrics/data"
ALERT_EMAIL="ops@example.com"

CURRENT=$(df -h "$DATA_PATH" | tail -1 | awk '{print $5}' | sed 's/%//')

if [ "$CURRENT" -gt "$THRESHOLD" ]; then
    echo "WARNING: VictoriaMetrics disk usage at ${CURRENT}% (threshold: ${THRESHOLD}%)" | \
        mail -s "VM Disk Alert" "$ALERT_EMAIL"

    # 可选:自动减少保留期
    # kill -SIGHUP $(pgrep victoria-metrics)
fi

本章小结

要点内容
保留期通过 -retentionPeriod 配置,支持 h/d/w/m/y
降采样通过 -dedup.minScrapeInterval 实现
穁盘规划活跃序列 × 0.2 bytes/sample × 样本数 × 天数 × 1.3
分层存储热 SSD、温 SSD、冷 HDD、归档对象存储
最佳实践按业务重要性分层,配合备份策略

扩展阅读