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优势
- 内存占用小:处理数百万个唯一时间序列时,比InfluxDB少用10倍RAM,比Prometheus、Thanos或Cortex少用7倍RAM
- 高性能:数据摄入和查询性能高,比InfluxDB和TimescaleDB快20倍
- 高数据压缩:比TimescaleDB多存储70倍数据点,比Prometheus、Thanos或Cortex少用7倍存储空间
- 降低存储成本:根据Grammarly案例研究,比Graphite有效10倍
企业版功能
VictoriaMetrics企业版提供额外功能:
- 异常检测
- 备份自动化
- 多保留策略
- 降采样
- 长期支持版本(LTS)
- 全面支持
VictoriaMetrics是一个强大且高效的时间序列数据库解决方案,特别适合作为Prometheus的长期存储。它的高性能、低资源占用和易用性使其成为监控和时间序列数据管理的优秀选择。
更多关于golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能时序数据库与Prometheus长期存储插件VictoriaMetrics的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
VictoriaMetrics:高性能时序数据库与Prometheus长期存储解决方案
VictoriaMetrics 是一个高性能、低成本的时序数据库和监控解决方案,可以作为 Prometheus 的长期存储后端。它具有优异的性能、高效的压缩率和易于扩展的架构。
核心特性
- 高性能:比 InfluxDB 和 TimescaleDB 快 10 倍以上
- 高压缩率:比 Prometheus 本地存储高 10 倍
- Prometheus 兼容:支持 PromQL 和 Prometheus 远程读写 API
- 运维简单:单节点部署即可处理每秒百万级数据点
- 水平扩展:支持集群模式
安装与部署
单节点模式
# 下载最新版本
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))
}
性能优化技巧
- 批量写入:使用
/api/v1/import
接口批量导入数据 - 合理设置保留策略:根据需求设置
-retentionPeriod
- 使用 vmagent:轻量级替代 Prometheus 的抓取代理
- 启用压缩: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 的长期存储后端。它的简单性、高性能和低成本使其成为监控基础设施的理想选择。