Зберігання даних парсингу: TimescaleDB vs ClickHouse

Коли обсяги парсинг-даних зростають, звичні бази перестають справлятися: запити сповільнюються, а вартість зберігання збільшується. Ми проєктуємо системи зберігання на TimescaleDB або ClickHouse, підбираючи оптимальну архітектуру під ваші завдання та обсяги. Наша команда реалізує проєкт під ключ — від аудиту до впровадження та подальшої підтримки, забезпечуючи надійне рішення, яке масштабується разом із вашим бізнесом.
Часті запитання

Сирі дані з блокчейну або бірж накопичуються швидко — десятки гігабайт на день для активно парсимих джерел. Типовий проєкт: парсинг 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 тижнів при міграції існуючих даних. Вартість розраховується індивідуально під ваш обсяг і складність. Зв'яжіться з нами — обговоримо деталі.

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

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142