Gymterview
junior

Чем отличается горизонтальное масштабирование от вертикального?

Масштабирование – это способ увеличить способность системы справляться с растущей нагрузкой. Существует два фундаментально различных подхода. Это как разница между покупкой более мощного грузовика (вертикальное) и добавлением ещё одного грузовика в автопарк (горизонтальное).

Вертикальное масштабирование (Scale Up)

Увеличение мощности одного сервера: добавление CPU, RAM, более быстрых дисков, переход на более мощную машину. Приложение при этом не меняется – оно просто получает больше ресурсов.

Горизонтальное масштабирование (Scale Out)

Добавление новых серверов (узлов) в кластер. Нагрузка распределяется между несколькими экземплярами приложения с помощью балансировщика.

Пример кода
Вертикальное:                    Горизонтальное:

┌──────────────────┐            ┌────────┐ ┌────────┐ ┌────────┐
│                  │            │ Server │ │ Server │ │ Server │
│   Мощный сервер  │            │   1    │ │   2    │ │   3    │
│   (много CPU,    │            └───┬────┘ └───┬────┘ └───┬────┘
│    много RAM)    │                │          │          │
│                  │                └──────────┴──────────┘
└──────────────────┘                          │
                                     ┌────────┴────────┐
                                     │  Load Balancer  │
                                     └─────────────────┘

Сравнение

Аспект Вертикальное Горизонтальное
Способ Больше ресурсов одному серверу Больше серверов
Предел Ограничен оборудованием Теоретически безграничен
Downtime Обычно нужна остановка Без остановки
Стоимость Экспоненциально растёт Линейно растёт
Сложность Простое Требует балансировки, распределённой работы
Данные Одна БД Нужна репликация или шардирование
Отказоустойчивость Единая точка отказа Высокая (при сбое одного узла работают другие)

Стратегии горизонтального масштабирования

  • Stateless-сервисы – приложение не хранит состояние в памяти, любой запрос может обработать любой узел.
  • Репликация БД – master-slave для распределения нагрузки на чтение.
  • Шардирование БД – разделение данных по узлам (например, по диапазону ID клиентов).
  • Кэширование – Redis или Memcached для снижения нагрузки на БД.

Типичный подход на практике

На практике часто комбинируют оба подхода:

  • Вертикальное масштабирование для БД (мощный сервер + репликация), поскольку горизонтальное масштабирование базы данных сопряжено со значительной сложностью.
  • Горизонтальное масштабирование для stateless-сервисов (Spring Boot) за балансировщиком нагрузки, так как добавить ещё один экземпляр приложения значительно проще.

На собеседовании: Интервьюер хочет услышать, что на практике эти подходы комбинируются, а не выбирается один. Частая ошибка – забывать о проблемах горизонтального масштабирования (состояние сессий, консистентность данных).