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

Когда одного сервера мало, есть два пути: сделать его мощнее или поставить рядом ещё.

Вертикальное масштабирование (scale up) — добавить ресурсов одному серверу. Горизонтальное (scale out) — добавить серверов и распределить нагрузку между ними.

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

Самый простой путь: взять сервер помощнее — больше CPU, RAM, быстрее диск. Код менять не нужно, архитектура остаётся прежней. Но у этого пути есть жёсткий потолок: нельзя купить сервер с бесконечной памятью, а топовое железо дорожает нелинейно. И главное — это единая точка отказа: упал сервер — упало всё.

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

Здесь мы ставим много обычных серверов и распределяем запросы между ними балансировщиком. Потолка по сути нет: нужно больше мощности — добавили ещё машин. Падение одной машины не роняет систему. Но появляется цена: нужен балансировщик, сервисы должны быть stateless, а данные — как-то делиться между узлами.

Сравнение

КритерийВертикальное (scale up)Горизонтальное (scale out)
Как растёммощнее одна машинабольше машин
Потолокесть, упираемся в железопрактически нет
Отказоустойчивостьединая точка отказападение узла переживается
Сложностьнизкая, код не меняемвыше: балансировщик, stateless, распределение данных
Стоимостьрастёт нелинейнолинейна на commodity-железе
Простой при апгрейдечасто нужен перезапускможно обновлять по одной машине

Что выбирают на практике

Обычный путь — начать с вертикального (это дёшево и просто), а при серьёзном росте перейти к горизонтальному. Большие системы почти всегда горизонтальны: только так достигается и масштаб, и отказоустойчивость. Но «безголовый» слой (stateless-сервисы) масштабировать горизонтально легко, а вот состояние (базу данных) — гораздо труднее, это тема шардирования.

Пример рассуждения на собеседовании

Нагрузка выросла до 5000 QPS.
1) Вертикально: сервер мощнее — выиграем время, но это потолок
   и единая точка отказа. Как временная мера — ок.
2) Горизонтально: 4–5 stateless-инстансов за балансировщиком.
   Падение одного переживём, можно докидывать узлы. Выбираем это.
Итог: горизонтальное масштабирование stateless-слоя + БД отдельно.

Итог

  • Вертикально — просто, но есть потолок и единая точка отказа.
  • Горизонтально — почти без потолка и отказоустойчиво, но сложнее и требует stateless.
  • Stateless-слой масштабируется легко; сложность — в масштабировании данных.
Проверьте себя
1. Главный недостаток вертикального масштабирования — это…
Aоно требует переписать весь код
Bесть потолок мощности и единая точка отказа
Cоно всегда дороже горизонтального во всех случаях
Dего нельзя применить к базе данных
2. Почему горизонтальное масштабирование требует stateless-сервисов?
AИначе балансировщик не запустится
BЧтобы любой запрос мог обработать любой узел без привязки к конкретной машине
CStateless-сервисы быстрее по своей природе
DЭто требование закона
3. Что обычно труднее всего масштабировать горизонтально?
Astateless веб-серверы
Bсостояние — базу данных и данные
Cбалансировщик
Dстатические файлы
Поддержать проект