
В фильме «Отряд самоубийц: Миссия навылет», когда персонажи Идриса Эльбы (Бладспот) и Джона Сины (Миротворец) знакомятся при участии Аманды Уоллер, звучит следующая фраза:
– Ты сказала, что у всех в отряде уникальные навыки, а он — это тот же я.

Источник
Казалось бы, при чем здесь базы данных? На самом деле, отношения между PostgreSQL и TimescaleDB напоминают эту пару героев. PostgreSQL — одна из самых популярных СУБД в мире. Вокруг решения давно существует комьюнити, а за годы в коммерческой разработке набралось достаточно документации. TimescaleDB, будучи расширением PostgreSQL, умеет многое из ее арсенала, но применяется более точечно. В основном в проектах, где нужно работать с временными рядами или собирать данные с IoT-устройств.
В этом материале мы рассмотрим особенности работы TimescaleDB, а также покажем, как ее использует клиент Selectel — сервис DwarfByte.
(Не)Проблема выбора СУБД
Выбор СУБД под проект отличается от выбора фреймворка или оркестратора. Сделав ставку на условный Nomad, архитектор или техлид всегда (почти всегда) поним��ет, чего хочет достичь этим решением. Он понимает, что Kubernetes для проекта будет слишком сложным и большим, поэтому зачем?
Функциональность баз данных во многом похожа, поэтому при прочих архитектурных равных нет критической разницы между решениями. По этой причине в работе с БД на первые места выходит опыт команды с конкретным продуктом и преемственность. То есть возможность не накручивать дополнительную логику вокруг нового кластера, а масштабировать решение, которое уже есть в продакшене.
Есть проекты, которым приходится брать в отряд и Бладспота, и Миротворца, хотя, на первый взгляд, Идрис Эльба (и PostgreSQL) справился бы один. Но мы же говорим про коммерческие проекты, значит, нам по-настоящему важна скорость. Например, по сравнению с ванильным PostgreSQL TimescaleDB способен ускорить работу с данными в 2000 раз.
Среди других преимуществ стоит выделить:
- Встроенный toolkit со структурами данных для аналитических запросов «из коробки».
- Автоматическое партицирование.
- Встроенный механизм задач.
- Мультинодность.
Почему СУБД-напарник — оправданный шаг
- TimescaleDB оптимизирует хранение time series-данных: время вставки новых значений не увеличивается при увеличении количества данных.
- Не нужно переходить на другие решения, заточенные под time series-данные. Например, ClickHouse или QuestDB. До прямого сравнения мы еще доберемся.
- Работа в одном программном стеке. Можно хранить как временные ряды, так и другие типы данных на одной платформе. Для гипертаблиц это нормальная практика. Кроме этого, в одной СУБД можно использовать привычные расширения: pgbouncer, postgis, jsquery, pg_stat_statements.
На словах неплохо, а какие задачи решает TimescaleDB в реальных условиях? Давайте разбираться.
Как TimescaleDB используется на практике. Кейс компании DwarfByte
DwarfByte позволяет работать с AmoCRM при создании приложений с помощью привычного интерфейса взаимодействия PostgreSQL, вместо ограниченного стандартного REST API. Продукт позволяет строить аналитические отчеты, разрабатывать бизнес-процессы на основе данных AmoCRM.
Структура проекта выглядит так:

