Всем привет! Меня зовут Илья Криволапов, тружусь системным аналитиком в SENSE на проекте одного из цветных банков РФ. В профессии я уже пятый год и, несмотря на фамилию, ломал прод всего лишь несколько незначительных раз (надеюсь).
На досуге я преподаю в университете дисциплину «Хранение и обработка больших объемов данных» и за все время у меня накопилось много полезной информации. Непростительно хранить такой клад у себя в столе, поэтому я подготовил для читателей Хабра ультимативный гайд по оптимизации или хорошему такому, грамотному проектированию баз данных с расчетом на масштабирование.
Всего в цикле будет 3 статьи. В первой поговорим о двух разных подходах масштабирования БД и о том, как лучше его делать и как лучше не делать (Никогда. Пожалуйста).
Кому будет полезно? Всем отвечающим за «здоровье» базы данных: DBA, архитекторам, DevOps-инженерам, аналитикам и разработчикам.
Согласны? Узнали? Тогда поехали!

Когда база данных кричит «Помогите!»
Представьте, ваше приложение стало популярным. Но теперь база данных тормозит, как старый компьютер с Windows XP, а пользователи жалуются, что «все зависает» (а вы уже мечтаете о побеге в Гималаи). Что делать?
Масштабирование: два принципиально разных подхода
Прежде чем переходить к сложным решениям, важно понять базовые стратегии.
1. Вертикальное масштабирование (Scale Up): когда больше — не значит лучше
По сути, мы делаем наш сервер мощнее по четырем ключевым направлениям:
CPU (процессор)
Добавляем ядер — теперь сервер может пережевывать больше запросов одновременно. Как шеф-повар с четырьмя руками, который успевает и суп мешать, и котлеты переворачивать.RAM (оперативная память)
Увеличиваем «кратковременную память» сервера. Теперь он может держать в уме не 10 таблиц, а 100. И не нужно постоянно «вспоминать», лезть за данными на медленный диск.Диски (HDD → SSD/NVMe)
Меняем старый жёсткий диск (как велосипед) на SSD (спортивный мотоцикл). Скорость чтения/записи вырастает в 50-100 раз!Сеть
Улучшаем «дороги», по которым данные ходят к пользователям. Было как грунтовка — стало как шестиполосное шоссе.
Почему это так популярно?
✅ Проще некуда
Никаких изменений в коде, никаких сложных настроек. Купил сервер мощнее — воткнул вместо старого. Всё работает как прежде, только быстрее.
✅ Один сервер — одна головная боль
Не нужно думать о синхронизации между узлами, распределении запросов. Всё в одном месте — и следить проще, и чинить.
✅ Совместимость 100%
Ваше приложение даже не заметит подмены. Та же база, те же драйверы — просто теперь летает.
Но есть и подводные камни
❗️ Физические пределы
Как бы вы ни прокачивали свой внедорожник, он никогда не станет космическим кораблём. Максимум RAM в одном сервере — около 6 ТБ (и это будет стоить как небольшой самолёт).
❗️ Цена растёт экспоненциально с увеличением мощности
Первые 32 ГБ RAM — 200. Следующие 32ГБ — уже 300. А когда добираетесь до 1 ТБ — каждая добавленная планта памяти увеличивает стоимость на тысячи долларов.
❗️ «Я упал — все упали»
Один сервер = одна точка отказа. Если он отвалится, поминай как звали.
❗️ Апгрейд = downtime
Чтобы добавить памяти, часто нужно выключать сервер. Для многих систем даже небольшая недоступность критически важных сервисов недопустима.
Когда вертикальное масштабирование — идеальный выбор?
Стартапы на этапе роста
Пока у вас 50-100 тысяч пользователей — проще раз в полгода переезжать на сервер мощнее.Системы с предсказуемой нагрузкой
Если у вас нет резких скачков трафика (как во время Черной пятницы), вертикальное масштабирование покрывает все нужды.Когда важна простота
Нет команды DevOps? Нет времени на настройку кластеров? Scale-up спасает ситуацию.
Кейс
Один интернет-магазин столкнулся с проблемой: их PostgreSQL начал захлебываться при RPS == 5000 (запросов в секунду). Решение?
Было: Сервер с 16 ядрами CPU, 64 ГБ RAM, HDD
Стало: 32 ядра, 256 ГБ RAM, NVMe
Результат?
Время отклика упало с 1200 мс до 90 мс;
Стоимость сервера выросла в 3 раза;
Но! Разработчики потратили время на миграцию. К счастью, всего 2 дня.
Для сравнения: выполнение шардирования потребовало бы 2-3 месяца работы и увеличение штата на двух инженеров.
Вертикальное масштабирование — как костыль, который иногда превращается в супер-протез. Да, у него есть пределы, но часто именно оно становится самым быстрым и экономичным решением.
2. Горизонтальное масштабирование (Scale Out): путь современных высоконагруженных систем
Что значит «добавить сервер»?
Это как превратить уютную кофейню в сеть ресторанов. Есть три основных способа оптимизации:
Репликация (клонирование)
Создаем копии главного сервера. Заказы принимает только шеф-повар (master), но готовить помогают другие повара (replicas). Клиенты получают блюда быстрее, ведь официанты (requests) для приготовления своего заказа могут найти любого свободного повара.Шардинг (разделение меню)
Даем клиентам возможность посещать разный набор ресторанов: в первом подают суши, во втором — пиццу, в третьем — стейки. Каждый повар специализируется на своём блюде (шарде данных), за счет чего можно достичь увеличения необходимых показателей.Кластеризация (франшиза по доставке еды)
Сеть ресторанов с единым стандартом. Каждый может принимать заказы, а данные синхронизируются и маршрутизируются между всеми точками в соответствии с установленными параметрами.
Почему крупные компании выбирают scale-out?
✅ Масштабируемость до бесконечности
Нужно больше мощности? Просто добавьте ещё серверов. Технически ограничений нет — Facebook использует десятки тысяч серверов для своих баз данных.
✅ Отказоустойчивость
Упал один сервер? Система даже не заметит. Данные хранятся в нескольких экземплярах, как важные документы в сейфе с дубликатами.
✅ Экономия на железе
10 серверов по 5 тыс долларов часто дешевле одного за 100 тыс долларов.
✅ Гибкость распределения нагрузки
Пик активности в Азии? Увеличиваем количество серверов в Сингапуре. Ночью можно часть выключить для экономии.
Но не все так просто
❗️ Архитектурная головная боль
Теперь ваше приложение должно понимать:
куда писать новые данные;
откуда читать актуальную информацию;
как работать с транзакциями между серверами.
❗️ CAP-теорема — приходится выбирать
Как в том анекдоте про «быстро, дёшево, качественно» — можно выбрать только два из трёх:
Консистентность (все данные актуальны);
Доступность (система всегда отвечает);
Устойчивость к разделению (работает при обрывах связи).
❗️ Сложность администрирования
Теперь нужно следить не за одним сервером, а за целым зоопарком. Автоматизация становится must-have.
❗️ Особенности шардинга
Cross-shard запросы как заказ комплексного обеда из разных ресторанов. Сложно, долго, иногда блюда приходят в разное время.
Когда горизонтальное масштабирование — идеальный выбор?
Высоконагруженные сервисы
Соцсети, маркетплейсы, SaaS-платформы — где десятки тысяч запросов в секунду.Глобальные проекты
Нужно размещать данные ближе к пользователям в разных регионах.Критически важные системы
Когда простой недопустим даже на минуту — банки, платежные системы.
Кейс
Один игровой сервис столкнулся с проблемой: 2 млн активных пользователей ежедневно, PostgreSQL не справлялся при RPS==5000. Решение?
Разделили данные по игровым регионам (шардинг)
Для каждого региона сделали 3 реплики
Настроили автоматическое переключение при сбоях
Результат:
Пропускная способность выросла в 20 раз
Задержки уменьшились с 2 секунд до 50 мс
Отказоустойчивость — система переживет падение любого из серверов
Правда, пришлось:
Переписать 30% кода приложения
Нанять двух DevOps-инженеров
Внедрить сложную систему мониторинга
Горизонтальное масштабирование — как переход от ларька с шаурмой к сети ресторанов. Сложнее управлять, зато нет ограничений по масштабированию. Главное — правильно выбрать стратегию (Репликация, шардинг или кластер. А может и вовсе решение, совмещающее приведенные механизмы) и быть готовым к новым архитектурным вызовам.
Вертикальное vs горизонтальное масштабирование
Критерий | 🔼 Вертикальное масштабирование | ↔️ Горизонтальное масштабирование |
Принцип работы | "Вырасти выше" Апгрейд одного сервера | "Расширяйся шире" Добавление новых узлов |
Скорость внедрения | 🟢 Быстро (дни) Замена железа | 🟡 Долго (недели/месяцы) Изменение архитектуры и кодовой базы |
Макс. мощность | 🔴 Жесткие ограничения Физические лимиты железа | 🟢 Безгранично Можно добавлять узлы бесконечно. Если сможете за ними уследить |
Отказоустойчивость | 🔴 Единая точка отказа Сбой сервера критичен и приводит к недоступности | 🟢 Автовосстановление Работает при падении узлов |
Экономика | 🔴 Дорогой апгрейд Цена растет экспоненциально | 🟢 Линейные затраты Экономия на массовости |
Администрирование | 🟢 Простое 1 сервер = 1 точка управления | 🔴 Сложное Требует оркестрации и тех. поддержания |
Изменения кода | 🟢 Минимальные Часто не требуются | 🔴 Значительные Поддержка распределенности |
Идеальный кейс | Стартапы Средние нагрузки MVP | Highload-системы Глобальные проекты Критически-важные сервисы |
Репликация данных: как создать непотопляемую систему-броненосец
После сравнения подходов становится ясно: горизонтальное масштабирование — это не только про мощность, но и про надежность. И здесь на первый план выходит репликация — технология, которая:
Делает вашу БД практически неуязвимой к сбоям;
Ускоряет чтение в десятки раз;
Позволяет пережить даже падение дата-центра.
Почему это важно?
Представьте, что ваша база данных — это единственный экземпляр важного документа. Если он потеряется или будет поврежден — катастрофа неизбежна. Репликация решает эту проблему, создавая несколько синхронизированных копий данных. Это как сделать нотариально заверенные копии паспорта и хранить их в разных местах.
Что такое репликация на практике?
Это процесс автоматического копирования данных с главного сервера (мастера) на подчинённые (реплики).
Как это работает на примере кейса с рестораном, который был рассмотрен в рамках предыдущей статьи:
Управляющая компания (мастер) получает поставку расходных материалов, приуроченных к новому году (новую информацию);
Он сразу рассылает её во все филиалы (реплики);
Клиент может обратиться в любой филиал и получить продукт в сезонной упаковке, на которой он найдет приятное поздравление с новым годом.
Основные типы репликации: как выбрать правильный подход
Окей, поиграем с аналогиями еще. Представьте, что вы капитан корабля, перевозящего ценный груз (данные). Можно отправить его:
С охраной, которая подтвердит доставку (синхронная репликация);
Быстро, но без гарантий (асинхронная репликация);
С частичным сопровождением (полусинхронная репликация).
Выбор типа репликации определяет, насколько надёжно и быстро будут доставлены ваши данные. Давайте разберем каждый вариант.
Синхронная репликация: надёжность прежде всего
Как работает:
Мастер ждёт подтверждения от ВСЕХ реплик перед завершением операции записи. Это как отправка документов с курьером, который требует подпись о получении в каждом отделении.
Техническая реализация в PostgreSQL:
synchronous_standby_names = 'FIRST 2 (node1, node2, node3)'
Плюсы:
✅ Полная гарантия сохранности данных;
✅ Простота аварийного восстановления.
Минусы:
❗️ Большие временные задержки (200-500 мс);
❗️Процессы в системе могут быть приостановлены при проблемах с репликами;
❗️ Ограниченная геораспределенность.
Пример из практики:
В банковской системе при 3 синхронных репликах:
Обычная задержка перевода: 300 мс;
При падении одной реплики: система продолжает работать;
При падении двух: переводы временно блокируются.
Асинхронная репликация: скорость любой ценой
Как работает:
Мастер записывает данные локально и сразу отвечает клиенту. Реплики обновляются в фоновом режиме. Это как отправить письмо по электронной почте — вы знаете, что оно дойдёт, но не знаете когда и будет ли оно прочитано.
Настройка в MySQL:
CHANGE MASTER TO MASTER_DELAY = 3600; -- Задержка репликации 1 час
Плюсы:
✅ Минимальные задержки (1-5 мс);
✅ Работает при любых проблемах с репликами;
✅ Идеально для географического распределения.
Минусы:
❗️ Возможна потеря последних данных;
❗️ Сложное восстановление после аварий;
❗️ Время обновления для каждой из реплик может быть разным.
Реальный кейс:
Пользователь публикует контент от своего имени:
Он же сможет видеть его сразу после отправки;
Подписчики могут увидеть его с задержкой 2-5 сек;
При аварии возможна всего контента, опубликованного за последние 5 минут.
Полусинхронная репликация: золотая середина
Как работает:
Мастер ждёт подтверждения только от N реплик (обычно 1-2). Это как отправка документов с требованием хотя бы одного подтверждения о получении.
Конфигурация в MySQL:
rpl_semi_sync_master_wait_for_slave_count = 1
Плюсы:
✅ Разумный баланс скорости и надёжности;
✅ Частичная защита от потерь данных;
✅ Хорошая геораспределенность.
Минусы:
❗️ Более сложная настройка;
❗️ Нужен мониторинг работы всех реплик, особое внимание к «отстающим»;
❗️ Возможная потеря данных.
Пример использования:
Предположим, мы реализовали данный механизм для интернет-магазина:
Подтверждение заказа происходит после сохранения в мастере и одной реплике;
Задержка около 50-100 мс;
Потеря данных возможна только при одновременном падении мастера и основной реплики.
Как выбрать тип репликации?
Для финансовых систем → Синхронная
Пример: Банковские переводы, где важен каждый бит данныхДля соцсетей/аналитики → Асинхронная
Пример: Лента новостей, где скорость важнее актуальностиДля e-commerce → Полусинхронная
Пример: Корзина покупок, где нужен баланс скорости и надёжности
Совет: Современные СУБД позволяют комбинировать разные типы репликации для разных таблиц!
Выбор типа репликации — это всегда компромисс между:
Скоростью (асинхронная);
Надежностью (синхронная);
Балансом (полусинхронная).
Как опытный капитан, вы должны выбрать оптимальный маршрут для своего ценного груза данных. Правильный выбор сделает вашу систему быстрой, надежной и устойчивой к штормам.
Почему репликация — must have для серьёзных проектов?
✅ Живучесть системы
При падении мастера одна из реплик мгновенно берет управление на себя. Как в авиации — если пилот теряет сознание, его сразу заменяет второй пилот.
✅ Молниеносное чтение данных
Запросы можно распределять по всем репликам. Представьте магазин, где 100 кассиров вместо одного. Разница очевидна!
✅ Географическая независимость
Данные можно разместить ближе к пользователям. Для москвичей — сервер в Москве, для жителей Владивостока — во Владивостоке.
✅ Безболезненное обновление
Можно выводить мастера на обслуживание без остановки работы — система автоматически переключится на реплики.
Тёмная сторона репликации
❗️ Головная боль с синхронизацией
Когда реплики отстают от мастера, пользователи могут видеть устаревшие данные. Представьте, что баланс на карте обновляется с задержкой в 5 минут… Приятного тут явно мало!
❗️ Дорогое удовольствие
Каждая реплика требует ресурсов. В некоторых случаях эти затраты нецелесообразны.
❗️ Сложность настройки
Нужно грамотно настроить параметры репликации, иначе можно получить "мёртвые" реплики, которые не успевают за мастером.
Когда репликация спасает проект?
Высоконагруженные сервисы
Соцсети, где чтений в 100 раз больше, чем обновления/создания записейСистемы, работающие с критически важными данными
Банки, биржи, медицинские учрежденияГлобальные проекты
Сервисы с пользователями в разных часовых поясах
Репликация — это страховой полис для ваших данных. Она требует инвестиций и грамотной настройки, но когда случается беда, вы понимаете, что каждая копейка была потрачена не зря.
Итог
Оптимизация базы данных — это искусство находить баланс между скоростью, надёжностью и масштабируемостью. В первой части мы рассмотрели два ключевых подхода к масштабированию: вертикальное и горизонтальное Первое позволяет быстро устранить узкие места за счёт усиления серверной части, а второе открывает путь к построению распределённых отказоустойчивых систем, готовых к любым нагрузкам.
Да, в некоторых случаях легче, быстрее и даже правильнее будет просто «накинуть железа», но по-настоящему мощные системы сложно создать без грамотного проектирования и применения методов репликации и шардирования – подхода, при котором данные и нагрузка распределяются между несколькими узлами. Мы рассмотрим устройство шардинга, кейсы для внедрения и сложности, с которыми придется столкнуться.
А пока давайте обсудим, как вы решаете проблему «внезапного» роста нагрузки и объёма данных. Буду рад узнать про Ваш опыт в комментариях!