大家好,我是 WeiyiGeek,一个正在向全栈工程师(SecDevOps)前进的计算机技术爱好者,欢迎各位道友一起学习交流、一起进步 ,若此文有帮助请点个关注,后续追番不迷路 ❤️。
背景:VictoriaMetrics 理解为一个高性能、高性价比、可扩展的时间序列数据库(TSDB)和监控解决方案,如果您正在寻找一个速度快、占用资源少、易于管理、又能很好地融入 Prometheus 生态的时间序列数据库来存储和查询监控指标,VictoriaMetrics 是一个非常值得考虑的选择。
作者即将在【可观测性监控实践】专栏发布企业中监控可观测性入门到落地实践,希望大家多多支持,此外也可加入作者【全栈工程师修炼指南】知识星球获取实时专栏文章,和相关可视化模板更新,以及问题答疑。
为啥需要 Prometheus 数据快照?
通过 Prometheus 基本上在一台机器上运行,若运维人员希望备份数据,或迁移采集的数据到其它时序数据库中,例如,此小节将实践将 Prometheus 指标数据迁移到 VictoriaMetrics 的需求。
在 Prometheus 1.x 中,这是一个缓慢且具有破坏性的过程,需要完全重新启动 Prometheus。好消息是,由于后续使用了新的存储引擎,从 Prometheus 2.1 版本开始,添加了一个 API 端点来拍摄快照,让我们看看如何使用它。
如何创建 Prometheus 数据快照?
前提条件,要使用它,您必须在运行 Prometheus 时指定启用 Admin API 端点参数,例如:
$ ./prometheus --storage.tsdb.path=/data/ --web.enable-admin-api
然后, 你可以使用一个简单的 HTTP POST 请求来请求生产快照,等待几秒钟后,它在JSON对象中返回了新快照的名称,例如
$ curl -XPOST 127.0.0.1:9090/api/v1/admin/tsdb/snapshot
{"status":"success","data":{"name":"20250418T070445Z-3f070b1856d27be8"}}
此时,你将会在数据目录的快照目录下查看,你会看到这个快照文件。
$ cd /data/snapshots
$ ls -
drwxr-xr-x 3 root root 4.0K 4月18日 15:04 .
drwxr-xr-x 35 root root 4.0K 4月18日 15:04 ..
drwxr-xr-x 33 root root 4.0K 4月18日 15:04 20250418T070445Z-3f070b1856d27be8
特别注意:Prometheus 快照由现有块的硬链接和当前打开块的转储组成,由于使用硬链接,这意味着旧块的快照不会占用额外的磁盘空间,因为磁盘上只有一个副本,但是如果您更改它们,它们的权限或它们的用户/组,则可能会破坏 Prometheus 数据。当你完成数据迁移后,你可以 rm -rf 快照目录,因为虽然快照最初只占用很少的额外磁盘空间,一旦原始块被删除/压缩,快照就会成为保持磁盘空间使用的东西。
如何将 Prometheus 数据迁移到 VictoriaMetrics?
vmctl (VictoriaMetrics Control) 是 VictoriaMetrics 提供的一个命令行工具,它的主要设计目标是在不同的存储系统之间迁移(migrate )时间序列数据,vmctl 工具文档: https://docs.victoriametrics.com/vmctl/
首先,通过 VictoriaMetrics 官方提供的 vmutils 工具包,来获取 vmctl 工具包。
# 下载 vmutils 工具包
VERSION=v1.102.0
wget -L https://gh.wygk.eu.org/https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VERSION}/vmutils-linux-amd64-${VERSION}.tar.gz
# 解压工具包,查看包含的组件
tar -zxvf vmutils-linux-amd64-${VERSION}.tar.gz -C /usr/local/bin/
# vmagent-prod
# vmalert-prod
# vmalert-tool-prod
# vmauth-prod
# vmbackup-prod
# vmrestore-prod
# vmctl-prod
mv /usr/local/bin/vmctl-prod /usr/local/bin/vmctl
# 验证 vmctl 版本信息
vmctl --version
# vmctl version vmctl-20240717-185220-tags-v1.102.0-0-g65bb429b81
# 2025/04/18 15:45:25 Total time: 237.131µs
然后,ctl 工具进行 Prometheus 数据迁移,更多参数可执行 vmctl prometheus --help 查看详细的帮助信息。
# 语法
NAME:
vmctl prometheus - Migrate time series from Prometheus
USAGE:
vmctl prometheus [command options]
# 关键参数:
--prom-snapshot value # 指定 Prometheus 快照目录.
--prom-concurrency value # 并发运行的快照读取器数量(默认值:1)
--prom-filter-time-start value # RFC3339格式的时间过滤器,提供值的开始时间序列 E.g. '2020-01-01T20:07:00Z'
--prom-filter-time-end value # RFC3339格式的时间过滤器,提供值的结束时间序列 E.g. '2020-01-01T20:08:00Z'
--prom-filter-label value # 按照匹配的标签提取,E.g. '__name__' will filter timeseries by name.
--prom-filter-label-value value # 按照指定的标签提取,E.g. ".*"
--vm-concurrency value # 向VM执行导入并发数量 (default: 2)
--vm-batch-size value # 在单次写入请求中,最多向 VM 目标发送多少数据点 (default: 200000)
# 例如,迁移 2025-04-17 当天的数据到 VictoriaMetrics中,读取并发数量为3,导入并发数量为1,单次样本数量为 200000。
vmctl prometheus
--prom-snapshot=/data/prometheus/snapshots/20250418T070445Z-3f070b1856d27be8
--prom-filter-time-start=2025-04-17T00:00:01Z
--prom-filter-time-end=2025-04-17T23:59:59Z
--prom-concurrency=3
--vm-concurrency=1
--vm-batch-size=200000
# 执行过程信息如下:
# Prometheus import mode
# Prometheus snapshot stats:
# blocks found: 31;
# blocks skipped by time filter: 27;
# min time: 1744848000977 (2025-04-17T08:00:00+08:00);
# max time: 1744934400000 (2025-04-18T08:00:00+08:00);
# samples: 22846992;
# series: 28392.
# * Stats numbers are based on blocks meta info and don't account for applied filters.
# Found 4 blocks to import. Continue? [Y/n] y
# VM worker 0:↓ 1580443 samples/s
# Processing blocks: 4 / 4 [███████████████████████████████████████████████████████████████████████████████████████████████████] 100.00%
# 2025/04/18 16:16:47 Import finished!
# 2025/04/18 16:16:47 VictoriaMetrics importer stats:
# idle duration: 995.289323ms;
# time spent while importing: 14.137585359s;
# total samples: 22846888;
# samples/s: 1616038.91;
# total bytes: 440.5 MB;
# bytes/s: 31.2 MB;
# 2025/04/18 16:16:47 Total time: 24.861138465s
最后,验证导入的数据块在 VictoriaMetrics 中是否存在。
# export blocks from VictoriaMetrics
curl 127.0.0.1:8428/api/v1/export/native -g -d 'match[]={__name__!=""}' -o exported_data_block
# check file size
-rw-r--r-- 1 root root 7.2M 4月18日 16:21 exported_data_block
# verify block content
vmctl verify-block exported_data_block
# 2025/04/18 16:21:51 verifying block at path="exported_data_block"
# 2025/04/18 16:21:51 successfully verified block at path="exported_data_block", blockCount=25078
# 2025/04/18 16:21:51 Total time: 80.108623ms
或者,通过 VictoriaMetrics 自带的 vmui 工可视化具,来验证数据是否导入成功,例如,作者查询在IPMI导出器采集的指标数据 ipmi_bmc_info{job="ipmi_inspur_chassis"},请注意查询时时间,应该为指标原始采集时间,这一点需要谨记。
weiyigeek.top-验证导入的指标数据图
至此,无需 Prometheus 服务停机,即可将历史采集指标数据,迁移到VictoriaMetrics。
当然,除了 Prometheus 数据迁移,VictoriaMetrics 还支持其它多种数据源的迁移,你可以根据实际环境选择其他数据源迁移(例如,InfluxDB、Thanos 、Cortex 、OpenTSDB ),参考地址:https://docs.victoriametrics.com/quick-start/#data-migration
若文章写得不错,不要吝惜手中转发,点赞、在看,若有疑问的小伙伴,可在评论区留言你想法哟!
2846