Основы облачного масштабирования

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

Масштабируемость, согласно Википедии, — это свойство системы справляться с растущим объемом работы путем добавления ресурсов в систему. Другими словами, это способность системы увеличивать или уменьшать количество используемых ресурсов (оперативная память, процессор, пропускная способность сети, размер диска и т.д.) в зависимости от нагрузки — количества запросов в секунду, объема хранимых данных, вычислительной нагрузки и т.д.

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

Масштабирование монолитной системы

Этот тип системы существует уже довольно давно и является самым простым в реализации. Обычно приложение поставляется в виде исполняемого файла или набора скриптов, запускаемых сервером. Оно работает на физическом сервере или виртуальной машине, часто вместе с базой данных и обратным прокси-сервером типа Nginx. Таким образом, сетевые проблемы при взаимодействии компонентов сводятся к минимуму, а сама система может поставляться в виде шаблона виртуальной машины или даже в виде установочного диска.

Подход к масштабированию таких систем заключается в вертикальном масштабировании — когда у системы заканчиваются ресурсы, она перезапускается на более мощном сервере с большим количеством ресурсов.

Раньше это хорошо работало, когда производители выпускали компьютеры вдвое мощнее каждые шесть месяцев. Однако в последние десятилетия темпы выпуска компьютеров снизились, поскольку возможности микрочипов приблизились к физическому пределу. Поэтому сегодня более мощные компьютеры стоят намного дороже своих менее мощных аналогов. А удвоение мощности может увеличить стоимость в 5 или даже 10 раз.

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

Масштабирование распределенной системы

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

  • горизонтальное дублирование;
  • функциональная декомпозиция;
  • разбиение данных.

Давайте рассмотрим их подробнее.

Горизонтальное дублирование

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

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

Горизонтальное дублирование также помогает добиться повышения доступности сервиса. В случае если одна из реплик станет недоступной (сбой приложения из-за ошибки, сетевая проблема, нехватка ресурсов и OOM Killer), нагрузка будет распределена между оставшимися репликами, а балансировщик нагрузки предотвратит потерю данных.

Этот подход также называется горизонтальным масштабированием.

Функциональная декомпозиция

При функциональной декомпозиции функциональность системы разделяется на отдельные компоненты (например, микросервисы). Каждая область системы или часть функциональности выделяется в отдельный и независимый сервис.

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

Команды становятся более независимыми — они могут выбирать собственные технологии и инструменты разработки, собственные фреймворки командного взаимодействия (Scrum, Kanban и т.д.), наилучшим образом соответствующие характеру приложения и навыкам членов команды. При этом различные сервисы больше не зависят от общих частей приложения, библиотек или общей памяти. Они обмениваются данными явно через API, поэтому все, что связывает их друг с другом — это контракты синхронных и асинхронных сообщений.

Самое главное, функциональная декомпозиция позволяет каждому отдельному сервису масштабироваться в соответствии с его потребностями. В случае монолитной системы масштабируемость отдельного компонента очень ограничена. В случае распределенной системы один из компонентов может быть запущен на нескольких репликах, а другой — на более мощной машине.

Разбиение данных

Разбиение данных — это разделение хранимых данных на несколько отдельных частей. Например, данные, хранящиеся в одной базе данных, разбиваются на несколько экземпляров базы данных, а нахождение конкретной записи в конкретной базе данных определяется ключом разбиения.

Таким образом можно обойти ограничение хранения данных на диске — максимальный размер диска физически ограничен, и когда объем данных превышает его размер, разбиение позволяет разделить данные между несколькими дисками и таким образом хранить больше данных.

Другой возможностью разделения данных является распределение нагрузки по обработке запросов между несколькими базами данных. Как правило, база данных — это сложное приложение, которое потребляет достаточное количество процессора и оперативной памяти. По мере увеличения количества запросов или их сложности база данных потребляет все больше и больше ресурсов. Разделение данных позволяет иметь больше экземпляров базы данных, а значит, и больше вычислительных ресурсов, доступных для выполнения запросов.

Преимущество масштабирования в облаке

Облачные платформы, в отличие от «голого металла» или виртуальных машин, доступных в обычном хостинге, предлагают простой вариант управления инфраструктурой. Например, администратор может настроить облачную инфраструктуру через простой веб-интерфейс, или через приложение CLI, или через API.

Она также предоставляет широкий спектр возможностей для автоматизации управления инфраструктурой. От автоматизации рутинных задач с помощью простых сценариев с использованием CLI до реализации подхода «инфраструктура как код» с помощью таких инструментов, как Terraform.

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

В следующих статьях я расскажу о конкретных вариантах масштабирования облаков и научу вас самостоятельно настраивать автомасштабируемую систему.

Оцените статью
Procodings.ru
Добавить комментарий