# Масштабирование и автомасштабирование приложения на Node.js

Source: https://support.kapsulehost.com/ru-ru/site-scaling-and-autoscale

Автоматическое масштабирование увеличивает и уменьшает количество экземпляров, на которых работает ваше приложение Node.js, в зависимости от изменения нагрузки на CPU, поэтому загруженные периоды получают больше ресурсов, а спокойные периоды обходятся дешевле. В этом руководстве описана вкладка KPanel, каждая настройка, что подлежит оплате и как сделать приложение безопасным для масштабирования.

## Где находится масштабирование в KPanel

1. Войдите в [KPanel](https://kpanel.kapsulehost.com).
2. Нажмите **Веб-сайты** в левой боковой панели, затем нажмите на сайт.
3. В левом меню сайта откройте **Производительность**, затем **Масштабирование**.

Прямой адрес: `/websites/<site-id>/autoscale`. Старый адрес `/websites/<site-id>/scaling` по-прежнему работает и перенаправляет на ту же страницу.

![Настройки автоматического масштабирования для приложения Node.js в KPanel](https://support.kapsulehost.com/help/screenshots/site-scaling-and-autoscale.a7af79de.webp)

> **Note:** Эта вкладка отображается только для сайтов на Node.js. Она не появится в меню для сайтов на WordPress, WooCommerce, статических сайтов, а также сайтов на PHP, Python или Ruby, поскольку механизм масштабирует именно кластер процессов Node.js.

## Одна вкладка, одна конфигурация

Раньше в KPanel здесь было две вкладки, **Масштабирование** и **Автомасштабирование**, относящиеся к одному и тому же набору настроек. Это были два представления одной и той же конфигурации, что только запутывало, поэтому теперь есть единая вкладка **Масштабирование**: текущее состояние, настройки, недавние события масштабирования и панель использования и затрат за текущий расчётный период, всё в одном месте.

## Как это работает

Ваше приложение работает как кластер процессов. Автоматическое масштабирование отслеживает среднюю нагрузку CPU по всем работающим экземплярам и добавляет или удаляет экземпляры в соответствии с заданными вами пороговыми значениями.

Требуется режим кластера. Если ваше приложение ещё не работает в режиме кластера, включение автоматического масштабирования переключает его автоматически, что связано с кратковременным перезапуском. Страница сообщает, когда это происходит.

## Чтение текущего состояния

Карточка состояния показывает три параметра:

- **Instances**: сколько экземпляров работает прямо сейчас.
- **Средний CPU**: средняя загрузка CPU по этим экземплярам.
- **Cluster**: работает ли приложение в режиме кластера. Если указано "нет", включение автоматического масштабирования переключит его.

Если приложение вообще не запущено, карточка сообщает об этом вместо отображения нулей.

Вкладка также показывает **Последнее масштабирование**, время последнего события масштабирования, или **никогда**.

## Настройки

| Настройка | Диапазон | Что он делает |
|---|---|---|
| Min instances (Минимум экземпляров) | от 1 до 16 | Нижний предел. Никогда не масштабируется ниже этого значения |
| Max instances (Максимум экземпляров) | от 1 до 16 | Верхний предел. Никогда не масштабируется выше этого значения |
| Scale up at CPU % (Масштабировать вверх при CPU %) | от 5 до 99 | Средняя загрузка CPU выше этого значения добавляет экземпляр |
| Scale down at CPU % (Масштабировать вниз при CPU %) | от 1 до 95 | Средняя загрузка CPU ниже этого значения удаляет один экземпляр |
| Cooldown (sec) (Период охлаждения (сек)) | от 30 до 3600 | Минимальное время ожидания между действиями масштабирования |

Главный переключатель находится в заголовке карточки настроек. Когда автоматическое масштабирование выключено, настройки затемнены, и ваше приложение остаётся на текущем количестве экземпляров.

Разумные начальные значения:

- **Минимум экземпляров: 1 или 2.** Два, если вы не можете допустить, чтобы перезапуск одного экземпляра привёл к недоступности приложения.
- **Максимум экземпляров** на уровне того, за что вы готовы платить в пиковые нагрузки, а не на уровне предельного значения.
- **Масштабирование вверх около 70 процентов.** Достаточно высоко, чтобы не платить за резерв, который вы никогда не используете, и достаточно низко, чтобы было время добавить мощности до того, как запросы начнут выстраиваться в очередь.
- **Масштабирование вниз около 30 процентов.** Оставьте широкий разрыв между двумя порогами.
- **Период охлаждения в несколько минут.** Это самая недооценённая настройка.

> **Warning:** Если установить оба порога CPU слишком близко друг к другу, возникает "дребезг": кластер масштабируется вверх, тут же опускается ниже порога масштабирования вниз, потому что нагрузка теперь распределена шире, масштабируется вниз, снова подскакивает, и всё повторяется. Оставляйте широкий разрыв и используйте достаточный период охлаждения. Дребезг обходится дорого и дестабилизирует приложение.

## События масштабирования

На вкладке перечислены недавние события масштабирования, сначала самые новые, с указанием направления, количества экземпляров до и после, показания CPU, которое его вызвало, и времени.

Этот журнал стоит изучить, если приложение вело себя некорректно. Серия событий масштабирования вверх и вниз за несколько минут означает, что ваши пороги слишком близки друг к другу или период охлаждения слишком короткий. Однократное масштабирование вверх, которое так и не вернулось вниз, означает, что нагрузка оставалась высокой, что является вопросом ёмкости, а не конфигурации. Полное отсутствие событий, когда вы их ожидали, означает, что либо CPU никогда не пересекал порог, либо автоматическое масштабирование выключено.

## Сколько стоит автоматическое масштабирование

Экземпляры сверх базового выделения вашего тарифного плана учитываются и оплачиваются посекундно. Вкладка показывает за текущий период:

- **Использованное время экземпляра** в часах и минутах, с указанием исходных секунд экземпляра под ним.
- **Потрачено на данный момент** за этот период.
- **Прогноз на конец месяца**, экстраполированный на основе текущего использования.
- **Tracking**, сколько окон использования было оплачено из общего зафиксированного количества.
- **Прогресс периода**, количество прошедших дней из дней в месяце.

Посекундная ставка указана в верхней части той же панели, так что цифра, по которой вам выставляют счёт, всегда видна рядом с относящимся к ней использованием.

> **Tip:** Прогноз, это та цифра, за которой стоит следить. Он экстраполируется на основе уже использованного объёма, поэтому необычно загруженная неделя в начале месяца завысит его. Проверьте его через несколько дней, затем снова в середине месяца, прежде чем делать выводы. Если он выше, чем вам хотелось бы, снижайте максимальное количество экземпляров, а не повышайте порог масштабирования вверх: предельное значение, это жёсткое ограничение, а порог, лишь подсказка.

Масштабирование до минимума останавливает учёт. Если вы полностью отключите автоматическое масштабирование, приложение останется на том количестве экземпляров, которое у него есть на данный момент, поэтому сначала верните его к минимуму, если причина отключения, стоимость.

## Как сделать приложение безопасным для масштабирования

На странице есть предупреждение, и это самое важное, что на ней есть: ваше приложение Node.js должно быть безопасным для кластера, чтобы корректно масштабироваться между экземплярами.

На практике это означает:

**Никакого состояния сессии в памяти.** Если сессия вошедшего пользователя хранится в памяти одного экземпляра, пользователь будет выходить из системы каждый раз, когда запрос попадает на другой экземпляр. Перенесите сессии в общее хранилище.

**Никакого кеша в памяти, на который вы полагаетесь для корректности работы.** У каждого экземпляра свой собственный кеш. Кеш, который должен быть согласованным, должен быть общим.

**Никакой записи на локальную файловую систему, которую вы рассчитываете потом прочитать.** Файлы, загруженные на локальный диск одним экземпляром, невидимы для остальных. Пишите в общее хранилище.

**Никакой незащищённой запланированной работы.** Если таймер работает внутри приложения, его выполняет каждый экземпляр, поэтому ночное задание при четырёх экземплярах выполнится четыре раза. Перенесите запланированную работу в cron-задание или защитите её блокировкой. См. [Задания cron](https://support.kapsulehost.com/ru-ru/cron-jobs).

**Никаких предположений о стабильности количества экземпляров.** Всё, что распределяет работу по индексу экземпляра, ломается в момент изменения их количества.

Если что-то из этого применимо к вашему приложению, исправьте это перед включением автоматического масштабирования. Приложение, не безопасное для кластера, даёт сбои непредсказуемо и их трудно воспроизвести, поскольку они зависят от того, какой экземпляр обработал какой запрос.

## Устранение неполадок

**Переключатель не включается.** Для включения требуется право на запись для сайта. При роли "только для чтения" элементы управления отключены.

**Приложение перезапустилось при включении автоматического масштабирования.** Ожидаемое поведение. Переключение в режим кластера требует перезапуска, и это происходит один раз.

**Пользователи выходят из системы случайным образом.** Классический симптом отсутствия безопасности для кластера. Сессии находятся в памяти, а запросы попадают на разные экземпляры.

**Экземпляры масштабировались вверх и так и не уменьшились.** Либо нагрузка оставалась выше порога масштабирования вниз, либо что-то удерживает загрузку CPU высокой независимо от трафика. Проверьте список событий и посмотрите, что на самом деле делает приложение.

**Запланированное задание выполнилось несколько раз.** Его выполнил каждый экземпляр. Перенесите его в cron-задание или добавьте блокировку.

**Ничего не масштабируется.** Убедитесь, что переключатель включён, приложение работает и режим кластера активен. Затем проверьте по списку событий, действительно ли CPU пересекал ваш порог масштабирования вверх.

**Стоимость выше ожидаемой.** Посмотрите список событий на предмет дребезга, затем снизьте максимальное количество экземпляров.

## Похожие страницы

- [Производительность сайта и APM](https://support.kapsulehost.com/ru-ru/site-performance), чтобы узнать, действительно ли CPU является узким местом.
- [Мониторинг доступности сайта](https://support.kapsulehost.com/ru-ru/site-uptime-monitoring), чтобы убедиться, что масштабирование действительно повышает доступность.
- [Задания cron](https://support.kapsulehost.com/ru-ru/cron-jobs) для запланированной работы, которая должна выполняться ровно один раз.
- [Изменение размера облачного сервера](https://support.kapsulehost.com/ru-ru/cloud-servers-resize), если вам нужна более мощная машина, а не больше экземпляров.
