Всё просто: проект растёт — нагрузка растёт. Сначала один сервер, один инстанс MySQL, пара таблиц. Потом появляется больше юзеров, запросов, индексов, джойнов и вот ты уже смотришь на explain, как в молельник. Причём молишься не ты, а база — о пощаде.
Если ты не подготовился заранее — тебе пиздец. Но даже если подготовился — всё равно придётся разруливать, потому что масштабирование базы — это не один паттерн, а целая россыпь решений, которые выбираются по ситуации.
Шардинг: когда одной базы мало
Первое, о чём стоит думать — шардинг. Это когда ты не хранишь всё дерьмо в одной дыре, а разносишь данные по разным базам, на разных серверах. Главное — не резать тупо по алфавиту. Нужно, чтобы данные внутри шарда были максимально связаны, а между шардами — минимально.
Пример: если у тебя соцсеть, шардить по пользователям, а не по постам. Чтобы все посты одного юзера были рядом.
Звучит просто. На деле — миграции, роутинг, логика на уровне приложухи. Но без этого ты не вывезешь.
Репликация: когда один сервер — слабое звено
Сервер может сдохнуть. И если у тебя нет репликации, ты останешься с кучей вопросов и нулём данных. Репликация — это когда у тебя есть мастер и несколько реплик, которые получают данные сразу после записи.
Мастер умер? Реплика становится новым мастером, ты делаешь failover, и продолжаешь жить. Конечно, если всё это у тебя автоматизировано. Если нет — собираешь консилиум в три ночи.
Партиционирование: когда одной таблицы мало
У тебя таблица на 100 миллионов строк. Она работает, как танк с оторванными гусеницами. Решение — партиционирование. Разбиваешь таблицу по дате, юзеру, гео — как удобно. Главное — не втыкать партиции ради галочки. Они работают, когда логика и данные идут рука об руку.
Пример: у тебя логи по дням — пусть каждая партиция будет днём. Тогда поиск по неделе — это 7 таблиц, а не одна жирная на 500 гигов.
Денормализация: иногда грязь — это хорошо
О, классика. Все любят нормализацию, но когда счёт идёт на миллионы, ты начинаешь дублировать данные, просто чтобы не делать JOIN.
Пример: у тебя пост и теги. В идеале — нормальная связка через таблицу. На практике — ты просто вписываешь теги в тот же JSON-поляшек, и вуаля — всё работает быстро.
Важно понимать: денормализация — это осознанный трейд-офф. Ты меняешь гибкость на производительность. Если ты не понимаешь, зачем ты это делаешь — не делай.
Ну и конечно: оптимизация до масштабирования
Перед тем как кидаться в шардинг и реплики, почини то, что уже есть. Проверь индексы, посмотри на запросы, выкинь всё, что жрёт CPU, как не в себя. Иногда проблема — не в объёме данных, а в том, что ты криво написал SQL.
Вывод
Масштабирование базы данных — это не один тумблер. Это набор подходов, каждый из которых работает в своём контексте. Нет серебряной пули. Есть голова, мониторинг, опыт и куча боли от чужих ошибок.
Хочешь, чтобы прод не ложился? Следи за базой. И помни: база — это не мусорное ведро. Это сердце системы. Забудешь — она тебе напомнит. Громко.
0 комментариев