【VictoriaMetrics的vmbackupmanager】这个一年卖 2 万美元的功能,我做出来了
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
1.背景
在可观测领域的 metrics 解决方案中,VictoriaMetrics 整个产品体系的性能非常高。两年前,我们团队用这个组件来代替 kafka+druid 实现的旧版监控系统。其中一个群集扛住了鹅厂内部一个达到 9000 万/s datapoint 的业务所产生的 metrics 数据,vm 部分用了不到 1000 核,成本相比 kafka+druid 低了很多。
美中不足是 VictoriaMetrics 并未提供类似历史群集的解决方案,虽然提供了免费的 vmbackup 和 vmrestore 工具,但是数据的备份和恢复与历史群集相比仍然是不够的。
历史群集的难题是这样的:
与历史群集相对的实时群集,默认情况下实时群集仅保存最近 30 天的数据;如果需要读取 30 一天,以及更长周期的数据,就需要把备份数据恢复出来形成历史群集;
实时群集一般会部署多个 sharding 节点:
- 如果 vm-insert 上的
-replicationFactor=1,则数据不重复,每个 sharding 上的数据完全重复,每个节点是全量数据的 n 分之一。 - 如果 vm-insert 上的
-replicationFactor=2, 则各个 sharding 上的数据有一部分与其他 sharding 节点是重复的。
- 如果 vm-insert 上的
vm-backup 的备份功能是针对 vm-storage 的 sharding 节点的,如果 vm-storage 群集有 n 个节点,则每个节点都需要独立使用 vm-backup 来备份。
- vm-backup 的原理是先使用 http 协议访问 vm-storage 的 http 服务,访问
/snapshot/create来创建一个所有磁盘上数据文件的快照。 - 数据文件的快照是文件系统的 hardlink,意味着只是在 vfs 上增加对数据文件的引用计数,不会产生拷贝。这一步非常快。
- vm-backup 将数据文件备份到 s3 中;
- 备份完成后,调用 vm-storage http 中的
/snapshot/delete?snapshot=<id>来删除快照
- vm-backup 的原理是先使用 http 协议访问 vm-storage 的 http 服务,访问
备份完成后:
s3 上每个 sharding 对应着一个数据的文件夹
每个数据文件夹的数据包含从创建快照开始,倒数 30 天的数据;(如果默认的数据存储周期是 30 天的话)
如果需要每天都全新备份,则还需要产生以日期命名的文件夹
下面是一个 s3 上备份目录的例子:
s3://bucket_name:
metrics_data/
daily/
2024-01-26/
sharding-0/
sharding-1/
sharding-2/
如果需要直接根据历史的备份数据来启动历史群集,则:
- 有多少个 sharding, 就要启动多少个 vm-storage 实例;
- 假设从昨天的备份数据开始启动 vm-storage,则这一组 vm-storage 支持 -1 天到 -31 天的历史数据查询;
- 当过去了 24 小时,之前的 vm-storage 群集支持的数据变成了 -2 天到 -32 天。如果需要始终从-1 天开始,则需要在每天半夜重新下载最新的备份,然后重启 vm-storage;
- 如果需要支持更长周期,例如 -31 天到 -61 天,则需要从 -31 天开始的备份数据里,再启动一组 vm-storage 群集。假设需要支持过去 300天的历史数据查询,则需要部署十组 vm-storage.
通过以上的描述,应该可以了解到通过目前的工具,支持历史群集很麻烦。
实际上,我已经通过已有的工具做出来了对应的部署脚本,请看:https://github.com/ahfuzhang/deploy_VictoriaMetrics_cluster/tree/main/terraform/historical_cluster
2.vmfile
从官方的文档(https://docs.victoriametrics.com/vmbackupmanager.html)看,vmbackupmanager 对备份数据有更强大的功能,不过也仍然没有提如何部署历史群集。
收费购买企业版套件,有可能让部署历史群集变得简单。
如果有一个工具,能够从多个 sharding 中导出 metrics 数据,然后再导入到一个包含所有数据的文件夹中,那么部署历史群集就会非常简单了。
因此,我花了两周时间写出了这个可能节约 2 万美元的小工具:vmfile,对离线的 vm-storage 的数据文件进行处理。
vmfile 的相关链接是:
- 源码(目前还很混乱,整理中):https://github.com/ahfuzhang/VictoriaMetrics_cluster_v1.96.0/tree/cluster_dev/app/vmfile
- 版本 v0.0.3: https://github.com/ahfuzhang/VictoriaMetrics_cluster_v1.96.0/releases/tag/vmfile_v0.0.3
- docker 镜像:https://hub.docker.com/layers/ahfuzhang/vm-historical/v1.95.1-vmfile/images/sha256-ef2c2f68c2f0fcf6a297cdf0774e4c0e90fbed914505c00f6a5529aa291cdf4b?context=repo
- 使用 vmfile 来部署历史群集的代码:https://github.com/ahfuzhang/deploy_VictoriaMetrics_cluster/blob/v0.0.3/terraform/historical_cluster/vm-storage-with-merge.tf
下面介绍一下这个工具的几个基本功能:
2.1 count_index 统计数据文件的索引信息
- 通过
-storageDataPath来指向某个 vm-storage 的数据(或者通过 vm-restore 恢复的)文件夹。
vmfile \
-action=count_index \
-storageDataPath=/Users/fuchunzhang/xxx/data/realtime-cluster/sharding-0/ \
-fs.disableMmap=false
2.2 count_data 统计数据文件的数据信息
vmfile \
-action=count_data \
-storageDataPath=/Users/fuchunzhang/xxx/data/realtime-cluster/sharding-0/ \
-fs.disableMmap=false
2.3 export_metrics 导出 metrics 数据到文本文件
- 通过
output来指定导出的位置
vmfile \
-action=export_metrics \
-storageDataPath=/Users/fuchunzhang/xxx/data/realtime-cluster/sharding-0/ \
-output=./metrics.txt \
-fs.disableMmap=false
(后续会优化这个功能,例如:可以把所有 metrics 数据的 name, value, timestamp 都导出,然后可以再导入到 clickhouse 做复杂分析)
2.4 simple_merge 简单合并多个 sharding 数据
把多个 sharding 文件夹的数据,把索引和数据两部分分别拷贝到目的文件夹,并最终成为一个可以正常启动 vm-storage 的数据文件夹。
simple_merge_from: 多个逗号分隔的路径simple_merge_to: merge 后的目的文件夹
vmfile \
-action=simple_merge \
-simple_merge_from=/Users/fuchunzhang/xxx/data/2024-01-02/sharding-0/,/Users/fuchunzhang/xxx/data/2024-01-02/sharding-1/,/Users/fuchunzhang/xxx/data/2024-01-02/sharding-2/ \
-simple_merge_to=/Users/fuchunzhang/Documents/temp/2024/simple_merge
2.5 merge 重建索引和数据方式的merge
mergev2_from: 多个逗号分隔的路径mergev2_to: merge 后的目的文件夹
vmfile \
-action=merge_v2 \
-mergev2_from=/Users/fuchunzhang/xxx/sharding-0/,/Users/fuchunzhang/xxx/sharding-1/,/Users/fuchunzhang/xxx/sharding-2/ \
-mergev2_to=/Users/fuchunzhang/Documents/temp/2024/2024-01-22/merge_v2/ \
-dedup.minScrapeInterval=0s \
-cpu=1
2.5.1 降采样(downsample)功能
当 -dedup.minScrapeInterval=0s 的时候,数据部分不会丢失任何数据。
可以使用这个参数指定一个时间窗口,在时间窗口内,同一个 metric 仅保留一个 data point。
下面的例子,每 5 分钟仅保留一个 data point,数据部分的体积会缩小很多:
vmfile \
-action=merge_v2 \
-mergev2_from=/Users/fuchunzhang/xxx/sharding-0/,/Users/fuchunzhang/xxx/sharding-1/,/Users/fuchunzhang/xxx/sharding-2/ \
-mergev2_to=/Users/fuchunzhang/Documents/temp/2024/2024-01-22/merge_v2/ \
-dedup.minScrapeInterval=5m \
-cpu=1
使用降采样方式的 merge,我的测试数据如下:
- 降采样时间窗口 0s: 数据部分膨胀 1.1 倍,merge 后记录数不变
- 降采样时间窗口 1m: 数据部分膨胀 1.005 倍, merge 后记录数减少 0.004%
- 降采样时间窗口 5m: 数据部分减少 2.919 倍, merge 后记录数减少 79.97%
2.5.2 索引和数据并行merge
当 -cpu=参数大于 1 时,索引部分和数据部分会并行 merge。目前最多只支持两个核。
vmfile \
-action=merge_v2 \
-mergev2_from=/Users/fuchunzhang/xxx/sharding-0/,/Users/fuchunzhang/xxx/sharding-1/,/Users/fuchunzhang/xxx/sharding-2/ \
-mergev2_to=/Users/fuchunzhang/Documents/temp/2024/2024-01-22/merge_v2/ \
-dedup.minScrapeInterval=5m \
-cpu=2
3.历史群集部署
有了 vmfile 这个工具后,部署历史群集就简单很多了。
每天只需要把最新的备份数据不断 merge 到一个最终的数据文件就行了。(当然,这里仍然是离线操作的)
每天自动拉取最新的各个 sharding,并开始 merge,然后停掉旧的 vm-storage,启动新的 vm-storage……这一系列的动作我都通过一个 shell 脚本来实现了。
我通过 terraform 来实现了 k8s 上的部署代码,通过阅读源码,修改成别的部署方式也很容易。
历史群集的部署流程如下:
实时群集需要创建 crontab,每天半夜使用 vmbackup 把各个 sharding 部署到 s3 上;
构造一个新的 docker 镜像:
- 镜像内包含了 vm-restore 和 vm-storage 两个官方程序
- 镜像内包含了编译好的 vmfile 工具
- 镜像内提供一个 shell 脚本来把上面的工具串起来
- 源码请看:https://github.com/ahfuzhang/deploy_VictoriaMetrics_cluster/tree/main/terraform/historical_cluster/docker_image
- 镜像已经发布到 docker hub: https://hub.docker.com/layers/ahfuzhang/vm-historical/v1.95.1-vmfile/images/sha256-ef2c2f68c2f0fcf6a297cdf0774e4c0e90fbed914505c00f6a5529aa291cdf4b?context=repo
创建一个 k8s 上的 deployment,启动命令是上面提到的 shell
container {
name = "${local.vm-storage-name-with-merge}-${count.index}"
image = "ahfuzhang/vm-historical:v1.95.1-vmfile" # 包含了多种工具和 shell 的镜像
image_pull_policy = "Always" #"IfNotPresent"
command = ["/bin/sh"]
args = [
"/daily_with_vmfile.sh", # 从镜像中的 shell 脚本启动
]
......
shell 的控制参数通过容器的环境变量来传入,重要的参数有这些:
- storage_base_path: 本地的存储路径
- s3_storage_base_path: s3 上的备份文件的路径
- sharding_count: sharding 的个数
- n_days_before : 历史群集从几天以前开始,填 1 就是昨天。历史群集会在第二天半夜拉取最新备份,始终维持在当前时间的 n 天以前。
shell 的执行逻辑:
- 检查是否已经存在 merge 后的文件夹,如果不存在,就使用 vmrestore 来下载多个 sharding
- sharding 文件夹下载好后,使用 vmfile 的 merge 功能来重建索引和数据。
- 在 merge 好后的文件夹上启动 vm-storage 来提供历史数据的查询服务;
- 脚本进入循环睡眠,等到第二天半夜。
- 根据当前日期,下载 n_days_before 指定的历史文件夹到本地
- 使用 vmfile merge 数据
- 启动新的 vm-storage
- 停掉旧的 vm-storage
The End
- vmfile 的功能还会继续优化,如果你们的团队也在使用 VictoriaMetrics ,欢迎关注我的后续进展;
- vmfile 的实现代码很简单,但是原理却相对复杂,设计很多存储引擎的结构设计。如果对 vm-storage 的 tsdb 感兴趣,欢迎查看我分享的源码分析电子书:《VictoriaMetrics存储引擎分析.pdf》
Have fun. 希望对你有用。
【VictoriaMetrics的vmbackupmanager】这个一年卖 2 万美元的功能,我做出来了的更多相关文章
- 核心思想:早胜过一切,张小龙的Foxmail居然可以卖1200万
现在谁都可以做一个类似的软件,但是市场已经成熟了,满大街都是,也就没有人会来收购你的软件了.
- 期权交易基本原理——买进看跌期权(Long Put),卖出看跌期权(Short Put)
期权交易基本原理--买进看跌期权(Long Put),卖出看跌期权(Short Put) 来源:中电投先融期货-青岛 浏览:13508次2014-07-25 14:25:55 3 第三节 买进看跌期权 ...
- 想要风投被你的融资 PPT 打动吗?别忘了你其实就是在想方设法卖出自己公司的部分股权
硅谷,一个常常见诸于报端,看着很熟悉,但是又不那么被人所了解的未及之地.它不是一个严格限定的地理位置,一般来说是指旧金山和湾区,其中湾区又分为东湾(East Bay)和南湾(South Bay), ...
- 程序员买房指南——LZ的三次买房和一次卖房经历
引言 买房,一直是程序员群体绕不开的一个话题,尤其是到了一定年纪和人生阶段以后,买房这件事会变得越来越迫切. 为什么LZ一上来就说,买房是程序员绕不开的一个话题? 其实原因很简单,由于程序员这个职业的 ...
- 开源囧事4:你们这些卖代码的能不能留自己的QQ号?留我QQ号干嘛?
缘起于开源项目 从 2017 年开始,陆陆续续写了一些开源项目放到开源网站里,都是一些实战项目,给大家练练手.有基础整合的demo,有 Spring Boot 博客项目,有 Spring Boot 商 ...
- Intel 推出 DPDK 开发包的意义是什么?
Intel 推出 DPDK 开发包的意义是什么? http://www.zhihu.com/question/27413080?sort=created 基于intel dpdk的包处理器,相较于基于 ...
- 【转】JAVA自学之路
JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...
- 精通Web Analytics 2.0 (10) 第八章:竞争情报分析
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第八章:竞争情报分析 在现实世界中,收集竞争情报可能意味着雇人在竞争对手的垃圾桶(实际会发生!)翻找. 在虚拟世界中,堆如山的数 ...
- SQL Server 2016五大优势挖掘企业用户数据价值
SQL Server 2016五大优势挖掘企业用户数据价值 转载自:http://soft.zdnet.com.cn/software_zone/2016/0318/3074442.shtml 3月1 ...
- 【商业源码】生日大放送-Newlife商业源码分享
今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和论坛又一次疯狂了,吃水不忘挖井人,好的东西肯定要拿到博客园分享.Newlife组件信息: 论坛: ...
随机推荐
- CANN 5.0黑科技解密 | 算力虚拟化,让AI算力“物尽其用”
摘要:算力虚拟化技术对消费者而言,可有效降低算力的使用成本,对于设备商或运营商而言,则可极大提升算力资源的利用率,降低设备运营成本. 为什么要做算力虚拟化 近年来,人工智能领域呈井喷式发展,算力就是生 ...
- 关于 DataLeap 中的 Notebook,你想知道的都在这
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维 ...
- DNS--安装&&配置文件
1 下载 #下载服务yum -y install bind#下载解析工具yum -y install bind-utils 2 配置文件 主配置文件 /etc/named.conf 区配置文件 /va ...
- 阿里云视频云vPaaS低代码音视频工厂:极速智造,万象空间
当下音视频技术越来越广泛地应用于更多行各业中,但因开发成本高.难度系数大等问题,掣肘了很多企业业务的第二增长需求.阿里云视频云基于云原生.音视频.人工智能等先进技术,提供易接入.强拓展.高效部署和覆盖 ...
- HDU - 2181 :哈密顿绕行世界问题
Descriptions: 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数,表示与第i个 ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200)(AB水题,C思维,D搜索,E DP)
补题链接:Here A - Century 整除 \(200\) 并且判断能否整除完全 B - 200th ABC-200 按题意即可 C - Ringo's Favorite Numbers 2 求 ...
- 一文看完String的前世今生,内容有点多,请耐心看完!
写在开头 String字符串作为一种引用类型,在Java中的地位举足轻重,也是代码中出现频率最高的一种数据结构,因此,我们需要像分析Object一样,将String作为一个topic,单独拿出来总结, ...
- jQuery组织后续事件 事件冒泡 事件委托 键被按下 批量操作 hover input 事件
1. jQuery绑定事件的方式 1. $('').click(function(){}) 2. $('').on('click', function(){}) 2. 阻止后续事件执行 1. retu ...
- maven总结三: 常用插件
本文为博主原创,转载请注明出处: 目录: 1. maven-release-plugin 2. maven-compiler-plugin 3. maven-assembly-plugin 4. sp ...
- 05-Shell索引数组变量
1.介绍 Shell 支持数组(Array),数组是若干数据的集合,其中的每一份数据都称为数组的元素. 注意Bash Shell 只支持一维数组,不支持多维数组. 2.数组的定义 2.1 语法 在 S ...
