分布式集群时序库 VictoriaMetrics

简介

VictoriaMetrics 架构简单,可靠性高,在性能,成本,可扩展性方面表现出色,社区活跃,且和 Prometheus 生态绑定紧密。如果单机版本的 Prometheus 无法在容量上满足贵司的需求,可以使用 VictoriaMetrics 作为时序数据库。

VictoriaMetrics 提供单机版集群版。如果您的每秒写入数据点数小于100万(这个数量是个什么概念呢,如果只是做机器设备的监控,每个机器差不多采集200个指标,采集频率是10秒的话每台机器每秒采集20个指标左右,100万/20=5万台机器),VictoriaMetrics 官方默认推荐您使用单机版,单机版可以通过增加服务器的CPU核心数,增加内存,增加IOPS来获得线性的性能提升。且单机版易于配置和运维。

集群架构

VictoriaMetrics - 图1

vmstorage、vminsert、vmselect 三者组合构成 VictoriaMetrics 的集群功能,三者都可以通过启动多个实例来分担承载流量,通过要在 vminsert 和 vmselect 前面架设负载均衡。

vmstorage 是数据存储模块

  • 其数据保存在-storageDataPath指定的目录中,默认为./vmstorage-data/,vmstorage 是有状态模块,删除 storage node 会丢失约 1/N的历史数据(N 为集群中 vmstorage node 的节点数量)。增加 storage node,则需要同步修改 vminsert 和 vmselect 的启动参数,将新加入的storage node节点地址通过命令行参数 -storageNode传入给vminsert和vmselect
  • vmstorage 启动后,会监听三个端口,分别是 -httpListenAddr :8482-vminsertAddr :8400-vmselectAddr :8401。端口8400负责接收来自 vminsert 的写入请求,端口8401负责接收来自 vmselect 的数据查询请求,端口8482则是 vmstorage 自身提供的 http api 接口

vminsert 接收来自客户端的数据写入请求,并负责转发到选定的vmstorage

  • vminsert 接收到数据写入请求后,按照 jump consistent hash 算法,将数据转发到选定的某个vmstorage node 上。vminsert 本身是无状态模块,可以增加或者删除一个或多个实例,而不会造成数据的损失。vminsert 模块通过启动时的参数 -storageNode xxx,yyy,zzz 来感知到整个 vmstorage 集群的完整 node 地址列表
  • vminsert 启动后,会监听一个端口-httpListenAddr :8480。该端口实现了 prometheus remote_write协议,因此可以接收和解析通过 remote_write 协议写入的数据。不过要注意,VictoriaMetrics 集群版本具有多租户功能,因此租户ID会以如下形式出现在 API URL 中: http://vminsert:8480/insert/<account_id>/prometheus/api/v1/write
  • 更多 URL Format 可以参考 VictoriaMetrics官网

vmselect 接收来自客户端的数据查询请求,并负责转发到所有的 vmstorage 查询结果,最后将结果 merge 后返回

  • vmselect 启动后,会监听一个端口-httpListenAddr :8481。该端口实现了 prometheus query相关的接口。不过要注意,VictoriaMetrics 集群版本具有多租户功能,因此租户ID会以如下形式出现在 API URL 中: http://vminsert:8481/select/<account_id>/prometheus/api/v1/query
  • 更多 URL Format 可以参考 VictoriaMetrics官网

安装部署

1、 去 vm release 下载编译好的二进制版本,比如我们选择下载 v1.69.0 amd64

2、 解压缩后得到:

  1. $ ls -l vm*-prod
  2. -rwxr-xr-x 1 work work 10946416 Nov 8 22:03 vminsert-prod*
  3. -rwxr-xr-x 1 work work 13000624 Nov 8 22:03 vmselect-prod*
  4. -rwxr-xr-x 1 work work 11476736 Nov 8 22:03 vmstorage-prod*

3、 启动三个 vmstorage 实例(可以用下面的脚本快速生成不同实例的启动命令)

  1. #!/bin/bash
  2. for i in `seq 0 2`; do
  3. if [ $i -eq 0 ]; then
  4. i=""
  5. fi
  6. pp=$i
  7. httpListenAddr=${pp}8482
  8. vminsertAddr=${pp}8400
  9. vmselectAddr=${pp}8401
  10. storageDataPath=./${pp}vmstorage-data
  11. prog="nohup ./vmstorage-prod -loggerTimezone Asia/Shanghai \
  12. -storageDataPath $storageDataPath \
  13. -httpListenAddr :$httpListenAddr \
  14. -vminsertAddr :$vminsertAddr \
  15. -vmselectAddr :$vmselectAddr \
  16. &> ${pp}vmstor.log &"
  17. echo $prog
  18. (exec "$prog")
  19. done

也可以输入以下命令行启动三个实例:

  1. nohup ./vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath ./vmstorage-data -httpListenAddr :8482 -vminsertAddr :8400 -vmselectAddr :8401 &> vmstor.log &
  2. nohup ./vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath ./1vmstorage-data -httpListenAddr :18482 -vminsertAddr :18400 -vmselectAddr :18401 &> 1vmstor.log &
  3. nohup ./vmstorage-prod -loggerTimezone Asia/Shanghai -storageDataPath ./2vmstorage-data -httpListenAddr :28482 -vminsertAddr :28400 -vmselectAddr :28401 &> 2vmstor.log &

4、 启动一个 vminsert 实例:

  1. nohup ./vminsert-prod -httpListenAddr :8480 -storageNode=127.0.0.1:8400,127.0.0.1:18400,127.0.0.1:28400 &>vminsert.log &

5、 启动一个 vmselect 实例:

  1. nohup ./vmselect-prod -httpListenAddr :8481 -storageNode=127.0.0.1:8401,127.0.0.1:18401,127.0.0.1:28401 &>vmselect.log &

6、 查看 vmstorage,vminsert,vmselect 的 /metrics 接口:

  1. curl http://127.0.0.1:8482/metrics
  2. curl http://127.0.0.1:18482/metrics
  3. curl http://127.0.0.1:28482/metrics
  4. curl http://127.0.0.1:8481/metrics
  5. curl http://127.0.0.1:8480/metrics

7、 n9e-server 通过 remote write 协议写入时序库,VictoriaMetrics 作为时序库的一个选择,其 remote write 接口地址为:http://127.0.0.1:8480/insert/0/prometheus/api/v1/write 把这个地址配置到 server.conf 当中,配置完了重启 n9e-server

  1. # Reader部分修改Url
  2. [Reader]
  3. Url = "http://172.21.0.8:8481/select/0/prometheus"
  4. # Writers部分修改Url
  5. [[Writers]]
  6. Url = "http://172.21.0.8:8480/insert/0/prometheus/api/v1/write"

8、 修改 n9e-webapi 的配置文件 ./etc/webapi.conf 如下:

  1. [[Clusters]]
  2. # Prometheus cluster name
  3. Name = "Default"
  4. # Prometheus APIs base url
  5. Prom = "http://127.0.0.1:8481/select/0/prometheus"

然后,重启 n9e-webapi,这样夜莺就可以查询到 VictoriaMetrics 集群的数据了。

如果您使用的是 VictoriaMetrics 单机版,端口是 8428,故而 Nightingale 的配置文件需要做如下调整:

  1. # server.conf
  2. # Reader部分修改为:
  3. [Reader]
  4. Url = "http://127.0.0.1:8428"
  5. # Writers部分修改为:
  6. [[Writers]]
  7. Url = "http://127.0.0.1:8428/api/v1/write"
  1. # webapi.conf
  2. # Clusters部分修改为:
  3. [[Clusters]]
  4. Name = "Default"
  5. Prom = "http://127.0.0.1:8428"

FAQ

VictoriaMetrics 单机版本如何保障数据的可靠性?

vm 针对磁盘IO有针对性的优化,单机版可以考虑将数据的可靠性保障交给 EBS 等云盘来保证。

VictoriaMetrics 如何评估容量?

参考vm的官方文档

VictoriaMetrics 集群版本增加或者删除 vmstorage node 的时候,数据如何再平衡?

vm 不支持扩缩容节点时,对数据进行自动的再平衡。

VictoriaMetrics 的数据大小如何查看?

可以通过 vmstorage 实例暴露的 /metrics 接口来获取到相应的统计数据,譬如:

  1. $ curl http://127.0.0.1:8482/metrics |grep -i data_size
  2. vm_data_size_bytes{type="indexdb"} 609291
  3. vm_data_size_bytes{type="storage/big"} 0
  4. vm_data_size_bytes{type="storage/small"} 8749893

vminsert 在将数据写入多个 vmstorage node的时候,是按照什么规则将数据写入到不同的 node 上的?

采用 jump consistent hash 对数据进行分片,写入到相应的 storage node 上。

vmselect 在接到查询请求的时候,如何定位到请求的数据是在哪个 storage node上的?

vmselect 并不知道每个 metrics 对应的数据分布的 storage node,vmselect 会对所有的 storage node 发起查询请求,最后进行数据合并,并返回。

VictoriaMetrics 和 M3db 的对比和选择?

m3db 架构设计上更高级,实现难度高,m3db 在时序数据功能之后,重点解决了自动扩缩容,数据自动平衡等运维难题。但是因此也更复杂,可靠性也更难保证。VictoriaMetrics 架构设计上更倾向于简单可靠,重点优化了单机版的性能,强调垂直扩展,同时和 prometheus 生态做到兼容,甚至于在很多的点上做到了加强。但是 VictoriaMetrics 对于时序数据 downsample,节点的自动扩缩容,数据自动再平衡等高级功能和分布式能力,是有缺失的。

相关资料