Вертикальне масштабування (scale up) - зробити сервер потужнішим: більше процесорів, пам'яті, швидші диски.
Горизонтальне (scale out) - додати ще сервери й розподілити навантаження між ними.
| Вертикальне | Горизонтальне | |
|---|---|---|
| зміни в коді | майже не потрібні | застосунок має бути готовим |
| межа | найпотужніший доступний сервер | практично немає |
| відмовостійкість | одна точка відмови | відмова одного сервера не зупиняє систему |
| вартість | дорожчає нелінійно | лінійна, дешеві сервери |
| складність | низька | балансувальник, спільний стан, деплой на кілька машин |
Почати варто з вертикального. Сучасний сервер з 32 ядрами й 128 ГБ пам'яті витримує дуже багато - для більшості Laravel-проєктів це роки росту без зміни архітектури. Передчасне горизонтальне масштабування додає складність без потреби.
Горизонтальне потрібне, коли:
- вертикальне вперлося в межу чи стало непропорційно дорогим;
- потрібна відмовостійкість - навіть невеликий сервіс з вимогою «працювати під час оновлення сервера» потребує щонайменше двох екземплярів;
- навантаження стрибкоподібне (розпродажі, пікові години) - простіше додати й прибрати сервери.
Що треба зробити в застосунку, щоб масштабуватися горизонтально - прибрати стан з окремого сервера:
- сесії - у Redis чи базі, а не у файлах;
- завантажені файли - в S3/R2, а не на локальний диск;
- кеш і блокування - у спільному Redis;
- черги - Redis/SQS, воркери на окремих машинах;
- планувальник - запуск на одному сервері (
onOneServer()).
Різні шари масштабуються по-різному: вебсервери горизонтально прості (вони без стану), а база даних - найскладніша частина: її зазвичай спершу масштабують вертикально, потім репліками для читання, і лише в крайньому разі - шардингом.