VictoriaMetrics 是一个支持水平扩展的时序数据库,可以作为 Prometheus 的远端存储,并且实现了 PromSQL,可以直接通过 VictoriaMetrics 查询时序数据,避开 Prometheus 查询时的单点瓶颈。
VictoriaMetrics 与其它方案的对比见:Prometheus 水平扩展方案(一)
源代码阅读:VictoriaMetrics水平扩展的实现
【配套视频讲解】:【Prometehus入门->水平扩展之Victoria Metrics】
VictoriaMetrics 分为 单机版本 和 集群版本,单机版本和集群版本用法不同
,这里使用的是集群版。
时间序列(time series)是时序数据库的最小管理单位,每个 time series 对应一系列按时间分布的的采样点。我们需要考虑以下几个问题:
1. 能存储多少个 time series,total number of time series;
2. 能支持多少个 time series 的并发写入,number of active time series;
3. 能支持多高速度的采样数据写入,每秒写入点数;
4. 能支持多高查询频率,average query rate;
5. 每次查询耗时,query duration;
以下是几个公司公开的 使用情况,不代表 Victora 的性能上限:
wix.com 使用的 单机版
承接的业务量:
Dreamteam 使用 单机版
承接的业务量:
Wedos.com 使用 集群版
承接的业务量:
VictoriaMetrics 集群版本 的架构如下:
vminsert 和 vmselect 是无状态的写入、查询节点,vmstorage 是有状态的存储节点。数据平均分配到 vmstorage 节点,每个 vmstorage 分担一部分数据,没有冗余
,如果 vmstorage 节点丢失,那么数据对应丢失。
三个组件的镜像:
victoriametrics/vminsert:v1.34.0-cluster
victoriametrics/vmselect:v1.34.0-cluster
victoriametrics/vmstorage:v1.34.0-cluster
vmstorage 有状态服务,监听端口 8482(http)、8400(insert)、8401(select),主要参数:
-retentionPeriod # 存储时间,单位是月
-storageDataPath # 数据存放路径
vminsert 无状态服务,指向所有的 vmstorage,监听端口 8480,主要参数:
-storageNode=<vmstorage_host>:8400
vmselect 无状态服务,指向所有的 vmstorage,监听端口 8481,主要参数:
-storageNode=<vmstorage_host>:8401
用下面的 VictoriaMetrics/docker-compose.yaml 在本地启动一个最小集群:
git clone https://github.com/introclass/docker-compose-files.git
分别访问下面三个地址,查看组件的状态数据:
insert: http://127.0.0.1:8480/metrics、
select: http://127.0.0.1:8481/metrics、
storage:http://127.0.0.1:8482/metrics、
打开 grafana 地址 127.0.0.1:3000,用 admin/admin 登陆后,进入设置密码。
在 grafana 中添加 prometheus 数据源:
# grafana 中添加的 victorai 数据源
http://vmselect:8481/select/0/prometheus/
这个数据源地址要和 Prometheus 中的 remote write 相对应:
# prometheus 中配置的 remote write
http://vminsert:8480/insert/0/prometheus
验证数据:
curl http://127.0.0.1:8481/select/0/prometheus/api/v1/labels
可以导入 victoria metrics 的 dashboards/11176,查看 victoria 的状态。
vminsert 的写入 API 格式如下:
http://<vminsert>:8480/insert/<accountID>/<suffix>
accountID 是不同用户/租户的 ID,必须是数字,否则通过 vmselect 查询的时候会遇到下面的问题:
# localcluster 不是数字,vmselect 报错
auth error: cannot parse accountID from "localcluster": strconv.Atoi: parsing "localcluster": invalid syntax
VictoriaMetrics 支持多种写入方式,通过 sufficx 区分,suffix 支持以下几种:
prometheus :for inserting data with Prometheus remote write API
influx/write :for inserting data with Influx line protocol
influx/api/v2/write :for inserting data with Influx line protocol
opentsdb/api/put :for accepting OpenTSDB HTTP /api/put requests.
prometheus/api/v1/import :for importing data obtained via api/v1/export on vmselect
例如在 prometheus 中配置远程写入,使用的 suffix 是 prometheus:
remote_write:
- url: http://<vminsert>:8480/insert/<accountID>/prometheus
queue_config:
max_samples_per_send: 10000
capacity: 20000
max_shards: 30
建议根据需要在 Prometehus 中设置全局 label:
global:
external_labels:
datacenter: dc-123
Prometheus 在 remote_write 时,本地的数据依旧会保存,本地数据保留时间设置:
--storage.tsdb.retention.time=
vmselect 采用 prometheus 的查询语法,API 格式如下:
http://<vmselect>:8481/select/<accountID>/prometheus/<suffix>
suffix 可以是下面的字符串,和 prometheus 的 api 对应:
api/v1/query :performs PromQL instant query
api/v1/query_range :performs PromQL range query
api/v1/series :performs series query
api/v1/labels :returns a list of label names
api/v1/label/<label_name>/values :returns values for the given <label_name> according to API
federate :returns federated metrics
api/v1/export :exports raw data. See this article for details
通过 Prometheus 的 API 查询:
$ curl -g 'http://localhost:9090/api/v1/series' --data-urlencode 'match[]=vm_rows{}' |jq
{
"status": "success",
"data": [
{
"__name__": "vm_rows",
"instance": "172.29.128.2:8482",
"job": "victoria",
"type": "indexdb"
},
{
"__name__": "vm_rows",
"instance": "172.29.128.2:8482",
"job": "victoria",
"type": "storage/big"
},
{
"__name__": "vm_rows",
"instance": "172.29.128.2:8482",
"job": "victoria",
"type": "storage/small"
}
]
}
通过 VictoriaMetrics 的 API 查询:
$ curl 'http://127.0.0.1:8481/select/0/prometheus/api/v1/series' --data-urlencode 'match[]=vm_rows{}' |jq
{
"status": "success",
"data": [
{
"__name__": "vm_rows",
"job": "victoria",
"type": "indexdb",
"instance": "172.29.128.49:8482"
},
{
"__name__": "vm_rows",
"job": "victoria",
"type": "indexdb",
"instance": "172.29.128.2:8482"
},
{
"__name__": "vm_rows",
"job": "victoria",
"type": "indexdb",
"instance": "172.29.128.7:8482"
},
...
Victora 官方提供了一个 grafana 面板,dashboards/11176: