Databases

InfluxDB

InfluxDB — база данных временных рядов для метрик, телеметрии и событий IoT, оптимизированная под запись потока точек с меткой времени.

Что такое InfluxDB

InfluxDB — база данных временных рядов (TSDB, time-series database). Специализируется на данных, у которых есть метка времени и которые приходят непрерывным потоком: метрики серверов, показания датчиков, курсы, телеметрия приложений.

Временной ряд отличается от обычных данных характером нагрузки: пишется очень много, почти всегда «в конец» (новые точки с текущим временем), почти никогда не обновляется, а читается диапазонами («средняя загрузка CPU за последний час с шагом в минуту») и со временем теряет ценность. Универсальная СУБД на таком потоке ведёт себя плохо: таблица metrics в PostgreSQL на десятках тысяч вставок в секунду распухает, а старые данные приходится чистить вручную. InfluxDB под это и сделана — сжимает однородные ряды в разы и удаляет устаревшее сама.

Модель данных

measurement,tag=value,tag=value field=value,field=value timestamp
Элемент Что это Индексируется
Measurement Аналог таблицы: cpu, temperature
Tag Метаданные-строки: host, region Да
Field Само значение: число, строка, bool Нет
Timestamp Метка времени Да

Различие тегов и полей — ключевое и определяет всё остальное. По тегам фильтруют и группируют, они проиндексированы. Поля — то, что измеряют; фильтровать по ним можно, но это полный перебор.

Пример в line protocol — родном формате записи:

cpu,host=web-01,region=ru-msk usage_idle=87.3,usage_user=9.1 1752739200000000000
temperature,sensor=s1,room=server field_value=23.5 1752739200000000000

Запись и чтение

# Записать точку через HTTP API (InfluxDB 2.x)
curl -X POST "http://localhost:8086/api/v2/write?org=my-org&bucket=metrics&precision=s" \
  -H "Authorization: Token $INFLUX_TOKEN" \
  --data-raw "cpu,host=web-01 usage_idle=87.3"

Языков запросов исторически два. InfluxQL — SQL-подобный, привычный:

SELECT mean("usage_idle") FROM "cpu"
WHERE "host" = 'web-01' AND time > now() - 1h
GROUP BY time(1m)

Flux — функциональный язык, появившийся во второй версии:

from(bucket: "metrics")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "cpu" and r.host == "web-01")
  |> aggregateWindow(every: 1m, fn: mean)

Разработчики Flux впоследствии сместили приоритет обратно в сторону SQL и InfluxQL, так что при выборе версии стоит смотреть на актуальный статус языков в документации проекта — здесь у InfluxDB заметные метания между мажорными версиями.

Главная ловушка: кардинальность

Самая частая авария на InfluxDB — высокая кардинальность серий. Число серий — это произведение количества уникальных значений всех тегов. Каждая серия индексируется в памяти, и рост произведения съедает RAM до отказа сервиса.

# Хорошо: host (100 значений) × region (5) = 500 серий
cpu,host=web-01,region=ru-msk usage_idle=87.3

# Катастрофа: request_id уникален для каждого запроса
api,host=web-01,request_id=a3f9e2b1 duration=120
# → миллионы серий, база ложится

Правило: в теги идёт только то, у чего ограниченный набор значений. Уникальные идентификаторы (request_id, user_id, trace_id) — в поля, а не в теги. Если хочется хранить каждое событие с уникальным ID, вам нужна не TSDB, а ClickHouse или система трейсинга.

Retention и downsampling

Данные в InfluxDB устаревают, и хранилище это учитывает штатно. Retention policy задаёт срок жизни: старше указанного — удаляется автоматически, без cron и DELETE.

Отсюда стандартная схема: сырые данные с секундной детализацией хранят неделю, а фоновая задача (continuous query / task) агрегирует их до поминутных и пятиминутных средних и складывает в бакет с retention на год. Год истории занимает при этом немного места, потому что детализация уже не нужна.

Экосистема и альтернативы

Классический стек — TICK: Telegraf (сбор метрик), InfluxDB (хранение), Chronograf (интерфейс), Kapacitor (обработка и алерты). На практике визуализацию почти всегда берут из Grafana, которая работает с InfluxDB из коробки.

Telegraf — сильная часть: агент с сотнями плагинов, собирающий метрики ОС, баз данных, Docker, Nginx и принимающий данные по MQTT от устройств IoT.

InfluxDB Prometheus
Модель сбора Push (агент шлёт) Pull (сервер опрашивает)
Профиль Метрики, IoT, события Мониторинг инфраструктуры
Долгое хранение Штатное Нужен внешний бэкенд
Язык InfluxQL / Flux PromQL

Грубое разделение: мониторинг серверов и Kubernetes — обычно Prometheus, датчики и телеметрия с долгой историей — InfluxDB. Другие TSDB того же класса: TimescaleDB (расширение PostgreSQL, если хочется остаться в SQL), VictoriaMetrics, Graphite.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер