InfluxDB — база данных для временных рядов: показаний датчиков, метрик серверов, событий и результатов опросов. В отличие от универсальной реляционной базы, она оптимизирована под запись потока точек с метками времени и агрегаты по интервалам. В 2026 году актуальна линейка InfluxDB 3 с SQL и InfluxQL, а старые 2.x и 1.x всё ещё встречаются в эксплуатации. Разберём запуск, запись, схему, запросы и обслуживание без привязки к облаку.
Модель данных и версии
Точка состоит из измерения (таблицы), набора тегов, полей и метки времени. Теги — это атрибуты, по которым фильтруют и группируют: комната, устройство, регион. Поля — сами значения: температура, влажность, счётчик. В 2.x теги индексируются, в 3.x данные хранятся в Parquet и обрабатываются DataFusion, но принцип остаётся: теги должны быть низкой кардинальности, а уникальные идентификаторы и произвольный текст — полями.
- 3.x Core — локальный сервер с HTTP API на порту 8181, SQL и InfluxQL, объектное хранилище (файл, S3, Azure, GCS).
- 2.x — зрелая ветка с Flux, бакетами и задачами; подходит, если у вас уже написаны Flux-запросы.
- 1.x — устаревшая схема с базами и retention policies; новые проекты на неё закладывать не стоит.
Важно: InfluxDB 3 не выполняет Flux. Если миграция с 2.x критична, проверьте, какие запросы и задачи придётся переписать на SQL или InfluxQL. Для новых домашних проектов проще сразу начать с 3 Core.
Запуск в Docker
Для домашнего сервера удобен Docker Compose: данные лежат в локальном каталоге, порт открыт только на loopback. Такой запуск не требует установки пакетов в систему.
services:
influxdb3:
image: influxdb:3-core
container_name: influxdb3
ports:
- "127.0.0.1:8181:8181"
command:
- influxdb3
- serve
- --node-id=home
- --object-store=file
- --data-dir=/var/lib/influxdb3/data
volumes:
- ./influxdb3-data:/var/lib/influxdb3/data
restart: unless-stopped
Запуск: docker compose up -d, логи: docker compose logs -f influxdb3. Если нужен доступ с других машин, не публикуйте порт в интернет напрямую: поставьте reverse proxy с TLS и авторизацией. До создания первого токена endpoint настройки открыт, поэтому начинайте с привязки к 127.0.0.1.
Токен и база
Создайте административный токен. Он выводится один раз — сохраните его в менеджере паролей. Для удобства можно определить alias, который выполняет CLI внутри контейнера.
alias idb='docker exec -i influxdb3 influxdb3'
idb create token --admin
export TOKEN='вставьте_токен'
idb create database --token "$TOKEN" --retention-period 30d sensors
idb show databases --token "$TOKEN"
Параметр --retention-period 30d означает, что данные старше 30 дней перестанут быть доступны для запросов. Для архива агрегатов лучше создать отдельную базу с большим сроком и писать туда свёртки, а не хранить сырые точки годами.
Запись данных
Формат line protocol прост: измерение, теги, поля, время. В примере — показания комнатного датчика. Время можно не указывать, тогда сервер подставит текущее; для повторной загрузки истории эпоху задают явно.
idb write --database sensors --token "$TOKEN" \
'climate,room=kitchen,device=esp32-01 temp=21.4,hum=45.2 1767225600000000000
climate,room=office,device=esp32-02 temp=20.8,hum=41.0 1767225600000000000'
Дробные значения пишутся без кавычек, целые — с суффиксом i, строки — в кавычках. Точку с запятой в конце не ставят. Для пакетной загрузки используйте --file и файл с несколькими строками: так меньше накладных расходов, чем при вызове CLI на каждую точку.
Не делайте тегом серийный номер каждого устройства, идентификатор запроса или сообщение об ошибке. Кардинальность растёт, индексы и словари разбухают, а запросы замедляются. Лучше вынести такие данные в поля или отдельную таблицу событий.
Запросы на SQL
В 3 Core доступен SQL. Начните с последних значений и убедитесь, что данные вообще дошли.
idb query --database sensors --token "$TOKEN" \
"SELECT room, temp, hum, time FROM climate
ORDER BY time DESC LIMIT 5"
Дальше — агрегаты по часам. date_trunc округляет время, avg и max считают статистику, GROUP BY группирует по комнате и интервалу.
idb query --database sensors --token "$TOKEN" \
"SELECT date_trunc('hour', time) AS bucket, room,
avg(temp) AS temp_avg, max(hum) AS hum_max
FROM climate
WHERE time > now() - INTERVAL '24 hours'
GROUP BY date_trunc('hour', time), room
ORDER BY bucket DESC"
Для дашборда Grafana подключите источник InfluxDB и используйте SQL или InfluxQL в зависимости от плагина. Не пытайтесь строить JOIN между сырыми точками и справочником на каждом шаге: лучше денормализовать нужные атрибуты в теги или отдельную таблицу.
Обслуживание и диагностика
Проверяйте состояние сервера, место на диске и логи. Для файлового хранилища рост каталога данных — нормальный, но он должен соответствовать объёму и retention.
curl -sS http://127.0.0.1:8181/health
docker compose logs --tail=100 influxdb3
docker stats --no-stream influxdb3
du -sh influxdb3-data
Если запросы перестали возвращать старые точки, проверьте retention базы и системное время. Если запись отклоняется, смотрите ответ API: чаще всего это несовпадение типа поля (например, temp сначала был целым, потом стал дробным) или неверный токен. Тип поля в InfluxDB фиксируется при первом появлении, поэтому смешивать 21 и 21.4 в одном поле нельзя.
Резервная копия для файлового хранилища — это каталог данных вместе с метаданными. Останавливайте сервис или используйте штатный механизм backup, а затем проверяйте восстановление на тестовом экземпляре. Копировать только Parquet-файлы без каталога недостаточно.
Когда InfluxDB не нужна
Если у вас одна таблица на миллион строк и запросы вида «среднее за месяц», хватит PostgreSQL с индексом по времени. InfluxDB выигрывает на потоковой записи, retention и типовых агрегатах. Для логов лучше подходят Loki или Elasticsearch, для бизнес-данных — реляционная база. Не превращайте временной ряд в универсальное хранилище. Отдельно проверьте, что метки времени приходят в UTC и в одной точности: смесь секунд и наносекунд превращает полезные данные в мусор.
Итог
InfluxDB 3 Core — практичный выбор для метрик и датчиков: HTTP API, SQL, retention и хранение в локальных файлах или S3. Начните с Docker на loopback, создайте токен и базу с разумным сроком, пишите точки пакетно и держите теги низкой кардинальности. Проверяйте /health, логи и занятое место, а старые 2.x с Flux оставляйте только там, где они уже работают.