Skip to main content

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

1. Що таке масштабування

Масштабування (scaling) - це процес збільшення обчислювальних ресурсів, щоб застосунок міг обробляти більшу кількість запитів, користувачів чи даних без деградації продуктивності.

Є два основні підходи:

  • Вертикальне масштабування (Vertical Scaling)
  • Горизонтальне масштабування (Horizontal Scaling)

2. Вертикальне масштабування (scale-up)

Вертикальне масштабування = збільшити потужність одного сервера.

Простіше кажучи:

ми покращуємо залізо: додаємо більше CPU, RAM, SSD чи прискорюємо мережу на одній машині.

Приклад:

БулоСтало
2 ядра CPU8 ядер CPU
4 GB RAM32 GB RAM
HDDNVMe SSD

Тепер той самий сервер може обробляти у 4-8 разів більше запитів, але все ще лишається одним сервером і одним процесом застосунку.

Приклад у Node.js:

  • Був один процес, що обробляв 1000 запитів/сек.
  • Додали більше CPU й RAM.
  • Тепер цей процес обробляє 5000 запитів/сек.
  • Або запустили кластер через cluster, щоб використати всі ядра CPU.

Це все - вертикальне масштабування, бо воно використовує одну машину.

Плюси вертикального масштабування

ПеревагаОпис
ПростотаНе потрібно міняти архітектуру чи код
Менше інфраструктуриОдин сервер, менше точок відмови
Швидке впровадженняПросто оновити план хостингу чи залізо
Корисно для баз данихПрості сценарії (Postgres, Mongo) добре масштабуються "вгору"

Мінуси вертикального масштабування

НедолікОпис
Фізична межаУ будь-якого сервера є ліміт по ядрах і пам'яті
ДорогоПотужніші машини ростуть у ціні не лінійно
Точка відмовиОдин сервер = одна точка збою
Не можна масштабувати "нескінченно"Після стелі ресурсів доведеться переходити на горизонтальний підхід

3. Горизонтальне масштабування (scale-out)

Горизонтальне масштабування = додати більше серверів.

Простіше кажучи:

замість того щоб посилювати один сервер, ми запускаємо кілька однакових копій застосунку й розподіляємо навантаження між ними.

Приклад:

БулоСтало
1 сервер5 серверів
Обробка 1000 req/sОбробка 5000 req/s
Один instance5 instances під балансувальником

Тепер якщо прийде 5000 користувачів - балансувальник (наприклад, NGINX, AWS ELB, Kubernetes) розподілить запити по всіх вузлах.

Приклад у Node.js:

  • У тебе застосунок app.js, що слухає порт 3000.
  • Ти запускаєш 5 копій на різних серверах чи контейнерах.
  • Перед ними стоїть NGINX чи load balancer, який роздає запити по черзі.

Це - горизонтальне масштабування, тому що ти додаєш нові вузли, а не посилюєш один.

Плюси горизонтального масштабування

ПеревагаОпис
Масштабується майже безмежноПросто додавай нові вузли
ВідмовостійкістьЯкщо один сервер впаде - решта продовжують працювати
ГнучкістьМожна масштабувати по зонах, регіонах, контейнерах
ЕкономічністьКілька простих машин дешевші за одного "монстра"
Підходить для хмарAWS, GCP, Azure, Kubernetes - усе для цього заточено

Мінуси горизонтального масштабування

НедолікОпис
Складність архітектуриПотрібно впроваджувати балансувальники, синхронізацію, логування
Проблеми зі станомСесії користувачів і кеш потрібно зберігати централізовано (Redis, БД)
Міжсерверна комунікаціяЗ'являються мережеві затримки й складніше налагодження
Потрібні DevOps-навичкиБез контейнеризації й CI/CD буде важко

4. Порівняння: вертикальне vs горизонтальне

КритерійВертикальне (scale-up)Горизонтальне (scale-out)
Основна ідеяПосилити один серверДодати більше серверів
Простота реалізаціїПростеСкладніше (потрібен балансувальник)
Зміни в кодіМінімальніЧасто потрібні
Ліміт ростуЄ (залізо обмежене)Майже необмежений
ВідмовостійкістьОдин сервер = SPOFВисока (кілька інстансів)
ВартістьДорого при великих потужностяхМасштабовано й передбачувано
Приклад у Node.jscluster (1 сервер, усі ядра CPU)Nginx + кілька серверів / контейнерів
Тип масштабування"вгору""вшир"

5. Часто обидва підходи комбінують

На практиці використовують гібрид:

  1. Вертикально - максимум з однієї машини (CPU, RAM, cluster).
  2. Горизонтально - додати ще машин, контейнерів чи подів (через Docker/Kubernetes/PM2 cluster mode).

Приклад архітектури:

javascript
Load Balancer (NGINX) ┌────┴────┬────┬────┐ Server1Server2Server3 (Cluster з 8 воркерів кожен)

→ Кожна машина використовує всі ядра (вертикальне), а навантаження розподіляється по серверах (горизонтальне).

Підсумок

ПараметрВертикальнеГоризонтальне
МасштабуванняЗбільшення потужності сервераДодавання нових серверів
ПростотаЛегшеСкладніше
ПродуктивністьРосте до межі CPU/RAMРосте лінійно з додаванням вузлів
ВідмовостійкістьНизькаВисока
ЗастосуванняМалі/середні навантаження, бази данихВисоконавантажені системи, API
Приклад у Node.jsclusterКілька інстансів під балансувальником

Висновок:

Вертикальне масштабування посилює один сервер (більше ресурсів). Горизонтальне масштабування додає нові сервери, що працюють паралельно.

У продакшені зазвичай комбінують обидва підходи: cluster - щоб використати всі ядра CPU, і балансувальник (NGINX, Kubernetes, PM2) - щоб розподіляти навантаження між кількома вузлами.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.