Выбор хранилища под задачу: polyglot persistence
↑ 6.1 Масштабирование и надёжность данных · ← Предыдущая
Зачем это на собесе
Итоговый архитектурный навык: подобрать хранилища под сценарии и связать их без потери согласованности.
Принцип
Нет универсальной БД. Каждое хранилище оптимизировано под свой шаблон доступа. Polyglot persistence: использовать несколько хранилищ, но ограничивать их число — каждое добавляет стоимость эксплуатации (бэкапы, мониторинг, обновления, компетенции).
Матрица выбора
| Задача | Хранилище | Почему |
|---|---|---|
| Транзакции, заказы, финансы, справочники | PostgreSQL (или MySQL, SQL Server) | ACID, связи, зрелость |
| Кэш, сессии, лимиты, блокировки, лидерборды | Redis | память, структуры, задержки < 1 мс |
| Аналитика, события, отчёты, логи, метрики | ClickHouse | колоночное хранение, быстрые агрегации |
| Полнотекстовый поиск, фасеты, релевантность | Elasticsearch / OpenSearch / Meilisearch | инвертированный индекс, морфология |
| Файлы, медиа, бэкапы, data lake | S3 / MinIO | дёшево, неограниченно, CDN |
| Документы с гибкой схемой | MongoDB или PostgreSQL jsonb | агрегаты «всё в одном» |
| Очереди и события | Kafka / RabbitMQ / Redis Streams | порядок, реплей, backpressure |
| Граф связей, рекомендации | Neo4j / рекурсивные CTE | обход связей |
| Временные ряды, метрики мониторинга | TimescaleDB / VictoriaMetrics / Prometheus | компрессия, ретенция, агрегации по времени |
| Геоданные | PostGIS | пространственные индексы |
| Глобально распределённые транзакции | CockroachDB / Spanner / YugabyteDB | SQL + горизонтальная масштабируемость |
| Векторный поиск (эмбеддинги) | pgvector, Qdrant, Milvus | ANN-индексы |
Вопросы для выбора
- Модель данных: реляционная, документная, ключ–значение, граф, временной ряд?
- Шаблоны доступа: точечные чтения, диапазоны, агрегаты, полнотекстовый, запись потоком?
- Объём и рост: ГБ, ТБ, ПБ; скорость записи и чтения (RPS)?
- Консистентность: нужен ли ACID, допустимо ли eventual consistency?
- Задержка: sub-ms, десятки мс, секунды?
- Доступность и DR: RPO/RTO, регионы?
- Безопасность и соответствие: шифрование, аудит, резидентность данных, GDPR?
- Команда и эксплуатация: опыт, управляемый сервис или self-hosted, стоимость?
- Жизненный цикл: ретенция, архивация, удаление по запросу?
Паттерны интеграции
- Единый источник истины (system of record): обычно транзакционная БД; остальные хранилища — производные (кэш, поиск, аналитика), которые можно пересобрать;
- CDC / Outbox для синхронизации (см. предыдущую тему) вместо двойной записи;
- CQRS: запись в нормализованную БД, чтение из оптимизированных представлений (Redis, Elasticsearch, ClickHouse);
- Event sourcing: журнал событий как источник истины, проекции в разные хранилища;
- Cache-aside и инвалидация по событиям;
- Saga / outbox для согласованности между сервисами и хранилищами;
- Идемпотентные потребители и возможность переиндексации/реплея.
Пример: интернет-магазин
PostgreSQL — заказы, платежи, клиенты (источник истины)
Redis — корзина, сессии, лимиты, кэш каталога
Elasticsearch — поиск по каталогу (индекс строится из PostgreSQL через CDC)
ClickHouse — события просмотров и аналитика продаж
MinIO/S3 — изображения товаров, счета (PDF)
Kafka — события доменa и CDCПоток: заказ создан → транзакция в PostgreSQL + запись outbox → Debezium → Kafka → потребители обновляют поиск, аналитику, отправляют уведомления.
Анти-паттерны
- «модная» БД без обоснования (MongoDB вместо PostgreSQL для чисто реляционных данных);
- несколько источников истины для одной сущности;
- «синхронизация скриптом раз в сутки» там, где нужна согласованность;
- использование Redis как основной БД без понимания persistence;
- аналитика прямо на OLTP-БД под нагрузкой;
- хранение файлов в БД;
- взрыв числа технологий в небольшой команде.
Эволюция
Начинайте с PostgreSQL (+ jsonb, полнотекстовый поиск, pg_trgm, pgvector, расширения), добавляйте хранилища по измеренной необходимости: кэш при росте чтения, ClickHouse при тяжёлой аналитике, поиск при сложной релевантности, объектное хранилище для файлов.
Вопросы с ответами
Что такое polyglot persistence и его главный риск?
Использование разных хранилищ под разные задачи. Риск: рост операционной сложности и несогласованность данных между хранилищами; его снижают единым источником истины и CDC/outbox.
Как выбрать хранилище для аналитики событий?
Колоночная СУБД (ClickHouse): быстрые агрегации, сжатие, пакетная запись; основную OLTP-БД аналитикой не нагружаем, данные поставляем через CDC/Kafka.
Что такое source of truth?
Система, в которой данные считаются эталонными. Остальные хранилища (кэш, поиск, аналитика) — производные и могут быть пересозданы из неё.