Ответ
На моем последнем проекте по построению DWH мы реализовали многоуровневую архитектуру хранения данных, основанную на их температуре и частоте использования.
Основные слои:
-
Горячие данные (Hot Data):
- Для чего: Для оперативной аналитики и дашбордов, требующих ответа за миллисекунды.
- Технология: ClickHouse в качестве колоночного OLAP-хранилища.
- Почему: Его сжатие колоночных данных и векторная обработка запросов давали нам скорость агрегации в 100-1000 раз выше, чем у классического PostgreSQL на аналогичных объемах.
- Пример данных: Последние 30 дней событий пользователей, ежедневные бизнес-метрики.
-
Теплые данные (Warm Data):
- Для чего: Для глубокого исторического анализа, ad-hoc запросов и обучения ML-моделей, где скорость не критична, но важна стоимость.
- Технология: Amazon S3 в формате Apache Parquet, доступ через Trino (Presto SQL) и AWS Athena.
- Почему: Хранение в S3 на порядки дешевле, а Parquet обеспечивает эффективное сжатие и возможность вычитывать только нужные колонки.
- Структура в S3:
s3://analytics-bucket/ ├── raw/ # Сырые JSON/CSV логи из Kafka ├── processed/ # Очищенные, типизированные данные в Parquet │ └── dt=2024-01-01/ │ └── event_type=page_view/ └── aggregated/ # Предрассчитанные агрегаты для BI-инструментовМы использовали партиционирование по дате (
dt) и часто по типу события (event_type) для ускорения запросов.
-
Метаданные и справочники (Metadata):
- Для чего: Хранение конфигураций, справочников пользователей, продуктов и т.д.
- Технология: PostgreSQL с настройкой репликации для отказоустойчивости.
- Почему: Требовались гарантии ACID, частые точечные обновления и сложные JOIN.
Ключевые оптимизации:
- CDC (Change Data Capture): Для синхронизации данных из операционных БД (Postgres, MySQL) использовали Debezium, который писал изменения в Apache Kafka, откуда их уже потребляли наши ETL-процессы.
- Управление данными в S3: На поздних этапах внедрили Apache Iceberg как табличный формат поверх Parquet в S3. Это дало нам ACID-транзакции, управление схемой и time travel-запросы (возможность запросить данные на определенный момент времени).