Система хранения парсинг-данных: TimescaleDB vs ClickHouse

Сырые данные из блокчейна или бирж накапливаются быстро — десятки гигабайт в день для активно парсимых источников. Типичный проект: парсинг 5000 кошельков каждые 10 секунд — это 43 млн строк в день. Через полгода объём достигает 7.8 млрд строк. Хранить это в обычном PostgreSQL в одной таблице означа

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1451
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Сырые данные из блокчейна или бирж накапливаются быстро — десятки гигабайт в день для активно парсимых источников. Типичный проект: парсинг 5000 кошельков каждые 10 секунд — это 43 млн строк в день. Через полгода объём достигает 7.8 млрд строк. Хранить это в обычном PostgreSQL в одной таблице означает деградацию запросов через несколько месяцев. Мы проектируем системы хранения на TimescaleDB или ClickHouse под конкретные паттерны запросов и объёмы. Выбор между этими базами — прагматический, не религиозный. Стоимость хранения после компрессии снижается на 80%, а запросы ускоряются в десятки раз. Наши клиенты часто сталкиваются с ростом объёмов после трёх месяцев эксплуатации: запросы начинают выполняться десятки секунд, стоимость хранения растёт. Мы предлагаем архитектуру, которая масштабируется линейно — добавляем новые ноды без даунтайма. Получите консультацию по выбору СУБД для ваших данных.

Когда выбирать TimescaleDB, а когда ClickHouse?

TimescaleDB — расширение PostgreSQL. Добавляет hypertables (автоматическое партиционирование по времени), continuous aggregates (инкрементальные материализованные представления), compression. Вы остаётесь в PostgreSQL-экосистеме: стандартный SQL, ACID транзакции, JOIN с обычными таблицами, привычный инструментарий.

ClickHouse — колоночная OLAP база. Данные хранятся по столбцам, что даёт огромный выигрыш при агрегациях по подмножеству колонок. Скорость GROUP BY и SUM на миллиардах строк — на порядок выше PostgreSQL. Слабая сторона: нет транзакций, UPDATE/DELETE — дорогие операции, JOIN работает иначе.

Критерий TimescaleDB ClickHouse
Паттерн запросов Сложные JOIN, OLTP+OLAP mix Аналитика, агрегации по большим диапазонам
Запись INSERT в транзакции, UPSERT Batch insert, eventual дедупликация
Чтение точечное Быстро (B-tree индексы) Медленнее (нет эффективных точечных)
Аналитика Хорошо Намного быстрее
Обновления Стандартный UPDATE Дорого (ReplacingMergeTree)
Операционная сложность Умеренная Выше
Объём данных До ~1TB эффективно Эффективно с 100GB+

Рекомендация для парсинга on-chain данных:

  • TimescaleDB — если данные нужны для продуктовой логики (балансы, позиции, аккаунты), есть JOIN с реляционными данными, нужны ACID-гарантии
  • ClickHouse — если это аналитический pipeline (trading сигналы, агрегированная статистика, исторический анализ), запросы работают с большими диапазонами дат

В production часто комбинируют: TimescaleDB для горячих/операционных данных + ClickHouse для аналитического warehouse. Такая связка даёт до 90% экономии на хранении холодных данных. Получите консультацию — мы поможем выбрать оптимальную СУБД.

Как настроить компрессию в TimescaleDB?

Базовая концепция: обычная таблица PostgreSQL превращается в hypertable — под капотом создаются чанки (partitions) по временному измерению. Каждый чанк — отдельный файл, старые чанки можно компрессировать или архивировать.

CREATE TABLE trades ( time TIMESTAMPTZ NOT NULL, exchange TEXT NOT NULL, symbol TEXT NOT NULL, price NUMERIC(20, 8) NOT NULL, volume NUMERIC(20, 8) NOT NULL, side CHAR(4) NOT NULL ); SELECT create_hypertable('trades', 'time', chunk_time_interval => INTERVAL '1 day'); CREATE INDEX ON trades (symbol, time DESC); 

Continuous aggregates заменяют дорогие realtime GROUP BY на инкрементальные материализованные представления. Теперь запрос SELECT * FROM trades_1m WHERE bucket > NOW() - INTERVAL '1 day' — это SELECT из материализованного представления, не агрегация по raw данным.

Старые данные компрессируются почти без потери функциональности (кроме UPDATE/DELETE):

ALTER TABLE trades SET ( timescaledb.compress, timescaledb.compress_orderby = 'time DESC', timescaledb.compress_segmentby = 'symbol' ); SELECT add_compression_policy('trades', INTERVAL '7 days'); 

Типичная степень сжатия для биржевых данных: 10–20x. 100GB raw -> 5–10GB compressed. Экономия на хранении достигает 80% для данных старше месяца. Ознакомьтесь с документацией TimescaleDB для деталей.

Архитектура ClickHouse

Выбор engine — критический момент. Для парсинг-данных чаще всего используются MergeTree, ReplacingMergeTree (дедупликация) и SummingMergeTree (агрегаты).

CREATE TABLE trades ( time DateTime64(3), exchange LowCardinality(String), symbol LowCardinality(String), price Decimal(20, 8), volume Decimal(20, 8), side Enum8('buy' = 1, 'sell' = 2) ) ENGINE = MergeTree() PARTITION BY toYYYYMM(time) ORDER BY (symbol, exchange, time); 

ORDER BY в ClickHouse — это одновременно и первичный ключ (sparse index), и физический порядок хранения. Выбирайте по паттернам запросов: если чаще фильтруете по (symbol, time) — именно такой ORDER BY.

ClickHouse materialized views — триггерные, обновляются при insert (не по расписанию как в TimescaleDB). Уникальная функция — ASOF JOIN для джойна по ближайшему значению времени.

Типы данных. Используйте LowCardinality(String) для полей с малой кардинальностью (exchange, symbol, side) — экономия 2–10x по размеру и ускорение фильтрации. Decimal вместо Float для финансовых значений — нет проблем с точностью.

Партиционирование. По месяцам (toYYYYMM) — стандарт для большинства финансовых данных. Позволяет дропать старые партиции без DELETE.

Параметр TimescaleDB ClickHouse
Тип полей Стандартные PostgreSQL LowCardinality, Decimal, Enum
Индексация B-tree по символу+время ORDER BY (sparse index)
Сжатие 10–20x (compression policy) 5–10x (LZ4, ZSTD)
Партиционирование По дням (chunk_interval) По месяцам (toYYYYMM)

Почему важно комбинировать TimescaleDB и ClickHouse?

Хранение всех данных в одной СУБД — компромисс. TimescaleDB отлично держит точечные запросы и OLTP-загрузку, но проигрывает в аналитике при 100+ миллиардах строк. ClickHouse, наоборот, неэффективен для частых обновлений и транзакций. Комбинируя их, вы получаете: операционные данные на TimescaleDB (горячий слой 30 дней) и аналитический слой на ClickHouse (история за всё время). Затраты на инфраструктуру снижаются на 40% за счёт разнесения нагрузки. Получите консультацию по выбору СУБД для ваших данных.

Что входит в нашу работу

  • Аудит текущих данных и типовых запросов
  • Проектирование схемы (hypertable / MergeTree) с выбором партиционирования, индексов и компрессии
  • Скрипты миграции с контролем целостности
  • Настройка continuous aggregates или materialized views
  • Интеграция с Grafana: дашборды по размеру таблиц, количеству частей, времени выполнения запросов
  • Документация по эксплуатации и рекомендации по дальнейшему масштабированию
  • Обучение команды заказчика

Процесс работы

  1. Аналитика — собираем метрики нагрузки, объёмов, частоты запросов. Определяем горячие и холодные данные.
  2. Проектирование — выбираем СУБД, схему и политики ретенции/компрессии.
  3. Реализация — разворачиваем кластер, пишем ETL-пайплайн.
  4. Тестирование — нагрузочное тестирование на объёмах, близких к реальным.
  5. Деплой — миграция данных, подключение мониторинга, передача документации.

Сроки и стоимость

Сроки: от 1 недели на проектирование схемы до 3 недель при миграции существующих данных. Стоимость рассчитывается индивидуально под ваш объём и сложность. Свяжитесь с нами — обсудим детали.