十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VictoriaMetrics 指标删除与替换实战:delete_series、force_merge 与导出-修改-导入工作流

VictoriaMetrics 指标删除与替换实战:delete_series、force_merge 与导出-修改-导入工作流 VictoriaMetrics 指标删除与替换实战delete_series、force_merge 与导出-修改-导入工作流【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetricsVictoriaMetrics 的存储架构以追加写入为设计核心删除与修改指标并非其常规能力因此官方提供了能力受限但足够完成特定任务的删除 API。本文以仓库内 guide-delete-or-replace-metrics 指南 为主体系统讲解在 VictoriaMetrics 单节点、集群与 Cloud 三种部署形态下如何用series端点精确确认待删除数据、如何通过delete_series删除时间序列、如何用force_merge真正释放磁盘空间以及如何通过导出 → 修改 → 删除 → 导入四步工作流实现指标的更新与替换。读完本文你将能够安全、可验证地完成指标的删除与修正操作并理解其底层实现机制。为什么数据删除在 VictoriaMetrics 中是受限操作VictoriaMetrics 的存储引擎是**追加式append-only**设计专门为持续写入与高效查询而优化而不是为删除或修改历史指标而设计。对已落盘数据的删除会引入额外的合并与索引清理成本可能造成显著的性能惩罚。因此官方 API 只提供有限的删除能力并明确建议数据删除只应被用于特定的、一次性的场景例如修正被错误写入的畸形数据如错误的标签、越界的时间戳、错误的指标值满足 GDPR 等合规要求删除特定时间序列的数据。优先考虑的两种替代方案在真正调用删除 API 之前官方指南建议先从架构层面减少删除需求在数据入口做 relabeling 过滤通过配置 relabeling在抓取阶段直接丢弃不需要的 target 与指标让垃圾数据根本不进入存储。例如可以基于标签匹配drop、keep、labelmap等规则做精细化裁剪。这是成本最低、最推荐的方式。合理设置数据保留期retention通过调整 retention 参数单节点默认保留 1 个月让过期数据被自动清理无需人工干预即可回收存储。只有在上述手段无法覆盖的一次性修正场景中才考虑使用删除 API。前置条件curl用于向 VictoriaMetrics HTTP API 发送请求jq用于格式化与校验 API 返回的 JSON 数据便于人工确认结果。本指南同时适用于VictoriaMetrics 单节点版VictoriaMetrics 集群版VictoriaMetrics Cloud 托管服务。API 端点总览单节点、集群与 Cloud 的差异VictoriaMetrics 提供的与指标生命周期管理相关的端点包括类型作用series返回匹配的序列名称及其标签组合export以 JSON line 格式导出原始样本import以 JSON line 格式导入样本delete_series删除匹配的时间序列force_merge强制压缩存储中的数据文件用于释放删除后占用的磁盘空间不同部署形态下这些端点的路径前缀与监听端口各不相同使用前必须先对准表格。从源码结构看端点的归属也印证了这一点series、export、delete_series由查询组件 vmselect 处理见 app/vmselect/main.go 中的路由分发import由写入组件 vminsert 处理见 app/vminsert/main.go而force_merge由存储组件 vmstorage 处理见 app/vmstorage/main.go。单节点版端点类型端点serieshttp://localhost:8428/prometheus/api/v1/seriesexporthttp://localhost:8428/api/v1/exportimporthttp://localhost:8428/api/v1/importdelete_serieshttp://localhost:8428/api/v1/admin/tsdb/delete_seriesforce_mergehttp://localhost:8428/internal/force_merge上表假设你已登录运行单节点 VictoriaMetrics 进程的机器如果部署在 Kubernetes 中则需要先把服务端口转发到localhost:8428kubectl get svc -l app.kubernetes.io/instancevmsingle输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmsingle-victoria-metrics-single-server ClusterIP None none 8428/TCP 24s然后执行端口转发kubectl port-forward svc/vmsingle-victoria-metrics-single-server 8428 集群版端点集群版中不同的 API 请求必须发给正确的服务组件否则无法生效类型服务端点seriesvmselecthttp://localhost:8481/select/0/prometheus/api/v1/seriesexportvmselecthttp://localhost:8481/select/0/prometheus/api/v1/exportimportvminserthttp://localhost:8480/insert/0/prometheus/api/v1/importdelete_seriesvmselecthttp://localhost:8481/delete/0/prometheus/api/v1/admin/tsdb/delete_seriesforce_mergevmstoragehttp://localhost:8482/internal/force_merge上表假设Account/Tenant ID 为0实际使用时请按你的多租户配置调整路径中的数字你已登录运行 VictoriaMetrics 各进程的机器若在 Kubernetes 中需先转发相关服务端口kubectl get svc -l app.kubernetes.io/instancevmcluster输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmcluster-victoria-metrics-cluster-vminsert ClusterIP 10.43.177.139 none 8480/TCP 5d7h vmcluster-victoria-metrics-cluster-vmselect ClusterIP 10.43.41.195 none 8481/TCP 5d7h vmcluster-victoria-metrics-cluster-vmstorage ClusterIP None none 8482/TCP,8401/TCP,8400/TCP 5d7h分别转发三个服务kubectl port-forward svc/vmcluster-victoria-metrics-cluster-vminsert 8480 kubectl port-forward svc/vmcluster-victoria-metrics-cluster-vmselect 8481 kubectl port-forward svc/vmcluster-victoria-metrics-cluster-vmstorage 8482 VictoriaMetrics Cloud 的差异Cloud 场景下需要做三处调整将基础 URL 替换为你的 Access Endpoint形如https://xxxx.cloud.victoriametrics.com在请求头中附加Authorization: Bearer YOUR_ACCESS_TOKEN根据你的 Cloud 部署类型单实例或集群调整端点路径。例如 Cloud 单实例查询 seriescurl -s -X POST -H Authorization: Bearer YOUR_ACCESS_TOKEN \ https://xxxx.cloud.victoriametrics.com/prometheus/api/v1/series \ -d match[]process_cpu_cores_available | jq删除指标先确认选择器再执行删除第一步用 series 端点确认待删除数据delete_seriesAPI 要求提供时间序列选择器time series selector格式为match[]time-series-selector。例如match[]process_cpu_cores_available选择指标名为process_cpu_cores_available的全部时间序列包含所有标签组合match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com}仅选择带有指定标签的序列。在删除任何数据之前务必先查询series端点确认选择器命中范围。单节点版curl -s -X POST http://localhost:8428/prometheus/api/v1/series -d match[]process_cpu_cores_available | jq集群版curl -s -X POST http://localhost:8481/select/0/prometheus/api/v1/series -d match[]process_cpu_cores_available | jq[!NOTE] 警告 响应可能返回一长串指标列表请务必小心选择器范围避免误删。如果返回结果为空说明默认时间窗口内没有数据——series端点默认只返回最近 5 分钟的数据。可以通过start参数扩大时间窗口例如查看最近 30 天curl -s -X POST http://localhost:8428/prometheus/api/v1/series \ -d match[]process_cpu_cores_available \ -d start-30d | jq输出示例isPartial: false表示返回结果完整{ status: success, isPartial: false, data: [ { __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:8482 } ] }第二步调用 delete_series 执行删除[!NOTE] 警告 删除操作不可撤销执行前请三思。官方文档特别提示删除接口在部分版本中接受任意 HTTP 方法误发 GET 请求也可能触发序列删除而从当前仓库源码看vmselect 已在 app/vmselect/main.go 中强制校验POST方法。无论哪种情况都强烈建议设置-deleteAuthKey保护该端点防止 CSRF 攻击导致数据被意外清空——该 flag 的定义位于 app/vmselect/main.go。确认选择器无误后以match[]time-series-selector的格式向delete_series端点发送 POST 请求。此操作无法回滚如需留底建议先按下一节的导出方法备份数据。单节点版删除process_cpu_cores_availablecurl -s -X POST http://localhost:8428/api/v1/admin/tsdb/delete_series -d match[]process_cpu_cores_available集群版curl -s -X POST http://localhost:8481/delete/0/prometheus/api/v1/admin/tsdb/delete_series -d match[]process_cpu_cores_availableCloud 单实例curl -s -X POST -H Authorization: Bearer YOUR_ACCESS_TOKEN \ https://xxxxx.cloud.victoriametrics.com/api/v1/admin/tsdb/delete_series \ -d match[]process_cpu_cores_available操作成功后被删除的序列将不再可查询。从源码看 delete_series 的语义边界深入 app/vmselect/prometheus/prometheus.go 的DeleteHandler实现可以确认两个关键行为删除不支持时间范围代码中明确校验if !cp.IsDefaultTimeRange() { return fmt.Errorf(delete API does not support specific time ranges using start and end args, the series can only be deleted completely) }——即start、end参数在删除场景下不被接受序列只能被整体删除这是理解删除语义的核心前提删除会联动清理查询缓存当deletedCount 0时DeleteHandler会调用promql.ResetRollupResultCache()重置 rollup 结果缓存避免缓存中的旧数据在删除后继续被查询到。在底层删除操作最终进入 lib/storage/storage.go 的Storage.DeleteSeries它会遍历所有分区partition的 indexDB调用各 indexDB 的DeleteSeries清理倒排索引并同步更新已删除的 metricID 集合。注释也明确指出删除是罕见操作因此不做并行处理侧面印证了删除应作为一次性操作使用。相关逻辑在 lib/storage/storage_test.go 的TestStorageDeleteSeries等测试中有覆盖验证。释放存储后台合并与 force_merge删除时间序列并不会立即释放磁盘空间。被删除序列占用的存储是在后台数据文件合并background merges过程中回收的而历史数据的分区可能永远不会触发合并导致空间长期无法回收。此时可以主动触发强制合并forced merge合并完成后数据才会被永久从磁盘上清除。单节点版触发强制合并curl -v -X POST http://localhost:8428/internal/force_merge集群版需要发给 vmstorage端口 8482curl -v -X POST http://localhost:8482/internal/force_merge[!NOTE] 注意 强制合并在 VictoriaMetrics Cloud 上不可用。如果 Cloud 用户在删除序列后需要管理存储请与官方支持联系。从 app/vmstorage/main.go 的实现可以看出force_merge的两个特性异步执行处理器在收到请求后立即返回实际合并通过 goroutine 在后台运行并统计vm_active_force_merges等指标见 app/vmstorage/main.go合并开始与结束都会记录详细日志支持partition_prefix参数可通过 query 参数限定只合并指定分区前缀的数据便于精细控制合并范围。同时vmstorage 也提供了forceMergeAuthKey定义见 app/vmstorage/main.go用于保护/internal/force_merge端点生产环境中建议配置。更新与替换指标导出-修改-删除-导入四步工作流VictoriaMetrics不提供原地替换或更新数据的机制。作为官方认可的变通方案替换指标需要走以下四步将目标时间序列导出到文件修改导出文件中的值从数据库中删除这些时间序列将修改后的文件重新导入 VictoriaMetrics。第一步导出指标以下示例导出指标node_memory_MemTotal_bytes且标签限定为instancenode-exporter:9100、jobhostname.com。单节点版curl -s -X POST -g \ http://localhost:8428/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} data.jsonl集群版curl -s -X POST -g \ http://localhost:8481/select/0/prometheus/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} data.jsonlCloud 单实例curl -s -X POST -H Authorization: Bearer YOUR_ACCESS_TOKEN \ https://xxxxx.cloud.victoriametrics.com/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} data.jsonl注意导出命令中的-g--globoff选项它关闭 curl 对 URL 中{}、[]等字符的通配符解析确保带花括号的标签选择器被原样传递。导出文件为 JSON line 格式可以用 jq 校验内容jq data.jsonl输出示例{ 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约 32GB改为17179869184约 16GBsed -i s/33604390912/17179869184/g data.jsonl再次校验文件内容jq data.jsonl输出示例{ metric: { __name__: node_memory_MemTotal_bytes, job: hostname.com, instance: node-exporter:9100 }, values: [ 17179869184, 17179869184, 17179869184, 17179869184 ], timestamps: [ 1656669031378, 1656669032378, 1656669033378, 1656669034378 ] }第三步删除原时间序列按前文删除指标一节的方法将node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com}从数据库中删除。因为删除 API 不支持时间范围这里删除的是该选择器命中的全部历史数据。第四步导入修改后的数据VictoriaMetrics 支持多种数据导入协议本例直接使用 JSON line 格式导入。import端点由 vminsert 组件处理见 app/vminsert/main.go它会把请求体中的 JSON line 流式解析并写入存储。单节点版curl -v -X POST http://localhost:8428/api/v1/import -T data.jsonl集群版发给 vminsert端口 8480curl -v -X POST http://localhost:8480/insert/0/prometheus/api/v1/import -T data.jsonlCloud 单实例curl -s -X POST -H Authorization: Bearer YOUR_ACCESS_TOKEN \ https://xxxxx.cloud.victoriametrics.com/api/v1/import \ -T data.jsonl[!NOTE] 注意事项 导入带有旧时间戳的数据被称为backfilling数据回填。回填的数据可能不在缓存中需要按 Single-server-VictoriaMetrics 文档中关于 backfilling 的说明重置相应缓存例如重启后或通过-search.resetCacheOnFirstRequest相关机制刷新才能保证查询结果正确。第五步验证导入结果导入完成后用export端点验证数据是否正确落库。单节点版curl -s -X POST -g http://localhost:8428/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} | jq集群版curl -s -X POST -g http://localhost:8481/select/0/prometheus/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} | jqCloud 单实例curl -s -X POST -H Authorization: Bearer YOUR_ACCESS_TOKEN \ https://xxxxx.cloud.victoriametrics.com/api/v1/export \ -d match[]node_memory_MemTotal_bytes{instancenode-exporter:9100, jobhostname.com} | jq输出应显示修改后的新值{ metric: { __name__: node_memory_MemTotal_bytes, job: hostname.com, instance: node-exporter:9100 }, values: [ 17179869184, 17179869184, 17179869184, 17179869184 ], timestamps: [ 1656669031378, 1656669032378, 1656669033378, 1656669034378 ] }确认新值已生效即完成了整个替换指标的工作流。故障排查与 API 交互遇到问题时按以下顺序排查移除 curl 命令中的-s让错误信息直接显示到终端追加-v参数查看详细的 HTTP 请求与响应头确认实际发出的请求路径与方法核对当前部署形态对应的端点与端口单节点是 8428集群版则要区分 vmselect(8481)、vminsert(8480)、vmstorage(8482)Cloud 则需替换 Access Endpoint 并携带 Bearer Token在 Kubernetes 中部署时确认已正确执行kubectl port-forward且转发的端口与命令中使用的端口一致。延伸阅读API 示例合集series、export、import、delete_series等端点的完整用法Relabeling 指南在入口处丢弃不需要的 target 与指标从源头避免删除需求保留期retention配置通过自动清理过期数据管理存储核心概念理解时间序列、标签与查询语义有助于写出精确的删除选择器VictoriaMetrics 集群组件与多租户理解集群版 URL 路径中租户 ID 的语义。【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表