Instalación y Configuración de VictoriaMetrics

VictoriaMetrics es una base de datos de series temporales (TSDB) de alto rendimiento compatible con Prometheus que ofrece un consumo de memoria y disco notablemente inferior al de su homólogo, con velocidades de escritura e ingestión superiores incluso en hardware modesto. Soporta PromQL, remote write de Prometheus, Graphite y OpenTSDB, lo que facilita su adopción en stacks de monitoreo existentes. Esta guía cubre la instalación en Linux tanto en modo single-node como en cluster, la configuración con Grafana y la migración desde Prometheus.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS 8+/Rocky Linux 8+
  • 1 GB de RAM por cada 10 millones de métricas activas
  • SSD recomendado para mejor rendimiento de escritura
  • Puerto 8428 (single-node) o 8480/8481/8482 (cluster)

Instalación Single-Node

# Descargar el binario de VictoriaMetrics
VM_VERSION=1.99.0
wget "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${VM_VERSION}/victoria-metrics-linux-amd64-v${VM_VERSION}.tar.gz" -P /tmp

cd /tmp && tar xzf victoria-metrics-linux-amd64-v${VM_VERSION}.tar.gz

# Mover los binarios al PATH del sistema
sudo mv victoria-metrics-prod /usr/local/bin/victoria-metrics
sudo chmod +x /usr/local/bin/victoria-metrics

# Crear usuario y directorio de datos
sudo useradd -r -s /bin/false victoriametrics
sudo mkdir -p /var/lib/victoriametrics
sudo chown -R victoriametrics:victoriametrics /var/lib/victoriametrics

# Crear el servicio systemd
sudo tee /etc/systemd/system/victoriametrics.service > /dev/null <<EOF
[Unit]
Description=VictoriaMetrics Time Series Database
After=network.target

[Service]
Type=simple
User=victoriametrics
Group=victoriametrics
ExecStart=/usr/local/bin/victoria-metrics \
    -storageDataPath=/var/lib/victoriametrics \
    -httpListenAddr=:8428 \
    -retentionPeriod=12 \
    -selfScrapeInterval=10s \
    -loggerLevel=INFO
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable victoriametrics --now

# Verificar el estado
sudo systemctl status victoriametrics

# Probar la API
curl http://localhost:8428/health
curl http://localhost:8428/metrics | head -30

Parámetros importantes de VictoriaMetrics

ParámetroDescripciónEjemplo
-storageDataPathDirectorio de datos/var/lib/victoriametrics
-retentionPeriodRetención de datos12 (meses) o 180d (días)
-httpListenAddrPuerto de escucha:8428
-maxConcurrentInsertsInserciones concurrentes8
-search.maxQueryDurationTimeout de consultas30s
-search.maxSamplesPerQueryLímite de muestras por consulta1e9
-memory.allowedPercent% de RAM usable60

Configuración de Prometheus para Remote Write

Configura Prometheus para enviar métricas a VictoriaMetrics via remote write:

# /etc/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

# Configuración de remote write hacia VictoriaMetrics
remote_write:
  - url: http://victoriametrics:8428/api/v1/write
    queue_config:
      max_samples_per_send: 10000
      capacity: 20000
      max_shards: 30
    # Retransmitir datos si VictoriaMetrics no está disponible
    remote_timeout: 30s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
# Reiniciar Prometheus para aplicar la configuración
sudo systemctl restart prometheus

# Verificar que los datos llegan a VictoriaMetrics
curl "http://localhost:8428/api/v1/query?query=up" | python3 -m json.tool

Integración con Grafana

Añade VictoriaMetrics como fuente de datos Prometheus en Grafana:

# Via API de Grafana
curl -X POST http://grafana:3000/api/datasources \
  -u admin:contraseña_grafana \
  -H "Content-Type: application/json" \
  -d '{
    "name": "VictoriaMetrics",
    "type": "prometheus",
    "url": "http://victoriametrics:8428",
    "access": "proxy",
    "isDefault": true,
    "jsonData": {
      "timeInterval": "15s",
      "queryTimeout": "30s",
      "httpMethod": "POST"
    }
  }'

