Real-Time Backend
Time-Series данные
Grafana показывает красивые графики. Но за ними - специализированные БД, которые делают то, с чем PostgreSQL не справится при миллионах точек в секунду.
- Tesla хранит телеметрию с миллионов автомобилей в InfluxDB: скорость, заряд батареи, данные автопилота - более 1000 метрик в секунду с каждой машины
- Prometheus создан в SoundCloud в 2012 году и стал стандартом мониторинга Kubernetes: каждый pod экспортирует /metrics, Prometheus scrape'ит и хранит time-series
- Биржи и финтех используют TimescaleDB для хранения тиков NYSE/NASDAQ: миллионы событий в секунду с SQL-аналитикой поверх
- Grafana + InfluxDB стек используется в тысячах компаний для infrastructure monitoring: CPU, latency, error rate с retention policies и downsampling
Что такое time-series данные
Time-series - это последовательность значений, привязанных к временным меткам. Каждая запись отвечает на вопрос "что произошло и когда". Это не просто таблица с колонкой `created_at` - в time-series БД время является первичным измерением, по которому строится хранение, индексирование и сжатие.
Характерные черты time-series данных: записи почти никогда не обновляются (только append), старые данные агрегируются или удаляются (retention policy), запросы - это всегда диапазон по времени с агрегацией (avg, sum, percentile). Классические реляционные БД плохо справляются с этим паттерном: индекс по timestamp деградирует, а хранить миллиарды строк без сжатия - расточительно.
- **Метрики инфраструктуры** - CPU, память, latency сервисов (Grafana + InfluxDB/Prometheus)
- **IoT телеметрия** - Tesla собирает >1000 метрик с каждого автомобиля каждую секунду в InfluxDB
- **Финансовые тики** - котировки NYSE/NASDAQ: миллионы событий в секунду, хранятся годами
- **APM трассировки** - span duration, error rate, throughput для каждого эндпоинта
Чем time-series БД принципиально отличается от реляционной при хранении метрик?
InfluxDB: хранилище метрик
InfluxDB - специализированная time-series БД, созданная с нуля под метрики и события. Данные организованы в measurement (аналог таблицы), tags (индексированные строки для фильтрации) и fields (числовые значения). Хранилище использует TSM (Time-Structured Merge Tree) - вариант LSM-дерева, оптимизированный под временные данные с агрессивным сжатием.
Tesla использует InfluxDB для сбора телеметрии с автомобилей: скорость, заряд батареи, температура компонентов, данные автопилота - более 1000 метрик с каждой машины каждую секунду. При миллионах автомобилей это петабайты данных. InfluxDB справляется за счёт встроенного downsampling (Continuous Queries в v1, Tasks в v2) и retention policies.
**Cardinality explosion** - главная ловушка InfluxDB. Tags индексируются, и количество уникальных комбинаций тегов называется cardinality. Если добавить userId как tag в метрику с миллионом пользователей - получится миллион индексных записей. Это убивает производительность и память. Правило: в tags только то, по чему фильтруется в WHERE (host, env, region). Идентификаторы пользователей - в fields.
Команда добавила userId как tag в InfluxDB метрику запросов. Что произойдёт при 1 млн активных пользователей?
TimescaleDB и Prometheus
TimescaleDB - расширение PostgreSQL для time-series данных. Таблица автоматически разбивается на чанки по времени (hypertable), что позволяет делать partition pruning при запросах: вместо сканирования всей таблицы сканируются только чанки нужного временного диапазона. Полный SQL, JOIN с обычными таблицами, pg_extensions - всё работает как в обычном PostgreSQL.
Prometheus - pull-based система мониторинга, созданная в SoundCloud в 2012 году (открыта в 2015). Сервер сам опрашивает (scrape) endpoints /metrics каждые N секунд и хранит данные в собственном time-series формате TSDB. Хранит данные локально, не предназначен для долгосрочного хранения - обычно 15 дней. Для долгосрочного хранения данные экспортируются в InfluxDB, Thanos или Cortex.
- **TimescaleDB** - выбирают когда нужен SQL, JOIN с бизнес-таблицами, или уже есть PostgreSQL инфраструктура
- **InfluxDB** - выбирают для чистых метрик без JOIN, с очень высоким write throughput и встроенным downsampling
- **Prometheus** - стандарт для Kubernetes/microservices мониторинга, не для долгосрочного хранения
- **Финансовые данные** - TimescaleDB популярен для хранения биржевых тиков: JOIN с инструментами, SQL аналитика
Команда хочет хранить метрики сервисов 2 года и делать JOIN с таблицей пользователей для бизнес-аналитики. Что выбрать?
Downsampling и retention
Downsampling - замена raw данных агрегатами за период. Grafana + InfluxDB для инфраструктурного мониторинга обычно хранит: raw данные 7 дней (1-секундная точность), 5-минутные агрегаты 30 дней, часовые агрегаты 1 год. Это позволяет смотреть детализацию вчерашнего инцидента (raw) и тренды за квартал (hourly avg) при разумном объёме хранилища.
Retention policy автоматически удаляет данные старше заданного срока. В InfluxDB v2 это Tasks с retention на bucket. В TimescaleDB - `add_retention_policy('metrics', INTERVAL '90 days')`. В Prometheus - `--storage.tsdb.retention.time=15d` при запуске. Без retention policy time-series хранилище растёт бесконечно - дисковое пространство закончится через недели при высоком throughput.
**Математика хранения:** 1 метрика с 1-секундной точностью = 86400 точек/день. 1000 метрик = 86.4M точек/день. При 8 байтах на точку - ~690 MB/день без сжатия. TimescaleDB даёт 90-95% сжатие для старых чанков - итого ~35-70 MB/день. За год - 12-25 GB вместо 250 GB.
Time-series БД нужна только для метрик инфраструктуры
Time-series паттерн применим везде, где данные привязаны ко времени: IoT, финансовые тики, пользовательские события, логи с агрегацией
Любые данные с паттерном "что случилось и когда" выигрывают от time-series оптимизаций. TimescaleDB используется для хранения биржевых тиков, InfluxDB - для телеметрии электромобилей. Граница проходит не по индустрии, а по характеристикам доступа: append-only, запросы по диапазону времени, агрегация.
Система хранит 1-секундные метрики без retention policy. Через 3 месяца диск заполнится. Какой правильный подход?
Итоги
- Time-series данные - append-only, время как первичное измерение; специализированные БД (InfluxDB, TimescaleDB) хранят их в 10-100x эффективнее PostgreSQL
- Cardinality explosion в InfluxDB: tags индексируются, поэтому высококардинальные поля (userId, requestId) должны быть fields, а не tags
- Downsampling + retention = управляемый рост: raw 7 дней для диагностики, агрегаты 90 дней для трендов, автоудаление через retention policy
- TimescaleDB - когда нужен SQL и JOIN с бизнес-данными; InfluxDB - для чистых метрик с высоким throughput; Prometheus - для scrape-based мониторинга микросервисов
Связанные темы
Time-series данные - часть более широкой экосистемы realtime хранения и обработки:
- Redis Streams — Буфер для time-series событий перед записью в InfluxDB/TimescaleDB; используется как промежуточный слой при высоком write throughput
- Apache Kafka — Kafka хранит события с временными метками и может служить источником для time-series БД через Kafka Connect или consumer-сервисы
- WebSocket и SSE — Realtime доставка time-series данных клиентам: Grafana использует WebSocket для live-обновления графиков из InfluxDB
Вопросы для размышления
- Какие данные в проекте имеют time-series характер - могут ли они выиграть от специализированного хранилища?
- Если бы нужно было добавить мониторинг 500 микросервисов с retention 1 год - Prometheus, InfluxDB или TimescaleDB и почему?
- Как downsampling меняет баланс между точностью данных и стоимостью хранения - где проходит граница разумного компромисса?