Виртуальные машины (ВМ) являются основным строительным блоком облачной инфраструктуры — на них основаны все облачные продукты, такие как базы данных, оркестранты, очереди сообщений, функции и другие. Многие компании также используют виртуальные машины в качестве основы своего облачного ландшафта, запуская на них всевозможные сервисы и приложения.
В этой статье я расскажу о способах и подходах к масштабированию виртуальных машин.
Виртуальные машины дают пользователю больше возможностей и контроля над средой и приложениями, но требуют больших навыков и более атомарной настройки. Поэтому масштабирование системы на базе виртуальных машин менее гибкое, чем альтернативы, которые я буду обсуждать в других статьях. Как же настроить масштабирование виртуальных машин, чтобы, с одной стороны, увеличить использование ресурсов, а с другой — быть готовым к пикам нагрузки?
Существует несколько способов решения этой проблемы:
- ручное масштабирование;
- автоматическое масштабирование.
Давайте разберемся в этом подробнее.
Ручное масштабирование
При эксплуатации виртуальных машин может возникнуть ситуация, когда выделенных им ресурсов (CPU, RAM) становится недостаточно. Для решения проблемы выполняется ручное масштабирование — набор действий, которые администратор предпринимает для изменения количества системных ресурсов, обычно в сторону увеличения.
Но что именно вам нужно сделать? Существует два основных способа масштабирования в этом случае:
- вертикальное масштабирование — изменение ресурсов одной машины;
- горизонтальное масштабирование — изменение количества машин без изменения их конфигурации.
Вертикальное масштабирование
При вертикальном масштабировании можно изменить основные ресурсы машины — процессор и оперативную память. Обычно это требует остановки и последующего перезапуска виртуальной машины. Также можно изменить размер виртуального диска, подключенного к машине, но в этом случае необходимо внести изменения и в файловую систему.
Вертикальное масштабирование широко используется для систем с непереносимостью разделов (CA), которые могут работать только в одном экземпляре. Примерами таких систем являются классические базы данных, такие как PostgreSQL и MySQL, а также приложения, основанные на монолитной архитектуре.
Это самое простое решение при масштабировании, поскольку оно не требует внесения изменений в приложения. Это первое, к чему следует прибегнуть, когда системе не хватает ресурсов.
Однако стоимость сервера растет нелинейно по мере увеличения ресурсов, поэтому в определенный момент этот тип масштабирования становится слишком дорогим. Если вам необходимо дальнейшее масштабирование системы, вам подойдет горизонтальное масштабирование.
Горизонтальное масштабирование
Этот тип масштабирования предполагает, что при изменении нагрузки пропорционально изменяется количество серверов, обрабатывающих эту нагрузку, в то время как конфигурация машин остается неизменной. Для этого можно либо просто создать дополнительные машины вручную, либо создать их как часть неуправляемой группы экземпляров.
В первом случае администратор отвечает за создание и настройку новой виртуальной машины и ввод ее в эксплуатацию. Использование группы экземпляров, с другой стороны, несколько упрощает этот процесс, поскольку машина создается на основе шаблона с фиксированной конфигурацией. Однако, независимо от способа создания новых машин, разработка горизонтально масштабируемой системы имеет ряд сложностей:
- приложение должно поддерживать несколько параллельно работающих копий;
- инфраструктура должна быть способна доставлять данные во все реплики;
- инфраструктура должна стремиться к равномерному распределению нагрузки.
Рассмотрение этих сложностей заслуживает отдельной статьи, но современные системы развиваются в этом направлении.
Однако ручные изменения могут привести к несвоевременной реакции на изменение нагрузки. Вы можете пропустить момент увеличения нагрузки и, таким образом, потерять часть запросов или данных, что может привести к серьезным убыткам для бизнеса. С другой стороны, снижение нагрузки также может остаться незамеченным, в результате чего приобретенные серверы будут простаивать без нагрузки.
Чтобы сделать систему более самодостаточной и способной быстро реагировать на изменение нагрузки, стоит воспользоваться преимуществами автоматического масштабирования.
Автоматическое масштабирование
Автоматическое масштабирование предполагает запуск виртуальных машин в рамках управляемой группы экземпляров. Такая группа самостоятельно отслеживает состояние машин в группе и распределение нагрузки на них. При изменении нагрузки группа принимает решение о добавлении или удалении машин из группы.
Критерии, на основании которых группа принимает решение о масштабировании, являются гибкими. Например, это могут быть:
- порог загрузки процессора в процентах;
- количество http-запросов на машину;
- количество сообщений в очереди на машину;
- настраиваемые метрики, основанные на данных мониторинга.
Такие опции позволяют осуществлять гибкое автомасштабирование в зависимости от сценариев обработки данных в конкретной системе. Кроме того, многие поставщики предлагают инструменты прогнозируемого масштабирования на основе аналитики или машинного обучения. Такие инструменты учатся на основе реальных сценариев использования машин и изменения нагрузки и оптимизируют масштабирование таким образом, чтобы повысить эффективность использования ресурсов.
Группа управляемых экземпляров
Для управления парком машин создается группа управляемых экземпляров с заданными параметрами. Часто эти параметры включают:
- местоположение (регион и зона или зоны);
- настройки масштабирования (тип и параметры);
- сетевые настройки;
- шаблон виртуальной машины.
Шаблон должен запускать службу при запуске виртуальной машины, чтобы она запускалась сама и при необходимости настраивалась (например, с помощью обнаружения службы). Это необходимо для того, чтобы при автоматическом добавлении экземпляров в группу они запускались автоматически. Я обычно использую для этого systemd, но облачный init тоже подойдет.
Что касается настроек масштабирования, вы выбираете тип и параметры, а также минимальное и максимальное количество машин в группе.
При низкой нагрузке количество экземпляров будет автоматически уменьшаться, пока не достигнет минимального числа. Это число будет сохраняться до тех пор, пока нагрузка снова не превысит пороговое значение.
С другой стороны, при высокой нагрузке количество машин может достичь максимума, после чего новые машины перестанут добавляться независимо от того, как система справляется с нагрузкой.
При создании группы экземпляров важно убедиться, что квоты и ограничения позволяют создать необходимое количество машин и выделить им необходимое количество сетевых адресов.
Обратите внимание, что каждая машина в группе будет иметь свой IP-адрес. Для сетевого взаимодействия с группой экземпляров используются балансировщики нагрузки, о которых я расскажу в следующей статье.
Как настроить группу экземпляров в Google Cloud
Чтобы создать управляемую группу экземпляров в GCP, необходимо сначала создать шаблон виртуальной машины с приложением. Для этого просто создайте обычную виртуальную машину в Google Compute Engine на базе выбранной вами операционной системы. В моем примере я создал виртуальную машину на базе Debian и установил приложение cpuburn, которое я буду использовать для эмуляции загрузки процессора.
Чтобы приложение автоматически запускалось при запуске виртуальной машины, необходимо настроить службу, в моем примере по адресу /etc/systemd/system/cloud-scaling.service
.
[Unit]
Description=Cloud Scaling Example
[Service]
ExecStart=+${PWD}/cpuburn-web -p 80
[Install]
WantedBy=multi-user.target
И запустить.
sudo systemctl daemon-reload
sudo systemctl enable --now cloud-scaling
Затем виртуальную машину необходимо остановить, чтобы создать образ на основе ее диска.
Далее перейдите в раздел Instance templates и создайте новый. Вам также необходимо включить HTTP-трафик в настройках брандмауэра.
Измените загрузочный диск на образ, который вы только что создали.
Теперь у нас есть все необходимое для создания группы экземпляров на основе этого шаблона.
Укажите минимальное и максимальное количество машин в группе, добавьте один или несколько критериев автомасштабирования.
После создания группы будет запущена одна виртуальная машина, соответствующая минимальному количеству.
Давайте сожжем немного процессора! Я запущу на узле приложение cpuburn и посмотрю, что произойдет дальше.
На вкладке мониторинга видна динамика добавления виртуальных машин, а также изменения в общей загрузке процессора — при запуске cpuburn она резко подскочила, но после добавления новых машин (и, соответственно, новых ресурсов) снова упала.
После отключения cpuburn группа экземпляров через некоторое время удаляет неиспользуемые машины…
…снова возвращаясь к минимальному количеству.
Снова взглянув на метрики, мы можем увидеть историю изменения количества виртуальных машин в группе.
С помощью этих простых шагов вы можете настроить отказоустойчивую систему, способную выдерживать большие скачки нагрузки. Гибкость критериев масштабирования позволяет подстраиваться под различные сценарии использования и различные типы входных данных.
Однако низкая скорость создания и удаления экземпляров делает этот инструмент неудобным для систем с резкими скачками нагрузки, требующих обработки максимального количества запросов. Для таких задач лучше подходят другие облачные продукты, о которых я расскажу в следующих статьях.