← Назад к вопросам

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

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
  • Обычно стартуют с вертикального, потом переходят на горизонтальное
Что такое вертикальное масштабирование? | PrepBro