← Назад к вопросам
Что такое вертикальное масштабирование?
2.3 Middle🔥 161 комментариев
#Архитектура и паттерны#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое вертикальное масштабирование
Краткий ответ
Вертикальное масштабирование (scale-up) — это увеличение мощности одного сервера путём добавления ресурсов: процессоров, памяти, дискового пространства. Это контрастирует с горизонтальным масштабированием, которое добавляет новые серверы.
Вертикальное масштабирование
Один сервер, но мощнее:
ДО: ПОСЛЕ:
┌──────────┐ ┌─────────────┐
│ 8 CPU │ → │ 32 CPU │
│ 16 GB │ │ 128 GB │
│ 500 GB │ │ 2 TB │
└──────────┘ └─────────────┘
Пример:
// AWS: t3.small → t3.xlarge
// t3.small: 2 CPU, 2 GB RAM
// t3.xlarge: 4 CPU, 16 GB RAM
// Azure: B1s → D4s
// B1s: 1 CPU, 1 GB RAM
// D4s: 4 CPU, 16 GB RAM
Горизонтальное масштабирование
Много серверов, каждый такой же:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 4 CPU │ │ 4 CPU │ │ 4 CPU │
│ 8 GB │ │ 8 GB │ │ 8 GB │
│ 100 GB │ │ 100 GB │ │ 100 GB │
└──────────┘ └──────────┘ └──────────┘
↓ ↓ ↓
Load Balancer
Преимущества вертикального масштабирования
1. Простота реализации
// Просто перезагрузить сервер с большей конфигурацией
// Нет необходимости менять код приложения
// Приложение работает так же, но на более мощном оборудовании
const server = express();
server.listen(3000); // Код не меняется!
Нет нужно в:
- Балансировщике нагрузки
- Синхронизации состояния между серверами
- Кластеризации приложения
2. Нет проблем с консистентностью
// Вертикально масштабированный сервер:
// - Одна база данных
// - Одна кэширование (Redis)
// - Нет расстояния между компонентами (низкая latency)
// - Одна транзакция = атомарность
const transaction = await db.transaction();
try {
await transaction.update('users', { ... });
await transaction.update('orders', { ... });
await transaction.commit();
} catch (err) {
await transaction.rollback();
}
// ACID гарантирован на одном сервере
3. Проще с базой данных
// На вертикально масштабированном сервере:
// - Одна БД инстанс
// - Никаких проблем с репликацией
// - JOIN работают быстро
// - Транзакции просты
const result = await db.query(`
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
`);
Недостатки вертикального масштабирования
1. Физические ограничения
Больше всего мощности можно купить на одном сервере:
- Максимум CPU на современном сервере: ~128 cores
- Максимум RAM: ~4 TB
- Диск: можно расширить, но есть ограничения
Горизонтально можно расширяться бесконечно:
- 100 серверов по 4 CPU = 400 CPU
- 1000 серверов = 4000 CPU
2. Downtime при переходе
// Нужно перезагрузить сервер
// Приложение будет недоступно
// До масштабирования:
// 1. Остановить приложение
// 2. Отключить старый сервер
// 3. Запустить новый сервер (большей мощности)
// 4. Восстановить приложение
// 5. Время downtime: 5-30 минут
// Горизонтальное масштабирование:
// Добавить новый сервер БЕЗ downtime
// Балансировщик направляет трафик на оба
3. Стоимость растёт нелинейно
Стоимость оборудования:
1 CPU → $100
2 CPU → $200 (линейно)
8 CPU → $1200 (нелинейно! премиум)
32 CPU → $8000 (очень дорого!)
А горизонтально:
8 серверов по 1 CPU = $800 (дешевле)
4. Одна точка отказа
// Если сервер упадёт, всё упадёт
// Высокая доступность требует:
// - Резервного сервера (failover)
// - Балансировщика нагрузки
// - Репликации всех данных
// Горизонтальное масштабирование:
// Если упадёт один из 10 серверов, 90% трафика на других
Когда использовать вертикальное масштабирование
1. Маленький проект (стартап)
// 10-100 одновременных пользователей
// Один Node.js сервер на t3.small вполне подойдёт
const app = express();
app.listen(3000);
// Когда понадобится больше мощности:
// Просто купи t3.medium вместо t3.small
2. Приложения с состоянием (stateful)
// Кэш в памяти (in-memory store)
const cache = new Map();
app.get('/api/data', (req, res) => {
if (cache.has(req.query.id)) {
return res.json(cache.get(req.query.id));
}
// ...
});
// На одном сервере это просто
// На нескольких серверах нужно синхронизировать кэш (Redis)
3. Приложения с тяжёлыми вычислениями
// Machine Learning, обработка видео, сложные расчёты
// Требует много CPU и RAM
const computeExpensive = (data) => {
// O(n^3) алгоритм
// Нужно многоядерным процессором
// Легче вертикально масштабировать
};
// Горизонтально это сложнее
// Нужна система очередей и распределённые вычисления
4. Базы данных
// PostgreSQL, MySQL на одном сервере
// Вертикальное масштабирование проще
// Горизонтально (sharding, replicas):
// - Сложнее реализовать
// - Нужны специальные инструменты
// - JOIN'ы между shards проблемны
Примеры в Node.js
Пример 1: Worker threads для использования всех CPU
const { Worker } = require('worker_threads');
const os = require('os');
// Одного потока на каждый процессор
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
const worker = new Worker('./worker.js');
worker.on('message', (result) => {
console.log('Result:', result);
});
}
// Вертикально масштабированный сервер с 8 CPU
// Теперь может использовать все 8 ядер вместо одного!
Пример 2: Увеличение лимитов памяти
// На t3.small (2 GB RAM)
// Node.js может использовать ~1.4 GB по умолчанию
// Запуск с большей памятью
// node --max-old-space-size=1500 app.js
// На t3.xlarge (16 GB RAM)
// node --max-old-space-size=12000 app.js
Сравнение стратегий
Вертикальное масштабирование:
✓ Просто реализовать
✓ Нет проблем с консистентностью
✓ Низкая latency
✗ Дорого для больших нагрузок
✗ Есть физические ограничения
✗ Downtime при переходе
✗ Одна точка отказа
Горизонтальное масштабирование:
✓ Нет физических ограничений
✓ Высокая доступность
✓ Дешевле для больших нагрузок
✗ Сложнее реализовать
✗ Проблемы с консистентностью
✗ Нужны инструменты (load balancer, etc)
Вывод
- Вертикальное масштабирование = более мощный один сервер
- Подходит для: маленьких проектов, stateful приложений, БД
- Ограничено: физическими пределами, стоимостью, downtime
- Обычно стартуют с вертикального, потом переходят на горизонтальное