• 正文
  • 相关推荐
申请入驻 产业图谱

无缝迁徙:从 Prometheus 到 VictoriaMetrics 的零停机数据迁移指南

04/20 13:00
2846
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是 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

若文章写得不错,不要吝惜手中转发,点赞、在看,若有疑问的小伙伴,可在评论区留言你想法哟!

相关推荐