Объемы кластера определяются количеством данных в CRM. Как правило, не требуется много ресурсов для среднестатистического аккаунта. В данном примере используется только одна нода c 6 vCPU, 16 ГБ RAM, при объеме данных в 90 ГБ. Несмотря на то, что кластер включает в себя только мастер-ноду, из-за особенности интеграции AmoCRM выступает в роли еще одного мастера, и система не теряет в отказоустойчивости. Целостность данных в AmoCRM обеспечивает сам поставщик решения, а PostgreSQL-кластер нужен для упрощенного взаимодействия и ускоренной работы.
Система фиксирует все пользовательские и системные действия, которые обрабатываются приложением и синхронизируются в PostgreSQL-кластер. В кластере выделен отдельный сегмент для хранения time series-данных, чем занимается TimescaleDB. Главное преимущество — гипертаблицы. Они позволяют ускорить доступ к данным, настроить партицирование, сжатие «холодных» данных. Кроме этого, TimescaleDB решает задачи по удалению и «утилизации» неактуальных данных благодаря retention policy.
Одна из сущностей, данные которой хранятся в гипертаблице, — это события (events). Например, действие с карточкой клиента, постановка задачи в сделке, выполнение этой задачи и т. д. События становятся триггерами для различных бизнес-процессов. Доступ к старым событиям нам нужен нечасто, поэтому эти данные мы можем сжать и физически отправить на другой диск. Благодаря этому не пострадает скорость записи и чтения новых данных, и будет быстрее, чем на обычном PostgreSQL.
Помимо облачной базы данных, DwarfByte использует кластер Managed Kubernetes для деплоя сервера синхронизации.
Что делать с time series-данными
Эти данные можно использовать по-разному, ниже перечислены несколько примеров:
- Продуктовая аналитика. Данные помогают строить гипотезы и инвестировать ресурсы в фичи и решения, которые действительно улучшают сервис.
- Маркетинг. На основе своих действий клиенты получают наиболее выгодные предложения и видят актуальные офферы.
- Информационная безопасность. Можно настроить слежение за изменениями в данных AmoCRM.
- Customer Care. Отслеживается активность клиентов, чтобы коммуницировать с ними в рамках продуктовых сценариев.
Почему выбрали TimescaleDB
Мы знали, что на рынке есть несколько подобных решений, но решили использовать TimescaleDB, чтобы работать с данными в одном стеке. Основная база данных продукта — PostgreSQL, мы решили, что правильнее будет не выходить за рамки экосистемы и не ошиблись. А также это решение оказалось быстрее остальных.
Филипп Потеряев, техлид DwarfByte
TimescaleDB vs ClickHouse
В материалах про СУБД, которые работают с time series-данными, часто можно встретить упоминания ClickHouse. Разберем, насколько справедливо сравнивать это решение с TimescaleDB при всем внешнем сходстве.
Функциональность Clickhouse действительно во многом перекликается с возможностями TimescaleDB, хотя архитектурно базы данных имеют принципиальные отличия. Самое важное и то, что поможет сделать правильный выбор СУБД под проект, — тип рабочей нагрузки.
Специфика ClickHouse — в работе с OLAP-нагрузками. Они действительно похожи на time series, но предполагают работу с потоковыми событиями. Например, обработку данных рекламных сетей или онлайн-игры.
Кроме этого, Clickhouse относится к колоночным решениям, что при работе с массивами данных помогает читать нужные данные на порядок быстрее, чем при строчном построении (TimescaleDB). Отсюда принципиальная разница запросов и производительности.
Строковые СУБД
Классический способ построения таблиц, в котором идет поочередный перебор данных.

Чтобы добраться до нужной ячейки c записью Petr, нужно:
- Написать запрос и перейти на первую строку (строки обязательно читаются полностью):
Select * From table Where first name = Petr. - Найти колонку с названием Number и определить значение.
- Сравнить, подходит ли строка запросу.
- Если все ок, СУБД проверит значение колонки для каждой строки. Только таким способом можно проверить необходимость для запроса.
Звучит, как что-то надежное, но не очень быстрое. У нас есть плотная цепочка данных и гарантия, что ничего не потеряется, но перебирать каждый раз всю таблицу бывает неудобно, поэтому есть альтернативные решения.
Колоночные СУБД
Каждая колонка — это отдельная таблица из одного столбца, который хранит только свои значения. Чтобы найти нужную ячейку, достаточно обратиться к колонке First name. Ключевой принцип — использовать только колонки, которые участвуют в запросе.

Кроме этого, данные в таких таблицах можно сортировать. Например, значения в таблице сейчас представлены в порядке возрастания в столбце Number. Это качество также оптимизирует запросы с участием нескольких колонок. Иногда такой подход стреляет себе в ногу неочевидным синтаксисом, поэтому знаний привычного SQL будет мало.
Между колонками нет физической связи, они — отдельные файлы на диске. Это позволяет увеличить эффективность работы при чтении с диска. В случае ClickHouse есть еще несколько преимуществ, которые позволяют использовать решение для эффективной работы с большими массивами данных:
- Есть опция сэмплирования. С ее помощью можно запустить быструю проверку только на каком-то конкретном сегменте, поэтому не нужно перебирать все данные.
- Каждая колонка хранится как отдельный файл, поэтому базу проще сжимать.
- Высокая производительность благодаря более коротким запросам относительно строчных СУБД.
Почему ClickHouse подходит не всем
Если сравнивать скорость работы ClickHouse с «классическими» решениями, то для получения 100 млн записей СУБД потребуется одна секунда, а MySQL справится с аналогичной задачей за 823,64 сек. Пока выглядит так, будто в ClickHouse нет слабых сторон, но так не бывает.
ClickHouse создавался для работы со сквозной аналитикой, чтобы изучать метрики, быстро выгружать отчеты и одновременно учитывать сотни атрибутов. Для таких задач не принципиальна целостность данных, поэтому СУБД работает только в режиме асинхронной репликации, хотя на практике это часто выглядит как потеря данных.
| Опции | ClickHouse | TimescaleDB |
|---|---|---|
| Транзакции | – | + |
| Хранимые процедуры | – | + |
| Управление индексами | Первичные, вторичные | + |
| Подзапросы | – | + |
| Триггеры | – | + |
| Функции, определяемые пользователями | – | + |
Это не значит, что ClickHouse работает хуже, просто его архитектура заточена под другие задачи.
Отсутствие транзакций и асинхронная репликация влияют на другие процессы. То есть сервер не может атомарно обновлять несколько таблиц одновременно. Если что-то сломается во время многокомпонентной вставки в таблицу с материализованными представлениями, то получим неконсистентное состояние данных. Единственный способ обеспечить согласованное резервное копирование — остановить все записи в базу данных.
Далее приводятся цифры по результатам бенчмарка Time-Series Benchmark Suite.
Производительность вставки
При пакетной обработке строк от 5 000 до 15 000 строк на вставку обе базы данных демонстрируют высокую скорость, причем ClickHouse работает заметно лучше:

