VictoriaMetrics 是一个高性能、开源的时序数据库,设计用来处理大规模的时序数据。它支持 Prometheus 数据格式,并具有非常高的写入和查询性能。VictoriaMetrics 特别适用于大规模环境中的时序数据存储和查询,能够提供跨多个集群的时序数据存储和查询能力。
VictoriaMetrics 架构 #
VictoriaMetrics 的架构可以分为几个主要组件,每个组件在存储、查询和管理数据方面都发挥着不同的作用。
1. VictoriaMetrics Components: #
- vmstorage:负责存储时序数据,并提供高效的数据压缩和存储管理功能。所有的时序数据都会被写入 vmstorage 中,并且在底层存储中进行压缩以节省存储空间。
- vmselect:用于执行查询操作,并从 vmstorage 获取数据。它负责解析 Prometheus 查询(PromQL)并返回查询结果。
vmselect
是查询请求的入口。 - vminsert:负责接收数据并将其写入到
vmstorage
。它接受来自 Prometheus 或其他系统的时序数据,并将其插入到存储系统中。 - VictoriaMetrics Cluster:通过多个
vmselect
和vminsert
实例部署来扩展系统的写入和查询能力。这使得 VictoriaMetrics 能够水平扩展,在大规模环境中高效地处理时序数据。 - Scrape:像 Prometheus 一样,VictoriaMetrics 也可以从不同的数据源抓取时序数据,进行数据存储。
2. VictoriaMetrics 存储架构: #
- 数据存储:VictoriaMetrics 使用基于磁盘的列式存储结构,支持高效的数据压缩。其数据以时间序列的形式存储,并根据时间进行分片存储,以便在高并发查询时提高查询性能。
- 数据压缩:为了节省存储空间,VictoriaMetrics 采用了自定义的压缩算法(如 Gorilla 算法)来压缩时序数据。压缩后的数据不仅减少了存储的开销,还提高了读取性能。
- 长期存储:可以将数据长期存储在磁盘中,或者通过集成外部存储后端(如 S3)实现更长期的数据存储。VictoriaMetrics 也支持与 Thanos 兼容的 API,允许数据存储在对象存储中,从而支持跨数据中心存储和数据恢复。
3. 数据流: #
- vminsert 接收来自 Prometheus 或其他数据源的时序数据,并将其写入到
vmstorage
。 - vmselect 接收查询请求,并根据查询条件从
vmstorage
中提取数据进行查询响应。 - 查询过程中,
vmselect
会将查询请求传递给多个vmstorage
实例(如果是集群部署)以获得需要的数据。 vmselect
提供高效的查询能力,并支持 PromQL 语法,可以像 Prometheus 一样进行查询和数据展示。
典型架构图 #
graph TB
subgraph Data_Collection
direction TB
P[Prometheus Scraping Targets]
end
subgraph VictoriaMetrics_Cluster
direction TB
A[vminsert]
B[vmstorage]
C[vmselect]
end
subgraph Monitoring_And_Alerting
direction LR
G[Grafana]
A1[Alertmanager]
end
P --> A
A --> B
G --> C
C --> B
A1 --> A
C --> G
关键组件功能和数据流: #
- 数据收集(Prometheus Scraping Targets):VictoriaMetrics 可以通过
vminsert
接收来自 Prometheus 的数据,或者其他应用将数据推送到vminsert
中。 - 数据存储(vmstorage):
vmstorage
组件负责数据的存储,所有接收到的时序数据都会被写入到vmstorage
中,存储格式采用压缩存储以减少存储开销。 - 数据查询(vmselect):
vmselect
负责处理来自客户端(如 Grafana)的查询请求,并查询数据存储中的时序数据,支持 PromQL 查询语言。 - 查询结果展示和告警:通过 Grafana 等可视化工具展示查询结果,同时,Alertmanager 用来处理 Prometheus 的告警规则并发送告警。
优缺点: #
优点: #
- 高性能:在数据写入和查询方面都提供了非常高的性能,特别是针对大规模时序数据场景。
- 高压缩比:使用自定义的压缩算法,存储空间消耗较低,适合大规模的时序数据。
- 水平扩展:支持通过增加多个
vmselect
和vminsert
实例来扩展存储和查询能力,具有很好的伸缩性。 - 支持 Prometheus 格式:与 Prometheus 兼容,可以直接替代 Prometheus 存储,并且支持 PromQL 查询。
- 支持持久化存储:支持将数据持久化存储在本地磁盘或外部对象存储中(如 S3)。
缺点: #
- 功能较简单:虽然 VictoriaMetrics 在性能和存储管理上很强,但它的功能相对简单,缺乏 Prometheus 中的一些复杂功能(如规则引擎等)。
- 查询语法不支持全部 Prometheus 功能:部分 Prometheus 的高级功能可能不完全支持,虽然它支持 PromQL,但某些查询可能在功能上有所限制。
- 配置复杂性:对于大型环境的部署和集群管理,配置相对复杂,需要合理规划各个组件的部署和资源分配。
总结: #
VictoriaMetrics 是一个高效且适合大规模时序数据存储和查询的系统。它提供了高性能的时序数据存储和查询,适合大规模数据存储和处理需求,尤其在 Prometheus 生态中可以很方便地替代 Prometheus 存储和提供长时间的数据查询能力。
在 VictoriaMetrics 中,vminsert
组件负责接收时序数据并存入存储后端。你可以通过 Prometheus remote_write 方式,将 Prometheus 采集到的数据推送到 vminsert
,从而让 VictoriaMetrics 作为长时间存储(长期存储 3 年的数据)。
如何让 Prometheus 将数据写入 VictoriaMetrics (vminsert
)?
#
1. 在 Prometheus 配置 remote_write
#
你需要在 Prometheus 的 prometheus.yml
配置文件中添加 remote_write
,指向 VictoriaMetrics 的 vminsert
端点,例如:
global:
scrape_interval: 15s # 采集间隔
remote_write:
- url: "http://<vminsert_ip>:8480/insert/0/prometheus"
queue_config:
capacity: 5000
max_shards: 10
max_samples_per_send: 1000
batch_send_deadline: 5s
url
: 指向vminsert
组件的8480
端口,并使用/insert/0/prometheus
端点接收 Prometheus 格式的数据。queue_config
: 设置 Prometheus 推送数据的队列参数,提高性能和稳定性。
2. 启动 vminsert
#
在 VictoriaMetrics 服务器上运行 vminsert
,监听 8480
端口,例如:
./vminsert -storageNode=victoriametrics:8400
-storageNode=victoriametrics:8400
:将数据写入 VictoriaMetrics 存储后端(通常是victoriametrics
进程)。
3. 启动 victoriametrics
#
VictoriaMetrics 本体负责存储数据,你需要启动它:
./victoria-metrics -retentionPeriod=3y
-retentionPeriod=3y
:设置数据保留时间为 3 年。
4. 验证数据是否写入 #
在 Prometheus UI 或 VictoriaMetrics Web UI (http://<vm_ip>:8428/vmui
) 里,查询数据,确保数据正常写入。
总结 #
- Prometheus 采集数据,然后 通过
remote_write
推送数据 到vminsert
。 - vminsert 负责接收数据 并存储到 VictoriaMetrics 后端。
- VictoriaMetrics 负责存储和查询数据,支持高效压缩和长时间存储(如 3 年)。
这种方式适合大规模环境,比 Thanos 方案更简单,资源占用更低。你是要用 VictoriaMetrics 作为长期存储吗?