Поделиться через


Устойчивость платформы Azure

Совет

Это содержимое является фрагментом из электронной книги, архитектора облачных собственных приложений .NET для Azure, доступных в .NET Docs или в виде бесплатного скачиваемого PDF-файла, который можно прочитать в автономном режиме.

Эскиз эскиза обложки для приложений Azure eBook в машинном коде .NET.

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

Таким образом, надежные облачные приложения отображают уникальные характеристики:

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

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

Проектирование с устойчивостью

Мы сказали, что устойчивость позволяет приложению реагировать на сбои и по-прежнему оставаться функциональными. Технический документ, устойчивость в техническом документе Azure, предоставляет рекомендации по достижению устойчивости на платформе Azure. Ниже приведены некоторые ключевые рекомендации.

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

  • Сбой центра обработки данных. Создайте избыточность в приложении с зонами изоляции сбоя в центрах обработки данных. Например, убедитесь, что виртуальные машины Azure размещены в разных центрах обработки данных, изолированных от сбоя, с помощью Azure Зоны доступности.

  • Региональный сбой. Реплицируйте данные и компоненты в другой регион, чтобы приложения можно было быстро восстановить. Например, используйте Azure Site Recovery для репликации виртуальных машин Azure в другой регион Azure.

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

  • Случайное удаление или повреждение данных. Резервное копирование данных, чтобы его можно было восстановить, если есть какие-либо удаления или повреждения. Например, используйте Azure Backup для периодического резервного копирования виртуальных машин Azure.

Проектирование с избыточностью

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

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

Чтобы создать избыточность, необходимо определить критически важные пути в приложении, а затем определить, есть ли избыточность в каждой точке пути? Если подсистема должна завершиться ошибкой, отработка отказа приложения на что-то другое? Наконец, вам потребуется четкое понимание этих функций, встроенных в облачную платформу Azure, которую можно использовать для удовлетворения требований к избыточности. Ниже приведены рекомендации по проектированию избыточности:

  • Развертывайте несколько экземпляров служб. Если приложение зависит от одного экземпляра службы, создается единая точка отказа. Подготовка нескольких экземпляров улучшает как отказоустойчивость, так и масштабируемость. При размещении в Служба Azure Kubernetes можно декларативно настроить избыточные экземпляры (наборы реплик) в файле манифеста Kubernetes. Значение счетчика реплик можно управлять программным способом, на портале или с помощью функций автомасштабирования.

  • Использование подсистемы балансировки нагрузки. Балансировка нагрузки распределяет запросы приложения в здоровые экземпляры служб и автоматически удаляет неработоспособные экземпляры из смены. При развертывании в Kubernetes балансировку нагрузки можно указать в файле манифеста Kubernetes в разделе "Службы".

  • Планирование многорегионного развертывания. Если вы развертываете приложение в одном регионе, а этот регион становится недоступным, приложение также станет недоступным. Это может быть неприемлемо в соответствии с условиями соглашений об уровне обслуживания вашего приложения. Вместо этого рассмотрите возможность развертывания приложения и его служб в нескольких регионах. Например, кластер Служба Azure Kubernetes (AKS) развертывается в одном регионе. Чтобы защитить систему от регионального сбоя, вы можете развернуть приложение в нескольких кластерах AKS в разных регионах и использовать функцию "Парные регионы " для координации обновлений платформы и приоритетов усилий по восстановлению.

  • Включите георепликацию. Георепликация для таких служб, как База данных SQL Azure и Cosmos DB, создаст вторичные реплики данных в нескольких регионах. Хотя обе службы автоматически реплицируют данные в одном регионе, георепликация защищает вас от регионального сбоя, позволяя выполнить отработку отказа в дополнительный регион. Еще одна рекомендация для центров георепликации вокруг хранения образов контейнеров. Чтобы развернуть службу в AKS, необходимо сохранить и извлечь образ из репозитория. Реестр контейнеров Azure интегрируется с AKS и может безопасно хранить образы контейнеров. Чтобы повысить производительность и доступность, рассмотрите возможность георепликации образов в реестр в каждом регионе, где есть кластер AKS. Затем каждый кластер AKS извлекает образы контейнеров из локального реестра контейнеров в своем регионе, как показано на рис. 6-4.

Реплицированные ресурсы в разных регионах

Рис. 6-4. Реплицированные ресурсы в разных регионах

  • Реализуйте подсистему балансировки нагрузки трафика DNS. Диспетчер трафика Azure обеспечивает высокий уровень доступности критически важных приложений путем балансировки нагрузки на уровне DNS. Он может направлять трафик в разные регионы на основе географического региона, времени отклика кластера и даже работоспособности конечной точки приложения. Например, Диспетчер трафика Azure могут направлять клиентов в ближайший кластер AKS и экземпляр приложения. Если у вас несколько кластеров AKS в разных регионах, используйте Диспетчер трафика для управления потоком трафика к приложениям, работающим в каждом кластере. На рисунке 6–5 показан этот сценарий.

AKS и Диспетчер трафика Azure

Рис. 6-5. AKS и Диспетчер трафика Azure

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

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

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

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

  • Благоприястить к горизонтальному масштабированию. Облачные приложения предпочитают масштабировать ресурсы в отличие от масштабирования. Масштабирование (также известное как горизонтальное масштабирование) включает добавление дополнительных ресурсов службы в существующую систему для удовлетворения и предоставления общего доступа к требуемому уровню производительности. Масштабирование (также известное как вертикальное масштабирование) включает замену существующих ресурсов более мощным оборудованием (больше дисков, памяти и ядер обработки). Масштабирование можно вызывать автоматически с помощью функций автомасштабирования, доступных в некоторых облачных ресурсах Azure. Масштабирование между несколькими ресурсами также добавляет избыточность к общей системе. Наконец, масштабирование одного ресурса обычно дороже, чем масштабирование между многими небольшими ресурсами. На рисунке 6-6 показаны два подхода:

Масштабирование и горизонтальное масштабирование

Рис. 6-6. Масштабирование и горизонтальное масштабирование

  • Масштаб пропорционально. При масштабировании службы думайте о наборах ресурсов. Если бы вы резко масштабировали определенную службу, какие последствия будут влиять на внутренние хранилища данных, кэши и зависимые службы? Некоторые ресурсы, такие как Cosmos DB, могут масштабироваться пропорционально, в то время как многие другие не могут. Вы хотите убедиться, что вы не масштабируйте ресурс до точки, в которой будут исчерпаны другие связанные ресурсы.

  • Избегайте сходства. Рекомендуется убедиться, что узел не требует локального сопоставления, часто называемого липким сеансом. Запрос должен иметь возможность направляться в любой экземпляр. Если необходимо сохранить состояние, его следует сохранить в распределенном кэше, например кэш Redis Azure.

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

  • Горизонтальное масштабирование. Последняя практика будет в том, чтобы масштабировать агрессивно, чтобы вы могли быстро встретить немедленные пики трафика, не теряя бизнес. А затем масштабируйте (то есть удалите ненужные экземпляры) консервативно, чтобы обеспечить стабильную систему. Простой способ реализации заключается в том, чтобы задать период охлаждения, который является временем ожидания между операциями масштабирования, до пяти минут для добавления ресурсов и до 15 минут для удаления экземпляров.

Встроенная повторная попытка в службах

Мы рекомендуем реализовать программные операции повторных попыток в предыдущем разделе. Помните, что многие службы Azure и соответствующие клиентские пакеты SDK также включают механизмы повторных попыток. В следующем списке перечислены функции повторных попыток во многих службах Azure, которые рассматриваются в этой книге:

  • Azure Cosmos DB. Класс DocumentClient из клиентского API автоматически повторяет неудачные попытки. Количество повторных попыток и максимальное время ожидания настраиваются. Исключения, создаваемые клиентским API, — это запросы, превышающие политику повторных попыток или не временные ошибки.

  • Кэш Redis для Azure. Клиент Redis StackExchange использует класс диспетчера соединений, включающий повторные попытки при неудачных попытках. Количество повторных попыток, определенная политика повторных попыток и время ожидания настраиваются.

  • Служебная шина Azure. Клиент служебная шина предоставляет класс RetryPolicy, который можно настроить с помощью интервала отката, счетчика повторных попыток иTerminationTimeBuffer, что указывает максимальное время, которое может занять операцию. Политика по умолчанию — девять попыток повторных попыток с периодом отката в 30 секунд между попытками.

  • База данных SQL Azure. Поддержка повторных попыток предоставляется при использовании библиотеки Entity Framework Core .

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

  • . Клиентская библиотека Концентратора событий содержит свойство RetryPolicy, которое включает настраиваемую функцию экспоненциального отката.