Настройка отказоустойчивой архитектуры в Yandex Cloud
С помощью этой инструкции вы настроите отказоустойчивую архитектуру в Yandex Cloud и проверите ее работу на различных тестовых сценариях.
Отказоустойчивость — это свойство системы сохранять свою работоспособность после отказа одной или нескольких ее составных частей.
Чтобы настроить и протестировать архитектуру:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки отказоустойчивой архитектуры Yandex Cloud входит:
- Плата за диски и постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud).
- Плата за постоянно запущенный кластер Yandex Managed Service for PostgreSQL (см. тарифы Managed Service for PostgreSQL).
- Плата за использование динамического или статического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Настройте тестовый стенд
Описание тестового стенда:
-
Приложение упаковано в Docker-образ и загружено в Yandex Container Registry.
Docker-образы развернуты на четырех ВМ на основе Container Optimized Image. ВМ объединены в группу и расположены в двух различных зонах доступности.
-
Кластер БД работает под управлением сервиса Managed Service for PostgreSQL и состоит из двух хостов, расположенных в различных зонах доступности.
-
Нагрузка генерируется приложением Load Testing Tool из Yandex Cloud Marketplace и подается на Yandex Network Load Balancer. Сетевой балансировщик нагрузки распределяет трафик по ВМ.
Подготовьте контейнеры приложения TodoList
Чтобы подготовить приложение для запуска в Yandex Cloud:
-
Скачайте и распакуйте репозиторий
с исходным кодом демо-приложения, Terraform-спецификациями и скриптом для имитации сбоя приложения. -
Перейдите в репозиторий:
cd yandex-cloud-fault-tolerance-demo-master/app
-
Аутентифицируйтесь в Container Registry:
yc container registry configure-docker
-
yc container registry create --name todo-registry
-
Создайте Docker-образ с тегом
v1
:docker build . --tag cr.yandex/<идентификатор_реестра>/todo-demo:v1 --platform linux/amd64
-
Создайте Docker-образ с тегом
v2
(для проверки сценария обновления приложения):docker build . --build-arg COLOR_SCHEME=dark --tag cr.yandex/<идентификатор_реестра>/todo-demo:v2 --platform linux/amd64
-
Загрузите Docker-образы в Container Registry:
docker push cr.yandex/<идентификатор_реестра>/todo-demo:v1 docker push cr.yandex/<идентификатор_реестра>/todo-demo:v2
Разверните инфраструктуру
Чтобы подготовить окружение для запуска приложения в Yandex Cloud:
-
Перейдите в директорию со спецификацией окружения:
cd ../terraform/app
-
Инициализируйте Terraform в директории со спецификацией:
terraform init
-
Сохраните идентификатор каталога в переменную
YC_FOLDER
и IAM-токен — в переменнуюYC_TOKEN
:export YC_FOLDER=<идентификатор_каталога> export YC_TOKEN=$(yc iam create-token)
-
Сгенерируйте ключ для подключения к виртуальной машине по SSH:
ssh-keygen -t ed25519
-
В файле
app/todo-service.tf
укажите путь к публичному SSH-ключу (значение по умолчанию~/.ssh/id_ed25519.pub
). -
Проверьте квоты в облаке, чтобы была возможность развернуть требуемые ресурсы.
Информация о количестве создаваемых ресурсов
Будут созданы следующие ресурсы:
- Сеть Virtual Private Cloud с тремя подсетями во всех зонах доступности.
- Два сервисных аккаунта:
- Сервисный аккаунт для управления группой ВМ с ролью
editor
. - Сервисный аккаунт для скачивания Docker-образа на ВМ с ролью
container-registry.images.puller
.
- Сервисный аккаунт для управления группой ВМ с ролью
- Группа ВМ из четырех ВМ на базе Container Optimized Image в зонах доступности
ru-central1-b
иru-central1-d
. - Кластер Managed Service for PostgreSQL с двумя хостами в зонах доступности
ru-central1-b
иru-central1-d
. - Сетевой балансировщик нагрузки для распределения трафика по ВМ группы.
-
Разверните и запустите приложение:
terraform apply -var yc_folder=$YC_FOLDER -var yc_token=$YC_TOKEN -var user=$USER
Где:
Для доступа к приложению перейдите по адресу lb_address
, полученному в результате выполнения terraform apply
.
Подготовьте и запустите приложение Load Testing Tool
Важно
Перед созданием Load Testing Tool подготовьте контейнеры приложения TodoList и разверните инфраструктуру.
-
Перейдите в директорию со спецификацией Load Testing Tool:
cd ../tank
-
Инициализируйте Terraform в директории со спецификацией Load Testing Tool:
terraform init
-
В файле
tank/main.tf
укажите путь к публичному и приватному SSH-ключам (значения по умолчанию~/.ssh/id_ed25519.pub
и~/.ssh/id_ed25519
). -
Разверните и запустите ВМ:
terraform apply -var yc_folder=$YC_FOLDER -var yc_token=$YC_TOKEN -var user=$USER -var overload_token=<overload_token>
Где:
yc_folder
— каталог, в котором будет развернуто Load Testing Tool.yc_token
— IAM-токен пользователя, от имени которого будет развернуто Load Testing Tool.overload_token
— токен для подключения к<overload.yandex.net>
. Для получения токена нужно аутентифицироваться, после чего нажать справа вверху на свой профиль и в выпадающем меню выбрать My api token.
-
Подключитесь к созданной ВМ по SSH. Адрес для подключения указан в выводе команды
terraform apply
:ssh <имя_пользователя>@<IP-адрес_ВМ>
-
Запустите Load Testing Tool:
sudo yandex-tank -c load.yaml
-
Перейдите в
<overload.yandex.net>
и найдите там запущенную нагрузку: Public tests → show my tests only.
Выполнение сценариев
Сбой ВМ
Как проявляется сбой: недоступна ВМ с приложением.
Возможные причины:
- Падение физического хоста, на котором была запущена ВМ.
- По ошибке удалена ВМ с приложением.
Для имитации сбоя удалите одну из ВМ группы:
- В консоли управления
выберите каталог с вашей группой ВМ. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите Группы виртуальных машин.
- Выберите группу
todo-ig
. - Перейдите на панель Список ВМ.
- В строке с нужной ВМ нажмите значок
→ Удалить. - В открывшемся окне нажмите кнопку Удалить.
Реакция тестового стенда:
- Сетевой балансировщик нагрузки и Instance Groups получают информацию о сбое ВМ и выводят ее из балансировки — трафик перестает поступать на эту ВМ и распределяется между оставшимися ВМ в группе.
- Instance Groups автоматически восстанавливается:
- Удаляет недоступную ВМ (в этом сценарии ВМ уже удалена, шаг будет пропущен).
- Создает новую ВМ.
- Ожидает запуска приложения на созданной ВМ.
- Добавляет ВМ в балансировку.
Балансировщику нагрузки и Instance Groups требуется некоторое время, чтобы обнаружить проблему и отключить подачу трафика на неисправную ВМ. Из-за этого возможно появление ошибок Connection Timeout (HTTP-код 0
на графиках Quantities и HTTP codes в мониторинге Load Testing Tool).
После выведения недоступной ВМ из балансировки пользовательская нагрузка обрабатывается корректно.
Сбой приложения
Как проявляется сбой: приложение не отвечает вовремя или работает некорректно с точки зрения пользователя.
Возможные причины:
- Утечка памяти привела к падению приложения.
- Приложение не может продолжить работу из-за потери связности с БД.
- Приложение не успевает обрабатывать запросы из-за большой нагрузки.
В соответствии с настройками проверки состояния Instance Groups опрашивает ВМ группы по HTTP-протоколу. При нормальной работе обращение к конечной точке /healthy
возвращается HTTP-код 200
. Иначе Instance Groups запускает процедуру восстановления.
Для имитации сбоя в репозитории yandex-cloud-fault-tolerance-demo-master
запустите скрипт:
fail_random_host.sh <идентификатор_группы_ВМ>
Случайная ВМ из группы начнет возвращать HTTP-код 503
.
Реакция тестового стенда:
- Instance Groups получает информацию о сбое приложения и выводит ВМ из балансировки — трафик перестает поступать на эту ВМ и распределяется между оставшимися ВМ в группе.
- Instance Groups автоматически восстанавливается:
- Перезагружает неисправную ВМ.
- Ожидает запуска приложения на созданной ВМ.
- Добавляет ВМ в балансировку.
Instance Groups несколько раз опрашивает ВМ прежде чем отключить трафик и запустить восстановление. Из-за этого возможно появление ошибок Service Unavailable (HTTP-код 503
на графиках Quantities и HTTP codes в мониторинге Load Testing Tool).
После выведения неисправной ВМ из балансировки пользовательская нагрузка обрабатывается корректно.
Отключение зоны доступности
Как проявляется сбой: недоступны несколько ВМ в одной зоне.
Возможные причины:
- Перебои в работе дата-центра.
- Плановые технические работы в дата-центре.
Чтобы перенести ресурсы в другой дата-центр:
- В консоли управления
выберите каталог с вашей группой ВМ. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите Группы виртуальных машин.
- Выберите группу
todo-ig
. - В правом верхнем углу нажмите Редактировать.
- В блоке Распределение снимите галочку с зоны доступности
ru-central1-b
. - Нажмите кнопку Сохранить.
Реакция тестового стенда:
- Instance Groups выводит из балансировки ВМ в зоне доступности
ru-central1-b
. - Выведенные ВМ удаляются, одновременно с этим создаются ВМ в зоне
ru-central1-d
. - Instance Groups добавляет созданные ВМ в балансировку.
Количество одновременно создаваемых и удаляемых ВМ определяется политикой развертывания.
Во время выведения ВМ из балансировки возможно появление ошибок Connection Timeout (HTTP-код 0
на графиках Quantities и HTTP codes в мониторинге Load Testing Tool).
После выведения ВМ из балансировки пользовательская нагрузка обрабатывается корректно.
Обновление приложения
Чтобы обновить приложение:
- В консоли управления
выберите каталог с вашей группой ВМ. - В списке сервисов выберите Compute Cloud.
- На панели слева выберите Группы виртуальных машин.
- Выберите группу
todo-ig
. - В правом верхнем углу нажмите Редактировать.
- В блоке Шаблон виртуальной машины нажмите значок
и выберите Редактировать. - В блоке Образ загрузочного диска перейдите на вкладку Container Solution.
- Выберите необходимый Docker-контейнер и нажмите
→ Редактировать. - В открывшемся окне в поле Docker-образ укажите образ с новой версией приложения (тег
v2
). - Нажмите кнопку Применить.
- Нажмите кнопку Сохранить.
- Нажмите кнопку Сохранить на странице Изменение группы виртуальных машин.
Реакция тестового стенда:
- Instance Groups выводит из балансировки две ВМ с устаревшей версией приложения (статус таких ВМ
RUNNING_OUTDATED
). - Удаляет выведенные ВМ, одновременно с этим создает ВМ с новой версией приложения.
- Добавляет созданные ВМ в балансировку.
- Действия повторяются для оставшихся двух ВМ с устаревшей версией приложения.
Обновите страницу приложения. Если сетевой балансировщик отправит ваш запрос на уже обновленную ВМ, то вы увидите версию приложения с темной цветовой схемой.
Количество одновременно создаваемых и удаляемых ВМ определяется политикой развертывания.
Во время выведения ВМ из балансировки возможно появление ошибок Connection Timeout (HTTP-код 0
на графиках Quantities и HTTP codes в мониторинге Load Testing Tool).
После выведения ВМ из балансировки пользовательская нагрузка обрабатывается корректно.
Масштабирование конфигурации БД
Масштабирование БД может потребоваться, если:
- Производительности хостов в кластере не хватает для обработки запросов.
- Для данных требуется хранилище большего объема.
Чтобы масштабировать конфигурацию:
- В консоли управления
выберите каталог с вашим кластером БД. - В списке сервисов выберите Managed Service for PostgreSQL.
- Выберите кластер
todo-postgresql
. - Нажмите кнопку
Редактировать. - В блоке Класс хоста выберите
s2.medium
. - Нажмите кнопку Сохранить изменения.
Managed Service for PostgreSQL запустит операцию изменения кластера.
При переключении между мастером и репликой (в начале и в конце процесса изменения) возможно появление ошибок Internal Server Error (HTTP-код 500
на графиках Quantities и HTTP codes в мониторинге Load Testing Tool).
После переключения пользовательская нагрузка обрабатывается корректно.
Удаление приложений и окружения
Важно
Если создана ВМ с Load Testing Tool, необходимо сначала удалить ее, иначе удаление сети Virtual Private Cloud завершится с ошибкой.
Чтобы удалить приложение Load Testing Tool, перейдите в каталог yandex-cloud-fault-tolerance-demo-master/terraform/tank
и выполните следующую команду:
terraform destroy -var yc_folder=$YC_FOLDER -var yc_token=$YC_TOKEN -var user=$USER -var overload_token=not-used
Чтобы удалить приложение TodoList, перейдите в каталог yandex-cloud-fault-tolerance-demo-master/terraform/app
и выполните следующую команду:
terraform destroy -var yc_folder=$YC_FOLDER -var yc_token=$YC_TOKEN -var user=$USER