Какие подходы к масштабированию баз данных ты знаешь?
Что проверяют
Есть ли у вас порядок действий, а не список модных слов. Сильный ответ показывает, что вы двигаетесь от дешёвого к дорогому: сначала запросы и индексы, потом кэш и реплики, и только затем шардирование. Следом обычно уточняют про лаг репликации или про выбор ключа шардирования.
Как отвечать
Идите по лестнице, называя цену каждой ступени:
- вертикальное: больше ядер, памяти, быстрее диск. Код не меняется, но есть потолок инстанса и цена, а переезд требует окна простоя;
- запросы и схема:
EXPLAIN (ANALYZE, BUFFERS),pg_stat_statements, покрывающие и частичные индексы, устранение N+1. Часто снимает нагрузку в разы и бесплатно; - пул соединений: PgBouncer в режиме transaction. В PostgreSQL каждое соединение это процесс, и тысяча коннектов от asyncio-воркеров кладёт базу быстрее самого трафика;
- read-реплики: потоковая репликация, чтение уходит с мастера. Репликация асинхронная, поэтому появляется лаг и проблема read your writes: критичные чтения оставляйте на мастере;
- партиционирование: декларативные секции по диапазону или хешу внутри одной базы. Даёт отсечение лишних секций в плане и мгновенное удаление старых данных через
DETACH; - шардирование: Citus, Vitess или свой роутер. Ключ выбирается по самому частому фильтру, кросс-шардовые join и глобальная уникальность становятся дорогими, а ребалансировка требует заранее нарезанных логических шардов;
- кэш: Redis перед горячим чтением, с продуманной инвалидацией и защитой от массового промаха;
- разгрузка записи: батчинг, очередь, вынос аналитики через CDC в отдельное хранилище.
Заканчивайте компромиссом: реплики масштабируют чтение и ничего не дают записи, шардирование масштабирует запись, но забирает транзакции и join.
Где спотыкаются
Начинают ответ с шардирования. Это самый дорогой шаг, а реальная проблема чаще в отсутствующем индексе или в запросе по всей таблице.
Предлагают реплику как способ ускорить запись и забывают про лаг. Пользователь сохранил профиль, а на следующем экране увидел старые данные.
Не могут назвать ключ шардирования и объяснить, что произойдёт с запросом без него. Ответ: он уйдёт во все шарды сразу, и выигрыш исчезнет.