Чем базы данных временных рядов отличаются от реляционных и key-value хранилищ, какова модель данных для хранения метрик, значения которых меняются во времени, какие решения этой категории NoSQL-СУБД сегодня популярны на рынке и для чего они используются.
Что такое база данных временных рядов и где она используется
Как и следует из названия, база данных временных рядов (TSDB, Time Series DataBase) — это база данных, оптимизированная для временных рядов – данных с отметками времени, которые представляют собой измерения или события, например, системные или сетевые метрики, показатели IoT-устройств, колебания валюты и пр. Будучи изначально созданной для данных с такой природой, TSDB оптимизирована для именно таких рабочих нагрузок: агрегации и сканирования большого диапазона множества записей. С одной стороны, модель данных в TSDB похожа на ключ значение, когда ключом выступает время, а значением – соответствующее ему измерение отслеживаемых данных. Однако, временные ряды постоянно растут. И, чтобы работать с этим огромным количеством данных, необходимо применять методы статистического анализа к различным диапазонам группировки измерений (по часам, минутам, секундам, микросекундам и т.д.).
Появившись в начале 2000-хх гг., базы данных временных рядов первого поколения были в основном ориентированы на просмотр финансовых данных, волатильность торговли акциями и валютой. Сегодня финтех – это лишь одно, но не единственное приложение TSDB-систем. Рост интереса к TSDB обусловлен развитием облачных технологий и активным внедрением интернета вещей в различные области жизни. Информационные системы, вычислительные кластера, беспилотные машины (автомобили, самолеты и пр.), датчики и IoT-устройства также постоянно генерируют события, которые надо наблюдать и анализировать.
Наиболее популярные на июль 2023 года СУБД временных рядов: InfluxDB, Kdb+, Prometheus, Graphite, TimescaleDB, DolphinDB, RRDTool, Apache Druid, TDengine, QuestDB, OpenTSDB, GridDB, Fauna, VictoriaMetrics, Amazon Timestream. Также подобные аналитические сценарии хорошо поддерживает колоночная СУБД ClickHouse, о чем мы рассказываем здесь.
Как работает база данных временных рядов
Базы данных временных рядов обладают ключевыми архитектурными особенностями, которые сильно отличают их от других типов хранилищ. К ним относятся хранение и сжатие данных с отметками времени, управление жизненным циклом данных, агрегация данных, возможность обрабатывать большие временные ряды, зависящие от сканирования множества записей, и запросы с учетом времени. Реляционные базы данных с первичным индексом обычно используют структуру B-дерева для поиска, что хорошо сопоставляется с базовым аппаратным хранилищем и обеспечивает сбалансированную производительность операций чтения и записи. А NoSQL-хранилища обычно используют LSM-деревья, которые обеспечивают высокую производительность записи. Но производительность чтения в LSM-структурах ниже, чем у индекса на основе B-дерева. Поскольку производительность записи имеет решающее значение для рабочих нагрузок временных рядов, именно LSM-деревья обычно используются в базах данных временных рядов. Также в TSDB специализированные вторичные индексы оптимизируются специально для запроса данных во временных диапазонах и других распространенных шаблонов доступа к данным временных рядов. Хотя обеспечение поддержки этих индексов и возможностей удалять или обновлять определенные точки данных снижает производительность, это приемлемый компромисс для баз данных временных рядов, поскольку такие варианты использования довольно редки – события прошлого времени обычно не подлежат удалению и корректировке.
Реляционные СУБД хранят данные в строках на диске, причем разные типы данных расположены рядом друг с другом. Это ограничивает возможность использования некоторых алгоритмов сжатия и количество данных, которые можно сжать. А базы данных временных рядов обычно хранят данные так, что точки данных одного типа находятся рядом друг с другом. Это позволяет использовать оптимальные алгоритмы сжатия и экономить место на диске. В отличие от РСУБД, базы данных временных рядов, чаще всего не имеют схемы, позволяя быстро и легко добавлять новые поля без преобразования и миграции значений.
Чтобы показать отличия модели данных TSDB отличаются от РСУБД и классических key-value хранилищ, рассмотрим пару примеров конкретных решений. В частности, используемая для мониторинга системных метрик СУБД Prometheus, о чем мы писали вчера, принципиально хранит все данные в виде временных рядов: потоков значений с отметками времени, принадлежащих к одной и той же метрике и одному и тому же набору помеченных измерений. Помимо сохраненных временных рядов Prometheus может генерировать временные производные временные ряды в результате запросов. Метки включают многомерную модель данных Prometheus: любая заданная комбинация меток для одного и того же имени метрики идентифицирует конкретное многомерное воплощение этой метрики, например, все HTTP-запросы, которые использовали метод к POST-обработчику /api/tracks. Язык запросов позволяет выполнять фильтрацию и агрегирование на основе этих измерений. Изменение любого значения метки, включая добавление или удаление метки, приведет к созданию нового временного ряда.
Другая популярная TSDB-система, InfluxDB имеет линейный протокол для отправки данных временных рядов, который принимает следующую форму: measurement-name tag-set field-set timestamp. Имя измерения (measurement-name) — это строка, набор тегов (tag-set) — это набор пар ключ/значение, где все значения являются строками, а набор полей (field-set) — это набор пар ключ/значение, где значения могут быть int64, float64, bool или string. Имя измерения и наборы тегов хранятся в инвертированном индексе, что позволяет очень быстро искать определенные серии.
Временные метки в InfluxDB могут иметь точность в секундах, миллисекундах, микросекундах или наносекундах, что особенно актуально финтеха и научных вычислений. Сжатие варьируется в зависимости от уровня точности, необходимого пользователю. На диске данные организованы в виде столбцов, где для измерения, набора тегов и поля установлены непрерывные блоки времени. Таким образом, каждое поле организовано на диске последовательно в течение блоков времени, что делает вычисление агрегатов по одному полю очень быстрой операцией. Количество тегов и полей, которые можно использовать, в InfluxDB не ограничено.
Другие решения для временных рядов не поддерживают несколько полей, что приводит к росту нагрузки на сетевые протоколы при передаче данных с общими наборами тегов. Большинство TSDB-решений поддерживают только значения float64, что не позволяет пользователю кодировать дополнительные метаданные вместе с временным рядом. В частности, OpenTSDB и KairosDB, поддерживающие теги, в отличие от Graphite и RRD, имеют ограничения на количество используемых тегов. При наличии от 5 до 6 тегов пользователь начнет видеть горячие точки в кластере Apache HBase или Cassandra, если эти базы данных типа семейства колонок используются в качестве основного хранилища. InfluxDB не имеет этого ограничения, поскольку модель данных этой СУБД изначально была разработана специально для временных рядов с поддержкой множества типов данных, индексируемых тегов и неиндексируемых полей. Это позволяет получить высокую производительность и гибкость. Таким образом, модели данных TSDB отличаются от РСУБД и классических key-value хранилищ.
Кроме того, TSDB поддерживают статистические функции для сглаживания временных рядов, выявления и сравнения трендов, а также интерполяции данных. Именно поэтому базы данных временных рядов активно используются в различных Data Science проектах, включая аналитику больших данных и машинное обучение.
Узнайте больше про современные архитектуры данных в проектах дата-инженерии и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники