В чем разница между вертикальным и горизонтальным масштабированием баз данных

«В чем разница между вертикальным и горизонтальным масштабированием баз данных» — вопрос из категории Архитектура, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вертикальное масштабирование (Scale-Up) — это увеличение мощности одного сервера БД (больше CPU, RAM, более быстрые диски). Горизонтальное масштабирование (Scale-Out) — это добавление большего количества серверов БД для распределения нагрузки.

Сравнительная таблица

Аспект Вертикальное масштабирование Горизонтальное масштабирование
Подход «Сделать сервер больше». «Добавить больше серверов».
Сложность Относительно просто. Апгрейд железа или миграция на более мощный инстанс в облаке. Сложно. Требует изменения архитектуры приложения и БД (шардинг, репликация).
Предел роста Ограничен максимальной конфигурацией одного сервера (физический/финансовый потолок). Теоретически безгранично за счет добавления новых узлов.
Отказоустойчивость Точка отказа (SPOF). Падение сервера = недоступность всей БД. Высокая. Данные и нагрузка распределены, отказ одного узла не должен парализовать систему.
Стоимость Линейный рост цены с мощностью, часто нелинейный (дорогой high-end сервер). Более линейная зависимость, можно использовать много стандартных, дешевых серверов.
Типичный сценарий Быстрое решение для растущей нагрузки, монолитные приложения, транзакционные нагрузки (OLTP). Высоконагруженные системы, Big Data, аналитические нагрузки (OLAP), глобальные сервисы.

Практические примеры

Вертикальное масштабирование в облаке (AWS RDS):

-- Нет изменений в коде приложения.
-- В консоли AWS: "Modify DB instance" -> изменить класс инстанса с db.t3.medium на db.r5.2xlarge.

Горизонтальное масштабирование (шардинг PostgreSQL с Citus):

-- 1. Создание распределенной (шардированной) таблицы
SELECT create_distributed_table('orders', 'user_id');

-- 2. Данные автоматически распределяются по узлам кластера.
-- Запрос к orders будет выполняться на всех узлах параллельно.
SELECT * FROM orders WHERE user_id = 123; -- Запрос идет только в нужный шард.

Репликация (часть горизонтального масштабирования для чтения):

-- Настройка реплики в MySQL для чтения
CHANGE MASTER TO
  MASTER_HOST='primary-db',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='password';
START SLAVE;

-- Приложение направляет SELECT-запросы на реплики, а INSERT/UPDATE — на мастер.

Выбор стратегии: Часто начинают с вертикального масштабирования как более простого пути, а при приближении к его пределам переходят к горизонтальному, что требует серьезной переработки архитектуры.