Всем привет! Меня зовут Илья Криволапов, тружусь системным аналитиком в 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 раз больше, чем обновления/создания записейСистемы, работающие с критически важными данными
Банки, биржи, медицинские учрежденияГлобальные проекты
Сервисы с пользователями в разных часовых поясах
Репликация — это страховой полис для ваших данных. Она требует инвестиций и грамотной настройки, но когда случается беда, вы понимаете, что каждая копейка была потрачена не зря.
Итог
Оптимизация базы данных — это искусство находить баланс между скоростью, надёжностью и масштабируемостью. В первой части мы рассмотрели два ключевых подхода к масштабированию: вертикальное и горизонтальное Первое позволяет быстро устранить узкие места за счёт усиления серверной части, а второе открывает путь к построению распределённых отказоустойчивых систем, готовых к любым нагрузкам.
Да, в некоторых случаях легче, быстрее и даже правильнее будет просто «накинуть железа», но по-настоящему мощные системы сложно создать без грамотного проектирования и применения методов репликации и шардирования – подхода, при котором данные и нагрузка распределяются между несколькими узлами. Мы рассмотрим устройство шардинга, кейсы для внедрения и сложности, с которыми придется столкнуться.
А пока давайте обсудим, как вы решаете проблему «внезапного» роста нагрузки и объёма данных. Буду рад узнать про Ваш опыт в комментариях!
Комментарии (14)
GidraVydra
19.05.2025 17:35Такое ощущение, что пришел на утренник в ясли-сад "Админенок", а там похмельный клоун в парике и с поролоновым носом рассказывает, откуда берутся
детифризы.Kmamish Автор
19.05.2025 17:35Доброе утро!
Круто, что Вы использовали тот же стилистический прием, что и в статье, в виде аналогий :)
В целом основная моя задача при написании как раз и заключалась в том, чтобы можно было рассказать о сложном на каком-нибудь детском утреннике. Видимо, справился, спасибо! :))
Единственное - осталось обзавестись париком и поролоновым носом) Пошел поищу на озоне
GidraVydra
19.05.2025 17:35Ну мы все-таки не на детском утреннике пока, ресурс профильный, люди в какой-то степени все в теме, так долго и подробно разжевывать прописные истины не надо.
А что спокойно реагируете на критику и юмор - это хорошо.
ETOZHEKIM
19.05.2025 17:35Почитал ваши комментарии, которые состоят на 80% из плевания желчью (не зря карма -6). Про детский утренник уже раз сто писали, могли бы и пооригинальнее что-то уже придумать) Ну ЧатГПТ в помощь. А так создается впечатление что вы обиженный жизнью, на каждую статью заходите, чтобы кого-то обос**ть
Akina
А вот тут вы что-то как-то не очень... слишком увлеклись общепитом, и забыли, что сначала надо бы сформулировать на техническом языке, а уж потом предлагать аналогии.
Репликация - в каждом узле полная копия данных.
Шардинг - в каждом узле копия идентифицирующего блока данных, плюс в каждом узле своя (уникальная в рамках всего массива данных) часть не-идентифицирующего блока данных.
Кластеризация - ???
Я бы сказал, что всегда. Более того - всегда ровно вдвое.
Ну то есть шардинг и кластеризация идут лесом, что ли? или как?
Да? а вы не хотите в свой список добавить несколько пунктов из таблички Вертикальное vs горизонтальное масштабирование? Там, между прочим, немалые затраты и сил, и времени, и денег... а это сто пудов не светлая сторона процесса.
Kmamish Автор
Владислав, добрый день!
Спасибо за комментарий! Давайте разберем ваши замечания по пунктам:
По поводу "не очень" и "увлеклись общепитом": Приношу извинения, если аналогии показались вам излишне упрощенными. Цель была сделать материал доступнее для широкой аудитории. В дальнейшем постараюсь балансировать между простотой и технической точностью.
Репликация, Шардинг, Кластеризация: Ваше определение репликации верное. По поводу шардинга - да, вы верно подметили суть, спасибо за уточнение. Что касается кластеризации, то это более широкое понятие, чем просто распределение данных. Кластеризация подразумевает объединение нескольких серверов в единую логическую систему для повышения отказоустойчивости и производительности. Данные могут быть распределены между узлами кластера разными способами (репликация, шардинг, их комбинация, и т.д.).
10 серверов vs 1 сервер: Ваше утверждение о цене в два раза меньше - это, конечно, упрощение. Стоимость зависит от множества факторов, включая лицензии, поддержку, администрирование, электроэнергию и т.д. Однако, в целом, вы правы, что горизонтальное масштабирование часто более экономически выгодно.
Репликация на первом плане: Я не утверждал, что шардинг и кластеризация "идут лесом". Репликация часто является отправной точкой для обеспечения отказоустойчивости, но выбор конкретного метода масштабирования зависит от конкретных требований проекта.
Темная сторона репликации и вертикальное vs горизонтальное масштабирование: Безусловно, вы правы. В таблице "Вертикальное vs горизонтальное масштабирование" есть множество факторов, которые необходимо учитывать. Целью не было перечислить все недостатки репликации, а лишь указать на некоторые из них. Спасибо за дополнение, это важный момент.
В заключение, благодарю вас за конструктивную критику. Она помогает улучшить качество материала и сделать его более полезным для читателей :)
Akina
Верю. Но сейчас получилось, что для именно незнакомой или слабознакомой с материалом аудитории это "прочитать и забыть". Просто представьте, что будет дальше. Человек причитал вот это кулинарное описание. Он хочет более подробно разобраться, понять... так вы ж ему, кроме самих терминов, даже токенов для поиска не дали! Ну то есть он начнёт с нуля, а вся польза статьи будет в том, что человек заинтересовался предметом. Тоже немаловажно, но как-то маловато. Уж поверьте, если будет дополнительный абзац на техническом языке, реально заинтересовавшийся отложит его до получения дополнительной информации, а потом вернётся и поймёт. А не заинтересовавшийся... впрочем, нам пофиг, что он будет делать с тем, что не понял.
Именно. И не просто более широкое. Оно вообще никакого отношения к масштабированию БД не имеет, ибо решает совсем иные задачи. А сопутствующее горизонтальное масштабирование - это просто приятный бонус. Во всяком случае, в контексте темы статьи я воспринимаю кластеризацию именно так (но на истинность этого утверждения, понятно, не претендую).
Kmamish Автор
Еще раз спасибо большое за комментарии, очень понравилась идея с доп.литературой по теме, нужно будет предусмотреть такой блок в следующих статьях :)