VictoriaMetrics: замена Prometheus для больших объёмов метрик

Почему VictoriaMetrics вместо Prometheus

Prometheus — стандарт де-факто для сбора метрик, однако при масштабировании возникают серьёзные проблемы: высокое потребление памяти, сложности с долгосрочным хранением и отсутствие нативной кластеризации. VictoriaMetrics решает эти проблемы.

Ключевые преимущества VictoriaMetrics:

  • Потребление памяти в 7-10 раз ниже, чем у Prometheus при том же объёме данных
  • Сжатие данных на диске — до 70x по сравнению с Prometheus TSDB
  • Полная совместимость с PromQL — расширенный язык запросов MetricsQL
  • Долгосрочное хранение — данные хранятся годами без деградации производительности
  • Кластерная версия — горизонтальное масштабирование из коробки
  • Поддержка множества протоколов — Prometheus, InfluxDB, OpenTSDB, Graphite, DataDog

VictoriaMetrics существует в двух вариантах: single-node (один процесс, подходит для большинства инсталляций) и cluster (для петабайтных объёмов). Single-node версия обрабатывает до миллиона метрик в секунду на одном сервере.

Установка single-node VictoriaMetrics

Установим VictoriaMetrics single-node на Ubuntu 22.04. Для большинства организаций с количеством метрик до 10 миллионов активных таймсерий этого более чем достаточно.

# Скачиваем последнюю версию
VERSION=$(curl -s https://api.github.com/repos/VictoriaMetrics/VictoriaMetrics/releases/latest | grep tag_name | cut -d'"' -f4)
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VERSION}/victoria-metrics-linux-amd64-${VERSION}.tar.gz

# Распаковываем
tar xzf victoria-metrics-linux-amd64-*.tar.gz
sudo mv victoria-metrics-prod /usr/local/bin/

# Создаём пользователя и каталоги
sudo useradd -r -s /bin/false victoriametrics
sudo mkdir -p /var/lib/victoriametrics /etc/victoriametrics
sudo chown victoriametrics:victoriametrics /var/lib/victoriametrics

Создаём systemd-юнит /etc/systemd/system/victoriametrics.service:

[Unit]
Description=VictoriaMetrics
After=network.target

[Service]
User=victoriametrics
Group=victoriametrics
ExecStart=/usr/local/bin/victoria-metrics-prod \
  -storageDataPath=/var/lib/victoriametrics \
  -retentionPeriod=12 \
  -httpListenAddr=:8428 \
  -selfScrapeInterval=15s \
  -memory.allowedPercent=60
Restart=always
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now victoriametrics

# Проверяем
curl http://localhost:8428/health
# должен вернуть "OK"

Ключевые параметры запуска

Основные флаги, влияющие на производительность и хранение:

  • -retentionPeriod=12 — хранение данных 12 месяцев (можно указать в днях: 365d)
  • -memory.allowedPercent=60 — процент RAM, доступный для кэшей
  • -search.maxConcurrentRequests=16 — параллельные запросы (по умолчанию 2×CPU)
  • -dedup.minScrapeInterval=30s — дедупликация данных при нескольких Prometheus
  • -maxLabelsPerTimeseries=30 — лимит меток на таймсерию

Для мониторинга самой VictoriaMetrics включите -selfScrapeInterval=15s. Метрики доступны по /metrics.

Миграция с Prometheus на VictoriaMetrics

VictoriaMetrics может работать параллельно с Prometheus, постепенно заменяя его. Первый шаг — настроить Prometheus для записи данных в VictoriaMetrics через remote_write.

В /etc/prometheus/prometheus.yml добавьте:

remote_write:
  - url: http://victoriametrics:8428/api/v1/write
    queue_config:
      max_samples_per_send: 10000
      capacity: 20000
      max_shards: 30

Теперь все метрики Prometheus дублируются в VictoriaMetrics. Переключите Grafana на VictoriaMetrics как источник данных:

  1. В Grafana перейдите в Configuration → Data Sources
  2. Добавьте новый источник типа Prometheus
  3. URL: http://victoriametrics:8428
  4. Сохраните и переключите дашборды на новый источник

После успешной проверки можно полностью заменить Prometheus на vmagent для скрапинга:

# vmagent полностью совместим с конфигурацией Prometheus
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/${VERSION}/vmutils-linux-amd64-${VERSION}.tar.gz
tar xzf vmutils-linux-amd64-*.tar.gz
sudo mv vmagent-prod /usr/local/bin/

Systemd-юнит для vmagent:

[Unit]
Description=VictoriaMetrics Agent
After=network.target

[Service]
User=victoriametrics
ExecStart=/usr/local/bin/vmagent-prod \
  -promscrape.config=/etc/victoriametrics/scrape.yml \
  -remoteWrite.url=http://localhost:8428/api/v1/write \
  -remoteWrite.tmpDataPath=/var/lib/vmagent
Restart=always

[Install]
WantedBy=multi-user.target

Конфигурация скрапинга метрик

Формат конфигурации vmagent полностью совместим с prometheus.yml. Пример /etc/victoriametrics/scrape.yml для типичной инфраструктуры:

global:
  scrape_interval: 30s
  scrape_timeout: 10s

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - 'web-01:9100'
          - 'web-02:9100'
          - 'db-01:9100'
          - 'db-02:9100'
    relabel_configs:
      - source_labels: [__address__]
        regex: '(.+):.*'
        target_label: instance
        replacement: '$1'

  - job_name: 'mysql-exporter'
    static_configs:
      - targets: ['db-01:9104', 'db-02:9104']

  - job_name: 'nginx-exporter'
    static_configs:
      - targets: ['web-01:9113', 'web-02:9113']

  - job_name: 'blackbox-http'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://company.ru
          - https://api.company.ru
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox:9115

