Коли система перестає справлятися зі зростанням навантаження, є два базові способи збільшити її продуктивність: вертикальне та горизонтальне масштабування.
На перший погляд це IT-терміни, але насправді принцип дуже простий і зустрічається навіть у звичайному будівництві.
Коротко:
Вертикальне масштабування — зробити один елемент потужнішим.Горизонтальне масштабування — додати більше таких самих елементів.
Вертикальне масштабування
Вертикальне масштабування (vertical scaling, або scale up) означає збільшення потужності вже існуючого компонента.
Наприклад, у нас є сервер із:
- 4 CPU;
- 16 ГБ оперативної пам'яті;
- SSD на 500 ГБ.
Система починає працювати повільно. Замість того щоб додавати ще один сервер, ми можемо встановити:
- 16 CPU;
- 64 ГБ RAM;
- швидший SSD.
Сервер залишився один, але став значно потужнішим.
Це і є вертикальне масштабування.
Приклад із будівництва
Уявімо будинок, якому потрібно витримувати більше навантаження.
Вертикальний підхід — посилити існуючу конструкцію:
- використати товстіші балки;
- збільшити переріз колон;
- додати арматуру;
- зробити фундамент потужнішим.
Ми не будуємо другий будинок. Ми робимо існуючий будинок сильнішим.
Приклад із сонячною енергетикою
Є сонячна система з одним інвертором потужністю 5 кВт.
Якщо потрібно отримувати більше потужності, вертикальний підхід може виглядати як заміна його на інвертор на 10 кВт.
Було:
5 кВт → 1 інвертор
Стало:
10 кВт → 1 потужніший інвертор
Те саме можна зробити з батареєю: замість акумулятора на 5 кВт·год встановити більший, наприклад на 10 кВт·год.
Горизонтальне масштабування
Горизонтальне масштабування (scale out) працює інакше.
Замість того щоб робити один компонент потужнішим, ми додаємо нові компоненти.
Наприклад, один сервер уже працює на межі можливостей.
Замість переходу з 4 CPU на 16 CPU можна поставити ще три такі самі сервери.
Було:
[ Server ]
Стає:
[ Server ] [ Server ] [ Server ] [ Server ]
Кожен сервер окремо може бути не дуже потужним, але разом вони можуть обробляти значно більше запитів.
Будівництво: другий будинок
Тут горизонтальне масштабування теж легко уявити.
Припустимо, одного будинку недостатньо для розміщення людей.
Вертикальний варіант:
побудувати будинок вище або зробити його більшим.
Горизонтальний:
побудувати ще один будинок.
Наприклад, замість одного великого складу на 10 000 м² можна мати два склади по 5 000 м².
Перевага такого підходу — якщо один об'єкт перестане працювати, інший може продовжити роботу.
Саме ця властивість дуже важлива в IT.
Сонячна енергетика: більше панелей чи потужніший інвертор?
Тут різницю можна побачити особливо добре.
Уявімо систему:
10 сонячних панелей × 500 Вт = 5 кВт
Якщо нам потрібно більше генерації, є два варіанти.
Вертикальний підхід
Встановити потужніші панелі.
Наприклад:
10 × 700 Вт = 7 кВт
Кількість панелей не змінилася, але кожна стала потужнішою.
Це аналог scale up.
Горизонтальний підхід
Залишити панелі по 500 Вт, але додати ще 4:
14 × 500 Вт = 7 кВт
Ми отримали приблизно ту саму встановлену потужність, але збільшили кількість елементів.
Це scale out.
Звичайно, у реальній сонячній системі все складніше: потрібно враховувати напругу стрингів, MPPT, максимальний струм інвертора, площу даху, орієнтацію панелей та інші обмеження.
Але сам принцип залишається тим самим.
IT: найочевидніший приклад
Уявімо сайт, який обслуговує 100 запитів на секунду.
Один сервер працює на 90% CPU.
Scale up
Ми беремо цей сервер і збільшуємо його потужність:
4 CPU → 16 CPU
Тепер один сервер може обробляти, наприклад, 400 запитів на секунду.
Перевага — архітектура залишається відносно простою.
Але є проблема: у конкретного сервера є фізична межа.
Не можна нескінченно збільшувати кількість CPU та RAM.
Scale out
Інший варіант — додати сервери.
Наприклад:
1 сервер × 100 запитів/с
перетворюється на:
4 сервери × 100 запитів/с = 400 запитів/с
Перед серверами встановлюється load balancer, який розподіляє запити між ними.
Наприклад:
┌── Server 1
│
Users → Load Balancer ── Server 2
│
├── Server 3
│
└── Server 4
Якщо навантаження зросте ще більше, можна додати нові сервери.
100 → 200 → 300 → 400 → 500 серверів...
У цьому і полягає головна сила горизонтального масштабування.
А що буде, якщо один сервер зламається?
Це одна з найважливіших відмінностей.
При вертикальному масштабуванні ми часто маємо одну велику точку відмови.
Users ↓ [ BIG SERVER ]
Якщо цей сервер вийде з ладу, вся система може перестати працювати.
При горизонтальному масштабуванні:
┌── Server 1
├── Server 2
Users → LB ──┼── Server 3
└── Server 4
Якщо Server 2 зламається, балансувальник може перестати направляти на нього трафік.
Інші сервери продовжать працювати.
Тому горизонтальне масштабування часто використовують не тільки для продуктивності, а й для відмовостійкості.
Але горизонтальне масштабування складніше
На перший погляд може здатися, що scale out завжди кращий.
Насправді ні.
Якщо у нас один сервер, програма може зберігати дані локально:
Application
↓
Local disk
Коли серверів стає десять, виникає питання:
де зберігати дані?
Якщо користувач завантажив файл на Server 1, а наступний запит потрапив на Server 7 — Server 7 повинен якось отримати цей файл.
Тому при горизонтальному масштабуванні часто доводиться додавати:
- load balancer;
- shared storage;
- окрему базу даних;
- кеш;
- черги повідомлень;
- механізми синхронізації;
- моніторинг;
- автоматичне масштабування.
Тобто ми отримуємо більше можливостей, але й більше архітектурної складності.
Чому не використовувати тільки горизонтальне масштабування?
Тому що не все можна просто розділити між декількома машинами.
Наприклад, база даних може бути складнішою для масштабування горизонтально, ніж вебсервер.
Якщо сайт має 20 серверів, це ще не означає, що можна так само легко поставити 20 копій бази даних і отримати 20-кратну продуктивність.
Тому реальні системи часто використовують обидва підходи одночасно.
Наприклад:
Load Balancer
↓
┌────────────┼────────────┐
↓ ↓ ↓
Server Server Server
└────────────┼────────────┘
↓
Database
↓
Storage
Спочатку можна збільшити потужність окремих серверів (scale up), а коли цього стає недостатньо — додавати нові сервери (scale out).
Найпростіша аналогія
Уявіть каси в супермаркеті.
Якщо одна каса не справляється з покупцями, є два варіанти.
Вертикальне масштабування:
зробити одну касу швидшою — поставити швидший сканер, автоматизувати оплату тощо.
Горизонтальне масштабування:
відкрити ще 5 кас.
У першому випадку ми покращуємо один ресурс.
У другому — збільшуємо кількість ресурсів.
Саме ця різниця лежить в основі понять scale up та scale out.
І хоча терміни найчастіше зустрічаються в IT, той самий принцип можна побачити буквально всюди: від серверів та баз даних до будинків, виробничих ліній і сонячних електростанцій.
Цейво!Відреагуй!
🧵
Цей допис поки що не має жодних доповнень від автора/ки.