VictoriaMetrics: замена Prometheus для больших объёмов метрик
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41

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

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 тянет до миллиона метрик в секунду на одном сервере — этого хватает с запасом для 95% наших клиентов.

Установка 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 отдаём под кэши. На выделенном сервере можно поднять до 70-80%
  • -search.maxConcurrentRequests=16 — параллельные запросы. По умолчанию 2×CPU, но при интенсивных дашбордах Grafana лучше поднять вручную
  • -dedup.minScrapeInterval=30s — дедупликация, когда несколько Prometheus пишут одни и те же метрики. Без этого флага получите дубли
  • -maxLabelsPerTimeseries=30 — лимит меток на таймсерию. Защита от кардинальности, которая убивает производительность

Включите -selfScrapeInterval=15s — VictoriaMetrics будет мониторить сама себя. Метрики доступны по /metrics, и это первое, что смотришь при любых проблемах с производительностью.

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

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

В /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 идут и туда, и туда. Переключаем Grafana на VictoriaMetrics как источник данных:

  1. В Grafana перейдите в Configuration → Data Sources
  2. Добавьте новый источник типа Prometheus — VictoriaMetrics полностью совместима с этим типом
  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
Конфигурация скрапинга метрик
Конфигурация скрапинга в VictoriaMetrics

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

Формат конфигурации 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

Service discovery для Kubernetes, Consul, EC2, DNS и других систем в vmagent настраивается точно так же, как в Prometheus. Если уже есть рабочий конфиг — просто переносите.

Service discovery для большого парка серверов

Когда хостов не пять, а пятьдесят и больше, ручное перечисление в static_configs превращается в ад. Вместо этого используйте динамическую регистрацию целей:

  • file_sd_configs — JSON-файл, который генерирует Ansible, Terraform или любой скрипт;
  • consul_sd_configs — динамическая регистрация через Consul;
  • dns_sd_configs — SRV-записи в DNS.

Пример file-based service discovery для vmagent:

scrape_configs:
  - job_name: 'node'
    file_sd_configs:
      - files:
          - /etc/victoriametrics/targets/node-*.json
        refresh_interval: 30s

Формат файла целей:

[
  {
    "targets": ["web01:9100", "web02:9100"],
    "labels": {"env": "production", "role": "web"}
  },
  {
    "targets": ["db01:9100"],
    "labels": {"env": "production", "role": "db"}
  }
]

Файл обновляется без перезапуска vmagent — достаточно изменить JSON, и новые цели подхватятся в течение refresh_interval.

Алертинг с vmalert

С алертами тоже всё продумано. В составе VictoriaMetrics есть vmalert — работает с правилами Prometheus без переписывания, уведомления шлёт через Alertmanager.

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"

Группировка и маршрутизация алертов в Alertmanager

Классическая проблема при росте инфраструктуры — alert fatigue: один сетевой сбой порождает сотни одинаковых уведомлений, и дежурный перестаёт на них реагировать. Alertmanager решает это тремя механизмами: группировкой, маршрутизацией по severity и подавлением дублей через inhibit rules.

Ключевой фрагмент конфигурации — маршрутизация по уровню критичности: critical летит и в Telegram, и на почту, warning — только в Telegram, info — только на email. Ночью никто не хочет получать письмо про предупреждение, которое само рассосётся:

route:
  receiver: 'telegram-critical'
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - match:
        severity: critical
      receiver: 'telegram-critical'
      repeat_interval: 1h
    - match:
        severity: warning
      receiver: 'telegram-warning'
      repeat_interval: 4h

Секция inhibit_rules делает простую, но важную вещь: если по хосту уже пришёл critical — все warning по нему подавляются. Дежурный получает одно сообщение, а не пятьдесят.

Кластерная версия 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 в обслуживании проста — если сравнивать с тем же Prometheus или Thanos, разница ощутимая. Но несколько настроек всё же существенно влияют на производительность, и лучше разобраться с ними заранее.