Vmagent поддерживает service discovery для Kubernetes, Consul, EC2, DNS и других систем — конфигурация аналогична Prometheus.

Алертинг с vmalert

Для оповещений VictoriaMetrics предлагает vmalert — аналог Alertmanager, совместимый с правилами Prometheus.

sudo mv vmalert-prod /usr/local/bin/

Конфигурация /etc/victoriametrics/alerts.yml:

groups:
  - name: infrastructure
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Высокая нагрузка CPU на {{ $labels.instance }}"
          description: "CPU загружен на {{ $value | printf \"%.1f\" }}% более 10 минут."

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100 < 10
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Мало места на диске {{ $labels.instance }}:{{ $labels.mountpoint }}"
          description: "Осталось {{ $value | printf \"%.1f\" }}% свободного места."

      - alert: ServiceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Сервис недоступен: {{ $labels.job }} на {{ $labels.instance }}"

Запуск vmalert:

/usr/local/bin/vmalert-prod \
  -datasource.url=http://localhost:8428 \
  -remoteRead.url=http://localhost:8428 \
  -remoteWrite.url=http://localhost:8428 \
  -notifier.url=http://alertmanager:9093 \
  -rule="/etc/victoriametrics/alerts.yml"

Кластерная версия VictoriaMetrics

Для крупных инфраструктур (более 10 миллионов активных таймсерий) используется кластерная версия, состоящая из трёх компонентов:

  • vminsert — принимает данные и распределяет по шардам
  • vmstorage — хранит данные на диске
  • vmselect — обрабатывает запросы, агрегируя данные с шардов

Минимальная конфигурация кластера — 3 ноды vmstorage с репликацией:

# На нодах хранения (storage-01, storage-02, storage-03)
/usr/local/bin/vmstorage-prod \
  -storageDataPath=/var/lib/vmstorage \
  -retentionPeriod=24 \
  -vminsertAddr=:8400 \
  -vmselectAddr=:8401

# На нодах vminsert (можно на тех же серверах)
/usr/local/bin/vminsert-prod \
  -httpListenAddr=:8480 \
  -storageNode=storage-01:8400,storage-02:8400,storage-03:8400 \
  -replicationFactor=2

# На нодах vmselect
/usr/local/bin/vmselect-prod \
  -httpListenAddr=:8481 \
  -storageNode=storage-01:8401,storage-02:8401,storage-03:8401 \
  -dedup.minScrapeInterval=30s

Параметр -replicationFactor=2 означает, что каждая метрика записывается на 2 из 3 нод. При выходе одной ноды данные остаются доступными.

Grafana подключается к vmselect: http://vmselect:8481/select/0/prometheus.

Оптимизация и обслуживание

VictoriaMetrics требует минимального обслуживания, но некоторые настройки существенно влияют на производительность.

Мониторинг самой VictoriaMetrics — ключевые метрики для Grafana:

# Скорость приёма данных
rate(vm_rows_inserted_total[5m])

# Активные таймсерии
vm_cache_entries{type="storage/metricName"}

# Использование памяти
process_resident_memory_bytes / 1024 / 1024 / 1024

# Медленные запросы
vm_slow_queries_total

Рекомендации по ресурсам:

Метрик/секRAMCPUДиск
100K4 ГБ2 ядраSSD 100 ГБ
500K16 ГБ8 ядерSSD 500 ГБ
1M+32 ГБ16 ядерNVMe 1 ТБ

Резервное копирование выполняется через vmbackup:

# Полный бэкап в S3
vmbackup-prod \
  -storageDataPath=/var/lib/victoriametrics \
  -dst=s3://bucket/vm-backup/$(date +%Y%m%d) \
  -credsFilePath=/etc/victoriametrics/s3-creds.json

# Инкрементальный бэкап
vmbackup-prod \
  -storageDataPath=/var/lib/victoriametrics \
  -dst=s3://bucket/vm-backup/latest \
  -origin=s3://bucket/vm-backup/20260401

Часто задаваемые вопросы

Да, VictoriaMetrics полностью совместима с PromQL. В Grafana достаточно изменить URL источника данных с Prometheus на VictoriaMetrics (http://vm:8428). Все существующие дашборды и запросы продолжат работать без изменений.

VictoriaMetrics сжимает данные в среднем до 0.4-0.8 байт на точку данных. Для 100 000 метрик со скрапом каждые 30 секунд потребуется примерно 30-60 ГБ на год хранения. Это в 7-10 раз меньше, чем у Prometheus TSDB.

Single-node версия обрабатывает до миллиона метрик в секунду и десятки миллионов активных таймсерий. Для инфраструктуры до 500 серверов с типичным набором экспортеров single-node более чем достаточно. Кластер нужен при требованиях к горизонтальному масштабированию и высокой доступности хранилища.

VictoriaMetrics предоставляет Helm-чарты и оператор для Kubernetes. Оператор VMOperator устанавливается через helm install vm-operator vm/victoria-metrics-operator и поддерживает CRD: VMCluster, VMAgent, VMAlert, VMSingle. Service discovery Kubernetes работает идентично Prometheus.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#VictoriaMetrics#Prometheus альтернатива#TSDB#хранение метрик#мониторинг#PromQL#Grafana метрики#time series database
Комментарии 0

Оставить комментарий

загрузка...