En la interfaz de Grafana:

  1. Configuration → Data Sources → Add data source
  2. Selecciona Prometheus
  3. URL: http://tu-ip-victoriametrics:8428
  4. En Scrape interval: 15s
  5. Save & Test

VictoriaMetrics soporta PromQL, por lo que todos los dashboards de Grafana diseñados para Prometheus funcionan directamente.

Consultas PromQL en VictoriaMetrics

# Consultar métricas via API HTTP (compatible con Prometheus)
# Consulta instantánea
curl "http://localhost:8428/api/v1/query?query=up&time=$(date +%s)"

# Consulta en rango
curl "http://localhost:8428/api/v1/query_range" \
  --data-urlencode "query=rate(node_cpu_seconds_total{mode='user'}[5m])" \
  --data-urlencode "start=$(date -d '1 hour ago' +%s)" \
  --data-urlencode "end=$(date +%s)" \
  --data-urlencode "step=60"

# Listar métricas disponibles
curl "http://localhost:8428/api/v1/label/__name__/values" | python3 -m json.tool

# Listar series de una métrica
curl "http://localhost:8428/api/v1/series?match[]=node_cpu_seconds_total" | python3 -m json.tool

Gestión de Retención y Almacenamiento

# Ver estadísticas de almacenamiento
curl http://localhost:8428/api/v1/status/tsdb | python3 -m json.tool

# Las métricas de VictoriaMetrics muestran el estado interno
curl "http://localhost:8428/api/v1/query?query=vm_data_size_bytes" | python3 -m json.tool

# Verificar el tamaño del directorio de datos
du -sh /var/lib/victoriametrics/

# Forzar merge de partes del almacenamiento (reduce espacio, puede tardar)
curl -X POST http://localhost:8428/internal/force_merge?partition_prefix=all

Para cambiar la retención, edita el parámetro en el servicio systemd:

# Editar el servicio para cambiar la retención
sudo systemctl edit victoriametrics

# Añadir o modificar el flag de retención
[Service]
ExecStart=
ExecStart=/usr/local/bin/victoria-metrics \
    -storageDataPath=/var/lib/victoriametrics \
    -httpListenAddr=:8428 \
    -retentionPeriod=6 \
    -selfScrapeInterval=10s

sudo systemctl daemon-reload
sudo systemctl restart victoriametrics

Instalación en Cluster

El modo cluster de VictoriaMetrics separa los componentes de almacenamiento y consulta:

# Descargar los binarios del cluster
wget "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${VM_VERSION}/victoria-metrics-linux-amd64-v${VM_VERSION}-cluster.tar.gz" -P /tmp
cd /tmp && tar xzf victoria-metrics-linux-amd64-v${VM_VERSION}-cluster.tar.gz

sudo mv vmstorage-prod /usr/local/bin/vmstorage
sudo mv vminsert-prod /usr/local/bin/vminsert
sudo mv vmselect-prod /usr/local/bin/vmselect

Crear los servicios para cada componente:

# vmstorage: almacena los datos (escala horizontalmente)
sudo tee /etc/systemd/system/vmstorage.service > /dev/null <<EOF
[Unit]
Description=VictoriaMetrics Storage
After=network.target

[Service]
Type=simple
User=victoriametrics
ExecStart=/usr/local/bin/vmstorage \
    -storageDataPath=/var/lib/vmstorage \
    -httpListenAddr=:8482 \
    -vminsertAddr=:8400 \
    -vmselectAddr=:8401 \
    -retentionPeriod=12
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

# vminsert: recibe datos y los distribuye entre los vmstorage
sudo tee /etc/systemd/system/vminsert.service > /dev/null <<EOF
[Unit]
Description=VictoriaMetrics Insert
After=network.target

