1. 项目概述
VictoriaMetrics(简称VM)是一款高性能、低成本的时序数据库,特别适合存储和查询Prometheus指标数据。相比传统的Prometheus本地存储,VM提供了更高效的压缩算法、更低的资源占用以及更灵活的数据保留策略。在实际生产环境中,我们通常需要将VM作为集中式存储后端,接收来自多个Prometheus实例的数据。
使用Docker Compose部署VM具有以下优势:
- 快速部署:几分钟内即可完成环境搭建
- 隔离性好:容器化运行不影响宿主机其他服务
- 配置简单:通过YAML文件定义所有服务参数
- 易于维护:一键启动/停止/更新服务
2. 环境准备
2.1 系统要求
建议满足以下最低配置:
- Linux系统(CentOS/Ubuntu等)
- Docker 20.10.0+
- Docker Compose 1.29.0+
- 4核CPU
- 8GB内存
- 100GB可用磁盘空间(根据数据量调整)
注意:生产环境建议使用SSD存储,能显著提升VM的读写性能
2.2 目录结构规划
合理的目录结构有助于后期维护:
code复制/victoriametrics/
├── docker-compose.yaml
├── victoria-metrics-data/
│ ├── data/ # 主数据目录
│ └── snapshots/ # 快照备份目录
└── prometheus/ # Prometheus配置目录(可选)
3. Docker Compose部署VM
3.1 编写docker-compose.yaml
yaml复制version: '3.8'
services:
victoriametrics:
image: victoriametrics/victoria-metrics:v1.79.12
container_name: victoriametrics
hostname: victoriametrics
restart: unless-stopped
environment:
TZ: Asia/Shanghai
ports:
- "8428:8428"
volumes:
- ./victoria-metrics-data/data:/victoria-metrics-data
- ./victoria-metrics-data/snapshots:/victoria-metrics-data/snapshots
command:
- "--loggerTimezone=Asia/Shanghai"
- "--retentionPeriod=15d"
- "--storageDataPath=/victoria-metrics-data"
- "--snapshotsPath=/victoria-metrics-data/snapshots"
关键参数说明:
retentionPeriod: 数据保留周期(15天)storageDataPath: 数据存储路径snapshotsPath: 快照存储路径restart: unless-stopped: 容器异常退出时自动重启
3.2 启动服务
bash复制mkdir -p victoriametrics/victoria-metrics-data/{data,snapshots}
cd victoriametrics
docker-compose up -d
验证服务状态:
bash复制docker-compose ps
docker logs -f victoriametrics
4. 基础功能测试
4.1 服务健康检查
bash复制curl http://localhost:8428/metrics | grep vm_
预期输出应包含VM的各项运行指标,如:
code复制vm_active_merges{type="indexdb"} 0
vm_allocated_bytes 1.234567e+07
4.2 数据写入测试
写入测试数据:
bash复制curl -X POST 'http://localhost:8428/api/v1/import/prometheus' \
--data-binary 'test_metric{env="dev"} 1'
查询测试数据:
bash复制curl 'http://localhost:8428/api/v1/query?query=test_metric'
5. Prometheus集成配置
5.1 基本远程写入配置
在Prometheus的prometheus.yml中添加:
yaml复制remote_write:
- url: http://vm-host:8428/api/v1/write
queue_config:
max_samples_per_send: 10000
capacity: 20000
参数说明:
max_samples_per_send: 每批最大样本数capacity: 队列缓冲区容量
5.2 高级过滤配置
只保留特定指标:
yaml复制remote_write:
- url: http://vm-host:8428/api/v1/write
write_relabel_configs:
- source_labels: [__name__]
regex: '(node_.*|container_.*)'
action: keep
排除特定指标:
yaml复制 write_relabel_configs:
- source_labels: [__name__]
regex: 'go_.*'
action: drop
6. 备份与恢复方案
6.1 自动化备份脚本
创建备份脚本/scripts/vm_backup.sh:
bash复制#!/bin/bash
SNAPSHOT=$(curl -s -X POST http://localhost:8428/snapshot/create | jq -r .snapshot)
if [ -z "$SNAPSHOT" ]; then
echo "备份失败!"
exit 1
fi
# 压缩快照节省空间
tar -czf /backups/vm-snapshots/${SNAPSHOT}.tar.gz \
-C /victoriametrics/victoria-metrics-data/snapshots ${SNAPSHOT}
# 保留最近7天备份
find /backups/vm-snapshots -type f -mtime +7 -delete
设置定时任务(每天2:10执行):
bash复制10 2 * * * /scripts/vm_backup.sh >> /var/log/vm_backup.log 2>&1
6.2 数据恢复流程
- 停止VM服务:
bash复制docker-compose down
- 准备恢复目录:
bash复制mkdir -p /victoriametrics/victoria-metrics-data/data-new
tar -xzf vm-snapshot-20240301.tar.gz -C /victoriametrics/victoria-metrics-data/data-new
- 切换数据目录:
bash复制mv /victoriametrics/victoria-metrics-data/data /victoriametrics/victoria-metrics-data/data-old
mv /victoriametrics/victoria-metrics-data/data-new /victoriametrics/victoria-metrics-data/data
- 重启服务:
bash复制docker-compose up -d
7. 性能优化建议
7.1 内存配置
对于大容量部署,建议增加内存限制:
yaml复制services:
victoriametrics:
deploy:
resources:
limits:
memory: 16G
7.2 持久化存储优化
- 使用本地SSD存储
- 禁用atime更新:
bash复制mount -o remount,noatime /victoriametrics/victoria-metrics-data
- 调整文件系统参数(ext4):
bash复制tune2fs -o journal_data_writeback /dev/sdX
7.3 查询优化
- 使用
-dedup.minScrapeInterval去重 - 合理设置
-search.maxQueryDuration - 启用缓存:
yaml复制command:
- "--search.cacheTimestampOffset=5m"
8. 常见问题排查
8.1 写入失败
错误现象:
code复制remote write returned HTTP status 429: {"status":"error","errorType":"capacity exceeded"}
解决方案:
- 增加队列容量
- 降低采样频率
- 分批写入
8.2 查询超时
调整查询超时时间:
bash复制curl 'http://localhost:8428/api/v1/query?query=...&timeout=2m'
8.3 磁盘空间不足
- 缩短保留周期:
yaml复制command:
- "--retentionPeriod=7d"
- 启用压缩:
yaml复制 - "--storage.minFreeDiskSpaceBytes=10GB"
9. 监控与告警
9.1 关键监控指标
- 存储使用率:
code复制vm_data_size_bytes / vm_free_disk_space_bytes
- 写入性能:
code复制vm_rows_inserted_total
vm_ingestion_rate
- 查询性能:
code复制vm_query_duration_seconds
9.2 Prometheus告警规则示例
yaml复制groups:
- name: VM Alerts
rules:
- alert: VMDiskSpaceLow
expr: vm_free_disk_space_bytes / vm_data_size_bytes < 0.2
for: 30m
labels:
severity: critical
annotations:
summary: "VM disk space low (instance {{ $labels.instance }})"
description: "Only {{ $value | humanizePercentage }} free space left"
10. 生产环境建议
- 集群部署:对于高可用需求,考虑使用VM集群版
- 定期维护:每月执行一次
-forceMerge - 容量规划:预留20%的磁盘空间
- 版本升级:先测试再生产,注意版本兼容性
我在实际使用中发现,合理设置retentionPeriod和-storage.minFreeDiskSpaceBytes能有效避免磁盘爆满问题。对于写入量大的场景,建议将max_samples_per_send调大到5000-10000,同时增加队列capacity。