在现代的监控和数据收集体系中,VictoriaMetrics以其出色的性能和开源的时序数据库(TSDB)技术,因其灵活性和高效性而备受瞩目。作为VictoriaMetrics架构中的关键组件,vminsert承担着接收并分发数据到存储节点(vmstorage)的重要职责。本文旨在深入解析vminsert在数据接收与处理流程中的核心逻辑及关键机制。
当指标数据流经系统时,vminsert会先对数据进行预处理,随后将其分发至分布式存储节点。vminsert支持多种数据协议和格式,如Prometheus Remote Write、InfluxDB、OpenTelemetry等,数据通过特定的协议API接口进入vminsert。
数据接入:支持多元协议
无论数据源是Prometheus、InfluxDB还是Datadog,数据都会通过相应的协议API进入vminsert。比如:
Prometheus Remote Write: 接入点为/insert/prometheus。
InfluxDB Line Protocol: 接入点为/insert/influx/write。
OpenTelemetry: 接入点为/insert/opentelemetry/api/v1/push。
不论外部协议如何多样,vminsert内部都会将数据解析为统一的内部结构以供后续处理。
预处理工作流程的核心步骤
1. 解析(Parse): 数据解压并转换为包含metric名称、标签、时间戳和数值的行格式。
3. Marshaling: 数据装成适合vmstorage存储的压缩格式。
4. 分片(Sharding): 通过哈希算法决定数据分发到哪个vmstorage节点。
初始化与握手过程
vminsert在启动时通过-storageNodes参数获取vmstorage节点的位置,并与之建立TCP连接。连接过程中会进行握手,通过这个过程协商压缩算法如zstd或snappy。虽然可以通过-rpc.disableCompression禁用压缩以减轻CPU负载,但这需要额外的网络带宽来传输未压缩数据。
关键监控指标如握手错误计数和连接尝试失败计数等,有助于监控握手步骤的健康状态。
关键数据处理与监控指标
解析阶段可并发处理的请求数由-maxConcurrentInserts参数控制。超过该限制的请求将进入队列,由-insert.maxQueueDuration限制(默认为1分钟)管理队列等待时长。
Relabeling阶段会根据提供的relabelConfig规则文件进行操作,可能会丢弃一部分时间序列。此阶段的关键监控指标包括被丢弃的时间序列数。
数据封装阶段会检查标签数量和长度等限制,如有违反,相关时间序列将被丢弃,异常情况可通过日志或vm_rows_ignored_total指标观察。
分片阶段通过Rendezvous哈希算法确定每个时间序列发送到哪个vmstorage节点,以实现最小数据迁移。
缓冲区机制和重路由机制则保证了数据的暂存和灵活的分发。