golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用

Golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用

VictoriaMetrics是一个快速、节省成本且可扩展的监控和时间序列数据管理解决方案。它提供了高性能和可靠性,是各种规模企业的理想选择。

VictoriaMetrics主要特性

  • Prometheus长期存储:可作为Prometheus的长期存储或直接替代Prometheus和Graphite在Grafana中使用
  • 强大的流聚合:可作为StatsD替代方案
  • 大数据支持:适用于APM、Kubernetes、IoT传感器、联网汽车、工业遥测、金融数据等各种企业工作负载
  • 查询语言:支持PromQL和性能更高的MetricsQL
  • 易于设置:无依赖,单一小型二进制文件,通过命令行标志配置
  • 全局查询视图:多个Prometheus实例或其他数据源可以将数据摄入VictoriaMetrics,并通过单一查询进行查询

使用示例

1. 安装VictoriaMetrics

# 使用Docker运行单节点版本
docker run -d -p 8428:8428 -v /path/to/data:/victoria-metrics-data victoriametrics/victoria-metrics

2. 配置Prometheus远程写入VictoriaMetrics

在Prometheus配置文件中添加远程写入配置:

remote_write:
  - url: http://<victoriametrics-address>:8428/api/v1/write

3. Go客户端写入示例

package main

import (
	"bytes"
	"fmt"
	"net/http"
	"time"
)

func main() {
	// VictoriaMetrics地址
	vmAddr := "http://localhost:8428"

	// 构造Prometheus格式的指标数据
	metric := fmt.Sprintf("test_metric{label=\"value\"} %.2f %d", 123.45, time.Now().UnixNano()/1e9)

	// 创建HTTP请求
	req, err := http.NewRequest("POST", vmAddr+"/api/v1/import/prometheus", bytes.NewBufferString(metric))
	if err != nil {
		panic(err)
	}

	// 设置请求头
	req.Header.Set("Content-Type", "text/plain")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// 检查响应状态
	if resp.StatusCode != http.StatusNoContent {
		panic(fmt.Sprintf("unexpected status code: %d", resp.StatusCode))
	}

	fmt.Println("Metric successfully written to VictoriaMetrics")
}

4. 查询示例

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	// VictoriaMetrics地址
	vmAddr := "http://localhost:8428"

	// 构造查询参数
	params := url.Values{}
	params.Add("query", "test_metric")
	params.Add("time", "now")

	// 创建HTTP请求
	resp, err := http.Get(vmAddr + "/api/v1/query?" + params.Encode())
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

	// 解析JSON响应
	var result map[string]interface{}
	if err := json.Unmarshal(body, &result); err != nil {
		panic(err)
	}

	// 打印查询结果
	fmt.Printf("Query result: %+v\n", result)
}

VictoriaMetrics优势

  1. 内存占用小:处理数百万个唯一时间序列时,比InfluxDB少用10倍RAM,比Prometheus、Thanos或Cortex少用7倍RAM
  2. 高性能:数据摄入和查询性能高,比InfluxDB和TimescaleDB快20倍
  3. 高数据压缩:比TimescaleDB多存储70倍数据点,比Prometheus、Thanos或Cortex少用7倍存储空间
  4. 降低存储成本:根据Grammarly案例研究,比Graphite有效10倍

企业版功能

VictoriaMetrics企业版提供额外功能:

  • 异常检测
  • 备份自动化
  • 多保留策略
  • 降采样
  • 长期支持版本(LTS)
  • 全面支持

VictoriaMetrics是一个强大且高效的时间序列数据库解决方案,特别适合作为Prometheus的长期存储。它的高性能、低资源占用和易用性使其成为监控和时间序列数据管理的优秀选择。


更多关于golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


VictoriaMetrics:高性能时序数据库与Prometheus长期存储解决方案

VictoriaMetrics 是一个高性能、低成本的时序数据库和监控解决方案,可以作为 Prometheus 的长期存储后端。它具有优异的性能、高效的压缩率和易于扩展的架构。

核心特性

  1. 高性能:比 InfluxDB 和 TimescaleDB 快 10 倍以上
  2. 高压缩率:比 Prometheus 本地存储高 10 倍
  3. Prometheus 兼容:支持 PromQL 和 Prometheus 远程读写 API
  4. 运维简单:单节点部署即可处理每秒百万级数据点
  5. 水平扩展:支持集群模式

安装与部署

单节点模式

# 下载最新版本
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.4/victoria-metrics-linux-amd64-v1.93.4.tar.gz
tar xvf victoria-metrics-linux-amd64-v1.93.4.tar.gz

# 运行
./victoria-metrics-prod \
  -storageDataPath=/var/lib/victoria-metrics-data \
  -retentionPeriod=12

Docker 方式

docker run -d -p 8428:8428 \
  -v /path/to/data:/victoria-metrics-data \
  victoriametrics/victoria-metrics \
  -retentionPeriod=12

Prometheus 集成配置

在 Prometheus 配置文件中添加远程写入:

remote_write:
  - url: http://<victoriametrics-address>:8428/api/v1/write

Go 客户端示例

VictoriaMetrics 提供了 Go 客户端库用于直接写入数据:

package main

import (
	"log"
	"time"

	"github.com/VictoriaMetrics/metrics"
)

func main() {
	// 创建计数器
	requests := metrics.NewCounter("http_requests_total")

	// 创建测量值
	requestDuration := metrics.NewSummary("http_request_duration_seconds")

	// 递增计数器
	requests.Inc()

	// 记录持续时间
	start := time.Now()
	time.Sleep(100 * time.Millisecond) // 模拟处理时间
	requestDuration.UpdateDuration(start)

	// 暴露指标
	metrics.WritePrometheus(log.Writer(), true)
}

查询示例

VictoriaMetrics 支持 PromQL,可以通过 HTTP API 查询:

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"
)

func queryVictoriaMetrics() {
	query := `sum(rate(http_requests_total[5m])) by (job)`
	url := fmt.Sprintf("http://localhost:8428/api/v1/query?query=%s", query)

	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}

性能优化技巧

  1. 批量写入:使用 /api/v1/import 接口批量导入数据
  2. 合理设置保留策略:根据需求设置 -retentionPeriod
  3. 使用 vmagent:轻量级替代 Prometheus 的抓取代理
  4. 启用压缩:VictoriaMetrics 自动压缩数据,但可以调整 -storage.minFreeDiskSpaceBytes

监控 VictoriaMetrics 自身

VictoriaMetrics 暴露自身指标,可以通过以下 PromQL 查询监控:

# 内存使用
process_resident_memory_bytes

# 存储使用
vm_data_size_bytes

# 写入性能
rate(vm_rows_inserted_total[5m])

集群模式

对于大规模部署,可以使用 VictoriaMetrics 集群版本:

# 运行 vmstorage 节点
./vmstorage-prod -storageDataPath=/path/to/data -retentionPeriod=3

# 运行 vminsert 节点
./vminsert-prod -storageNode=vmstorage1:8400,vmstorage2:8400

# 运行 vmselect 节点
./vmselect-prod -storageNode=vmstorage1:8401,vmstorage2:8401

VictoriaMetrics 是一个强大且高效的时序数据库解决方案,特别适合作为 Prometheus 的长期存储后端。它的简单性、高性能和低成本使其成为监控基础设施的理想选择。

回到顶部