Однако при меньшем размере пакета результаты оказываются противоположными по двум параметрам: скорости вставки и потреблению пространства на диске. При больших объемах партий (5 000 строк/пакет) ClickHouse потребляет ~16 ГБ диска, а TimescaleDB ~19 ГБ (оба показателя до сжатия).
При меньших размерах партий TimescaleDB не только сохраняет стабильную скорость вставки, которая выше, чем у ClickHouse, в диапазоне 100-300 строк/пакет, но и потребляет в 2,7 раза больше пространства дисков, чем ClickHouse. Этого следовало ожидать из-за особенностей архитектурного дизайна каждой базы данных, но все равно интересно посмотреть.

Сравнение производительности: Timescale превосходит ClickHouse при меньших размерах партий и использует в 2,7 раза меньше дискового пространства.
Производительность запросов
Для тестирования производительности запросов использовался «стандартный» набор данных, который запрашивает данные для 4 000 хостов за трехдневный период и содержит в общей сложности 100 млн. строк. Такое количество строк и кардинальность данных хорошо подходят в качестве репрезентативного набора данных для проведения эталонных тестов, поскольку позволяют выполнять множество циклов ввода и запросов по каждой базе данных в течение нескольких часов.
Основываясь на репутации ClickHouse как быстрой OLAP-базы данных, ожидалось, что решение превзойдет TimescaleDB почти по всем запросам в бенчмарке. В режиме TimescaleDB без сжатия ClickHouse действительно вышел в лидеры.

Но, если включить сжатие в TimescaleDB, что является рекомендуемым подходом, обнаруживается обратный эффект: TimescaleDB превзошла ClickHouse практически по всем запросам.
Предварительные итоги
Возможно, сравнивать строковые и колоночные СУБД изначально не самый честный спор. В современных проектах, где все больше внимания уделяется аналитике событий и поведению пользователей, граница между time series и OLAP-нагрузкой уже не такая очевидная.
Если проект предполагает аналитику приложений в App Store и Google Play, ClickHouse будет наиболее релевантным решением. СУБД действительно хорошо работает с большими массивами данных, но в ряде других задач (например, работа с транзакциями) уже не демонстрирует гибкость PostgreSQL и патча TimescaleDB.
TimescaleDB vs QuestDB
На месте QuestDB мог быть InfluxDB или OpenTSDB — не принципиально. После раунда против ClickHouse важно сравнить TimescaleDB с кем-то одного калибра и одного типа нагрузки. Как и другие time series-ориентированные СУБД, решение применяется в блокчейне, аналитике, онлайн-играх и интернете вещей.
С одной стороны, у QuestDB есть «специализация» — крупный финтех и трейдинговые платформы. В этом секторе быстродействие является ключевым параметром, поэтому решают даже миллисекунды. Основная причина, почему выбрана именно эта БД — наличие приличной документации. С другой стороны, решение часто применяется для работ с IoT, например, для интеграции с фитнес-устройствами.
Особенности QuestDB
База данных относится к колоночному типу и может работать с высокой степенью параллелизма, обрабатывая столбцы параллельно всеми доступными потоками. Для любого запроса, основанного на временных метках, QuestDB поднимает в памяти только последнюю версию данных в ячейке. Таким образом, выполнение запросов не замедляется по мере поступления данных.
Для ускорения запросов QuestDB использует современное оборудование с SIMD-инструкциями, агрегируя несколько строк одновременно. Команда инженеров создала JIT-компилятор, предназначенный для распараллеливания фильтров запросов во время их выполнения.
Совместимость
QuestDB поддерживает линейный протокол InfluxDB, проводной протокол PostgreSQL, REST API и загрузку данных в формате CSV. Пользователи, привыкшие к другим базам данных временных рядов, могут перенести свои существующие приложения без допиливания, а также могут выбрать один из протоколов ввода данных в зависимости от своих задач.
Другим интересным компонентом QuestDB является поддержка линейного протокола InfluxDB и проводного протокола PostgreSQL. Для существующих пользователей InfluxDB можно настроить Telegraf так, чтобы он указывал на адрес и порт QuestDB.
Пользователи PostgreSQL могут использовать свои клиентские библиотеки или JDBC для записи данных в QuestDB. Независимо от способа ввода данных, запросы к ним можно выполнять с помощью стандартного SQL, за вычетом некоторых исключений, перечисленных на справочной странице API.
Производительность
Несмотря на поддержку нескольких механизмов ввода данных, в QuestDB в качестве языка запросов используется SQL, поэтому нет необходимости изучать специфический диалект, как с ClickHouse. Существуют также расширения SQL, ориентированные на работу с временными рядами, что упрощает задачу.
QuestDB демонстрирует скорость обработки данных до 4,3 млн. строк в секунду. Этот показатель был рассчитан с помощью бенчмарка TSBS, который в настоящее время поддерживается компанией TimescaleDB. Выбранный экземпляр имел 32 CPU и 64 ГБ RAM, а также быстрый SSD-диск (NVMe). Быстрые диски позволяют лучше справляться с записью, связанной с вводом-выводом при одновременном поступлении большого количества неупорядоченных данных. В большинстве случаев для получения достаточной производительности можно использовать более медленные диски, например, тома AWS EBS.
Что касается скорости, то QuestDB — действительно любопытное решение. По данным разработчиков, БД значительно опережает ClickHouse и TimescaleDB.