Мониторинг самой 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

Реальный кейс: 60 серверов за один день

В марте 2025 года к нам обратилась торговая компания из Москвы с парком из 60 серверов на Debian и Ubuntu. Старый мониторинг на Cacti/Nagios давал столько ложных срабатываний, что админы просто перестали доверять алертам. Задача — заменить всё за один рабочий день на современный стек с централизованной панелью и Telegram-уведомлениями.

План был таким: утром раскатали node_exporter через Ansible-плейбук — на все 60 серверов ушло 30 минут. К обеду подняли Prometheus, Alertmanager и Grafana на выделенной виртуалке. После обеда настроили дашборды, правила и Telegram-бота. К 18:30 система полностью работала.

За первые сутки пришло два критичных алерта: на одном сервере раздел /var оказался забит на 96%, а на файлохранилище обнаружилась деградация RAID — диск выпал ещё неделю назад, но прежний мониторинг этого не заметил. Стоимость работ — 34 000 рублей.

Практики из боевого опыта

Несколько правил, которые экономят нервы при эксплуатации:

  • Добавляйте метки env, role, team к каждой job — без них PromQL-запросы быстро превращаются в нечитаемый хаос.
  • Начинайте с 10–15 алертов, не со 150. Alert fatigue — главный враг: когда алертов слишком много, их перестают замечать.
  • Держите сервер мониторинга отдельно от боевых приложений. Если прод упадёт и утащит за собой мониторинг, вы даже не узнаете, что произошло.
  • Храните дашборды Grafana в Git через provisioning, а не в базе данных — так ими можно управлять как кодом.
  • Настройте HTTPS и аутентификацию Grafana с первого дня, а не «потом».

Для резервного копирования сохраняйте /etc/prometheus (или /etc/victoriametrics), данные в /var/lib/prometheus и /var/lib/grafana — иначе при восстановлении дашборды придётся рисовать заново.

Практические PromQL-запросы для дашбордов

Библиотека проверенных запросов, которые закрывают 90% потребностей ежедневного мониторинга. Для CPU, RAM, диска и сети:

# Загрузка CPU в процентах (все ядра)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Использование RAM в процентах
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# Прогноз заполнения диска (через сколько часов закончится)
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[24h], 3600 * 24 * 7) / 1024^3

# Входящий трафик (Мбит/с)
rate(node_network_receive_bytes_total{device!~"lo|veth.*"}[5m]) * 8 / 1024^2

Для обзорного дашборда по всей инфраструктуре — агрегация, чтобы видеть картину целиком, а не сервер за сервером:

# Средняя загрузка CPU по окружению
avg by (env) (100 - rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100)

# Топ-5 серверов по загрузке CPU
topk(5, 100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Количество серверов по окружению
count by (env) (up{job="nodes"} == 1)

Recording rules — предвычисленные результаты тяжёлых запросов — ускоряют дашборды на порядок. Дашборд на 200+ серверов без них открывался бы секунд десять, с ними — мгновенно.

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

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

На практике VictoriaMetrics сжимает данные до 0.4–0.8 байт на точку. Считайте сами: 100 000 метрик, скрап каждые 30 секунд — и за год вы потратите 30–60 ГБ дискового пространства. Prometheus TSDB на том же объёме съест в 7–10 раз больше. Мы проверяли это не один раз.

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

С Kubernetes всё достаточно удобно. Есть готовые Helm-чарты и оператор VMOperator — ставится одной командой: helm install vm-operator vm/victoria-metrics-operator. Поддерживает CRD: VMCluster, VMAgent, VMAlert, VMSingle. Service discovery работает точно так же, как в Prometheus, так что переучиваться не придётся.

#VictoriaMetrics#Prometheus альтернатива#TSDB#хранение метрик#мониторинг#PromQL#Grafana метрики#time series database

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Комментарии 0

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

загрузка...

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.