[Service]
Type=simple
User=victoriametrics
ExecStart=/usr/local/bin/vminsert \
    -httpListenAddr=:8480 \
    -storageNode=vmstorage-1:8400,vmstorage-2:8400
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# vmselect: maneja las consultas y las distribuye entre los vmstorage
sudo tee /etc/systemd/system/vmselect.service > /dev/null <<EOF
[Unit]
Description=VictoriaMetrics Select
After=network.target

[Service]
Type=simple
User=victoriametrics
ExecStart=/usr/local/bin/vmselect \
    -httpListenAddr=:8481 \
    -storageNode=vmstorage-1:8401,vmstorage-2:8401 \
    -dedup.minScrapeInterval=15s
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable vmstorage vminsert vmselect --now

En el cluster:

  • Remote write de Prometheus: http://vminsert:8480/insert/0/prometheus/api/v1/write
  • Consultas desde Grafana: http://vmselect:8481/select/0/prometheus

VMAgent: Recolector Ligero

VMAgent es un agente de recolección de métricas ligero que reemplaza a Prometheus para el scraping:

# Descargar vmagent
wget "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v${VM_VERSION}/vmutils-linux-amd64-v${VM_VERSION}.tar.gz" -P /tmp
cd /tmp && tar xzf vmutils-linux-amd64-v${VM_VERSION}.tar.gz
sudo mv vmagent-prod /usr/local/bin/vmagent

# Servicio de vmagent
sudo tee /etc/systemd/system/vmagent.service > /dev/null <<EOF
[Unit]
Description=VMAgent Metrics Scraper
After=network.target

[Service]
Type=simple
User=victoriametrics
ExecStart=/usr/local/bin/vmagent \
    -promscrape.config=/etc/vmagent/scrape.yaml \
    -remoteWrite.url=http://localhost:8428/api/v1/write \
    -remoteWrite.tmpDataPath=/var/lib/vmagent \
    -httpListenAddr=:8429
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

Solución de Problemas

VictoriaMetrics no arranca:

# Revisar logs del servicio
sudo journalctl -u victoriametrics -n 100 --no-pager

# Verificar permisos
ls -la /var/lib/victoriametrics/
sudo chown -R victoriametrics:victoriametrics /var/lib/victoriametrics/

Prometheus no puede hacer remote write:

# Verificar que VictoriaMetrics acepta el endpoint de remote write
curl -X POST http://localhost:8428/api/v1/write \
  -H "Content-Type: application/x-protobuf" \
  --data-binary ""
# Debe responder 204 No Content

# Revisar los logs de Prometheus para errores de remote write
sudo journalctl -u prometheus -n 50 | grep -i "remote"

Alto consumo de memoria:

# Limitar el porcentaje de RAM que puede usar VictoriaMetrics
# Añadir al ExecStart:
-memory.allowedPercent=50

# Ver el consumo actual de memoria
curl "http://localhost:8428/api/v1/query?query=process_resident_memory_bytes{job='victoria-metrics'}"

Consultas lentas:

# Activar el log de consultas lentas
# Añadir al ExecStart:
-search.logSlowQueryDuration=5s

# Ver las consultas más costosas
curl http://localhost:8428/metrics | grep vm_query

Conclusión

VictoriaMetrics es una alternativa a Prometheus para almacenamiento a largo plazo que destaca por su eficiencia en el uso de recursos, su compatibilidad total con el ecosistema Prometheus/Grafana y la facilidad de operación, especialmente en modo single-node donde un único binario gestiona toda la funcionalidad. Para entornos que requieren alta disponibilidad o ingesta de cientos de millones de métricas, el modo cluster proporciona escalabilidad horizontal sin la complejidad de otros sistemas distribuidos. La combinación de VMAgent + VictoriaMetrics reemplaza eficazmente a Prometheus en la mayoría de los casos de uso de monitoreo.