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 меняет баланс между точностью данных и стоимостью хранения - где проходит граница разумного компромисса?

Связанные уроки

  • db-27-timeseries
Time-Series данные

0

1

Войти