Как QuestDB удается так быстро получать данные такого типа? Дело в кардинальности данных.
Когда БД получает данные по линейному протоколу InfluxDB, теги сообщений хранятся в виде символьных типов. Этот символьный тип используется для эффективного хранения повторяющихся строковых значений, что позволяет группировать похожие записи.
Столбцы такого типа индексируются, поэтому запросы к таблицам по символам выполняются быстрее и эффективнее. Кроме того, БД умеет распараллеливать операции hashmap над индексированными столбцами и используем SIMD для выполнения большого количества тяжелых операций во всем SQL-движке. Так она по возможности параллельно выполняет процедуры, связанные с индексами и поиском в hashmap.
В такой ситуации мы можем говорить больше о том, что решение хорошо справляется с данными, в которых не нужно поддерживать историчность, а только обновлять.
Подробнее о тестах производительности QuestDB можно почитать здесь.
Почти итоги
У QuestDB есть ряд преимуществ, но и сложностей в работе с этой БД достаточно. Например, решение плохо подходит для больших отказоустойчивых систем из-за отсутствия репликации.
Плюсы:
- возможность встраивать базу данных в приложение на JVM и С++,
- расширения функций базы данных на любом языке для JVM, подключаются без перекомпиляции ядра базы с помощью ServiceLoader,
- быстрое получение данных,
- более высокая производительность при использовании меньшего количества ресурсов,
- поддержка протокола InfluxDB и PostgreSQL,
- выполнение запросов с помощью стандартного SQL,
- оптимизация запросов с помощью SIMD.
Минусы:
- небольшое сообщество,
- меньшее количество доступных интеграций,
- есть проблема с отсутствием контроля файлов журнала,
- не хватает математических функций (но уже в разработке),
- мало провайдеров, которые поддерживают БД как облачную услугу,
- репликация пока на стадии разработки.
Пока сфера использования QuestDB достаточно ограничена. Решение может быть полезно в следующих сценариях:
- При разработке FinTech-продуктов на JVM с низкой задержкой.
- Когда необходимо решение для аналитики данных в оперативной памяти.
- В качестве замены kdb+ из-за доступности лицензий.
- Если проект работает на JVM и вам нужна встроенная база данных для сохранения метрик или данных приложения, которые только добавляются и не обновляются.
QuestDB — достаточно быстрая БД, но пока ей не хватает поддержки комьюнити и ряда возможностей для масштабирования. TimescaleDB уже прошел этот путь и обзавелся множеством кейсов практического использования. Один из таких — от компании DwarfByte — мы рассмотрели в начале материала.
Заключение
TimescaleDB показывает высокие результаты производительности как в своем весе, так и среди колоночных СУБД. Кроме этого, решение может использовать экосистему PostgreSQL, что снижает порог входа и не вынуждает учить диалекты SQL. Область применения СУБД достаточно обширная, но для работы с нагруженными аналитическими системами лучше использовать более узкое, но не менее производительное решение типа ClickHouse.
Полезные материалы по теме

