Вертикальное и горизонтальное масштабирование
Когда одного сервера мало, есть два пути: сделать его мощнее или поставить рядом ещё.
Вертикальное масштабирование (scale up) — добавить ресурсов одному серверу. Горизонтальное (scale out) — добавить серверов и распределить нагрузку между ними.
Вертикальное масштабирование
Самый простой путь: взять сервер помощнее — больше CPU, RAM, быстрее диск. Код менять не нужно, архитектура остаётся прежней. Но у этого пути есть жёсткий потолок: нельзя купить сервер с бесконечной памятью, а топовое железо дорожает нелинейно. И главное — это единая точка отказа: упал сервер — упало всё.
Горизонтальное масштабирование
Здесь мы ставим много обычных серверов и распределяем запросы между ними балансировщиком. Потолка по сути нет: нужно больше мощности — добавили ещё машин. Падение одной машины не роняет систему. Но появляется цена: нужен балансировщик, сервисы должны быть stateless, а данные — как-то делиться между узлами.
Сравнение
| Критерий | Вертикальное (scale up) | Горизонтальное (scale out) |
| Как растём | мощнее одна машина | больше машин |
| Потолок | есть, упираемся в железо | практически нет |
| Отказоустойчивость | единая точка отказа | падение узла переживается |
| Сложность | низкая, код не меняем | выше: балансировщик, stateless, распределение данных |
| Стоимость | растёт нелинейно | линейна на commodity-железе |
| Простой при апгрейде | часто нужен перезапуск | можно обновлять по одной машине |
Что выбирают на практике
Обычный путь — начать с вертикального (это дёшево и просто), а при серьёзном росте перейти к горизонтальному. Большие системы почти всегда горизонтальны: только так достигается и масштаб, и отказоустойчивость. Но «безголовый» слой (stateless-сервисы) масштабировать горизонтально легко, а вот состояние (базу данных) — гораздо труднее, это тема шардирования.
Пример рассуждения на собеседовании
Нагрузка выросла до 5000 QPS.
1) Вертикально: сервер мощнее — выиграем время, но это потолок
и единая точка отказа. Как временная мера — ок.
2) Горизонтально: 4–5 stateless-инстансов за балансировщиком.
Падение одного переживём, можно докидывать узлы. Выбираем это.
Итог: горизонтальное масштабирование stateless-слоя + БД отдельно.
Итог
- Вертикально — просто, но есть потолок и единая точка отказа.
- Горизонтально — почти без потолка и отказоустойчиво, но сложнее и требует stateless.
- Stateless-слой масштабируется легко; сложность — в масштабировании данных.