作为 VictoriaMetrics 用户,我们希望其具备数据删除能力。VictoriaMetrics 也确实支持删除操作,但是程度有限。由于实现上的问题,VictoriaMetrics 保持为一个 append-only 数据库,非常适合存储时序数据。这样的架构的缺点,就是修改、删除数据会变得非常昂贵。所以 VictoriaMetrics 对修改、删除操作的支持非常有限。
这篇指南说明两件事:如何删除 VictoriaMetrics 中的指标,以及如果某些历史数据值不对,如何通过导出、修改、删除、重新导入的方式间接更新。
核心摘要
- VictoriaMetrics 支持删除指标,但删除 API 不适合作为周期性任务使用,因为每次删除都会对性能产生影响。
- 删除前必须先用 series 查询验证选择器,避免误删不该删除的时间序列。
- 删除成功后,数据查询不到不代表磁盘空间立刻释放,空间释放依赖后续后台合并;必要时可以尝试强制合并。
- VictoriaMetrics 默认不提供直接更新数据的机制,只能通过导出、修改文件、删除原指标、重新导入来实现折中更新。
- 修改历史指标前要特别谨慎,最好先备份导出文件,并确认
match[]选择器、实例、job 和时间范围都符合预期。
如何删除指标
💡 警告:数据删除操作不建议作为一个周期性行为来执行。每次调用删除 API 都会对性能产生影响。提供删除 API 主要用于一次性需求,用于删除格式错误的数据或满足 GDPR 合规性。
删除 API 需要指定时序数据选择器。所以删除之前,首先要做的,应该是验证选择器是否匹配了期望的数据。这个检查步骤不能省,否则可能把同名指标下不该删除的标签组合一起删掉。
可以使用如下命令来检查:
# Warning: response can return many metrics, so be careful with series selector.
curl -s 'http://vmselect:8481/select/0/prometheus/api/v1/series?match[]=process_cpu_cores_available' | jq
预期输出:
{
"status": "success",
"isPartial": false,
"data": [
{
"__name__": "process_cpu_cores_available",
"job": "vmagent",
"instance": "vmagent:8429"
},
{
"__name__": "process_cpu_cores_available",
"job": "vmalert",
"instance": "vmalert:8880"
},
{
"__name__": "process_cpu_cores_available",
"job": "vminsert",
"instance": "vminsert:8480"
},
{
"__name__": "process_cpu_cores_available",
"job": "vmselect",
"instance": "vmselect:8481"
},
{
"__name__": "process_cpu_cores_available",
"job": "vmstorage",
"instance": "vmstorage-1:8482"
},
{
"__name__": "process_cpu_cores_available",
"job": "vmstorage",
"instance": "vmstorage-2:8482"
}
]
}
如果你确认时间序列选择器是符合预期的,接下来就可以发个POST请求执行删除,举例:
curl -s 'http://vmselect:8481/delete/0/prometheus/api/v1/admin/tsdb/delete_series?match[]=process_cpu_cores_available'
如果删除成功,删掉的数据就查不到了。不过存储空间不会立马释放,而是在后续数据文件后台合并的时候删除。前几个月的数据可能永远不会发生后台合并,因此不会为历史数据释放存储空间。这种情况下,可以尝试强制合并:
curl -v -X POST http://vmstorage:8482/internal/force_merge
merge 完成之后,数据就会从硬盘永久删除了。
这一节可以总结为三个动作:先查 series,确认选择器;再调用 delete_series;最后按需等待后台合并或执行 force_merge。
如何更新指标
VictoriaMetrics 默认不提供更新数据的机制。不过你可以通过如下方式曲线折中实现:
- 导出指标数据到文件中
- 修改文件中的 value
- 从 VictoriaMetrics 中删除相关指标
- 把刚才保存的文件中的数据重新导入
这里的“更新”本质上不是原地修改,而是重建一段指标数据。因此操作前要确认导出的数据就是要修改的范围,修改后的文件格式仍然能被 VictoriaMetrics import 接口识别。
导出指标
举个例子,导出node-exporter:9100这个实例和hostname.com这个job的node_memory_MemTotal_bytes指标:
curl -X POST -g http://vmselect:8481/select/0/prometheus/api/v1/export -d 'match[]=node_memory_MemTotal_bytes{instance="node-exporter:9100", job="hostname.com"}' > data.jsonl
检查一下导出的数据:
cat data.jsonl | jq
预期输出如下所示:
{
"metric": {
"__name__": "node_memory_MemTotal_bytes",
"job": "hostname.com",
"instance": "node-exporter:9100"
},
"values": [
33604390912,
33604390912,
33604390912,
33604390912
],
"timestamps": [
1656669031378,
1656669032378,
1656669033378,
1656669034378
]
}
在这个例子中,我们使用 sed 命令替换 node_memory_MemTotal_bytes 的值,从 33604390912 改成 17179869184。当然,你可以使用自己习惯的方式来做修改:
sed -i 's/33604390912/17179869184/g' data.jsonl
检查一下修改是否成功:
cat data.jsonl | jq
期望的输出如下:
{
"metric": {
"__name__": "node_memory_MemTotal_bytes",
"job": "hostname.com",
"instance": "node-exporter:9100"
},
"values": [
17179869184,
17179869184,
17179869184,
17179869184
],
"timestamps": [
1656669031378,
1656669032378,
1656669033378,
1656669034378
]
}
删除指标
前文介绍了删除方法,这里不再赘述。实际操作时,删除用的选择器应该和导出数据的范围保持一致,避免导入后出现新旧数据并存或误删其他序列。
导入指标
VictoriaMetrics 支持多种数据导入方式,下面我们使用从 json 文件导入的方式来导入数据:
curl -v -X POST http://vminsert:8480/insert/0/prometheus/api/v1/import -T data.jsonl
检查导入的指标
curl -X POST -g http://vmselect:8481/select/0/prometheus/api/v1/export -d match[]=node_memory_MemTotal_bytes
期望的输出如下:
{
"metric": {
"__name__": "node_memory_MemTotal_bytes",
"job": "hostname.com",
"instance": "node-exporter:9100"
},
"values": [
17179869184,
17179869184,
17179869184,
17179869184
],
"timestamps": [
1656669031378,
1656669032378,
1656669033378,
1656669034378
]
}
常见问题
VictoriaMetrics 删除指标适合做定时清理吗?
不适合。原文已经提示,删除 API 主要用于一次性需求,比如删除格式错误的数据或满足 GDPR 合规性。频繁调用删除 API 会影响性能。
delete_series 删除成功后,为什么磁盘空间没有马上释放?
因为 VictoriaMetrics 的存储文件需要在后台合并时释放空间。删除后数据可能已经查不到,但相关磁盘空间要等后续 merge 才会真正释放;某些历史数据如果长期不再合并,可能需要尝试 force_merge。
VictoriaMetrics 能直接 update 某个样本值吗?
默认不提供直接更新机制。可行的折中方案是先导出目标指标数据,修改导出文件中的 value,再删除原指标,最后重新导入修改后的数据。
总结
VictoriaMetrics 的 append-only 架构让写入和时序存储更适合监控场景,但也意味着修改和删除都不是低成本操作。删除指标时,核心是先验证选择器,再执行删除,并理解空间释放依赖后台合并。更新指标时,核心是把“更新”拆成导出、修改、删除、导入四步,确保每一步的数据范围都可控。
