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 天) |
d | 天 | 90d |
w | 周 | 12w |
m | 月 | 3m |
y | 年 | 1y |
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-15s | 1-2 年 | 30 天后降采样到 1m |
| 基础设施指标 | 15-60s | 90 天 | 14 天后降采样到 5m |
| 调试指标 | 15s | 7 天 | 不降采样 |
| 审计/合规指标 | 实时 | 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 万 | 15s | 30d | ~1.5 GB |
| 100 万 | 15s | 90d | ~13.5 GB |
| 500 万 | 15s | 90d | ~67 GB |
| 1000 万 | 15s | 90d | ~135 GB |
| 1000 万 | 15s | 1 年 | ~550 GB |
| 5000 万 | 15s | 1 年 | ~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、归档对象存储 |
| 最佳实践 | 按业务重要性分层,配合备份策略 |