# Тестирование отказоустойчивости в инфраструктуре Yandex Cloud на основе Yandex Application Load Balancer


{% note warning %}

Часть ресурсов, необходимых для прохождения практического руководства, доступны только в [регионе Россия](../../overview/concepts/region.md).

{% endnote %}


Данное руководство описывает практическую часть рекомендаций по тестированию отказоустойчивости, которые содержатся в статье [Рекомендации по отказоустойчивости в Yandex Cloud](../../architecture/fault-tolerance.md), применительно к инфраструктуре Yandex Cloud, реализованной на основе [L7-балансировщиков нагрузки](../concepts/application-load-balancer.md) Application Load Balancer. Предполагается, что принципы построения тестируемой инфраструктуры не противоречат принципам, изложенным в статье.

## Цели тестирования {#goals}

В данном руководстве описывается методология проведения учений по отказу одной [зоны доступности](../../overview/concepts/geo-scope.md) в облаке, которая позволит:

* Исследовать поведение системы во время отказа.
* Оценить способность системы переживать отключение одной зоны доступности.
* Выявить неявные зависимости и уязвимости.
* Собрать информацию о симптомах отказа.
* Проверить способность системы к быстрому восстановлению.

Исследование отказа ограничено случаем `полного отказа` зоны доступности. Частичные отказы выходят за рамки данного руководства из-за их многообразия.

## Подготовка к тестированию {#preparation}

### Среда тестирования {#environment}

1. Соответствие продуктовой среде:

    {% note warning %}

    Не рекомендуется проводить тестирование сразу в рабочей (продуктовой) среде, сначала следует провести учения в тестовой среде.

    {% endnote %}

    * Тестовую среду рекомендуется сделать максимально приближенной по конфигурации к продуктовой среде.
    * Рекомендуется, чтобы нагрузка на тестовую среду имитировала нагрузку на продуктовую. Для имитации нагрузки используйте подходящий инструмент нагрузочного тестирования.
    * Для автоматизации создания тестовых сред рекомендуется применять подход [Infrastructure as Code](https://yandex.cloud/ru/blog/cloud-control-tools#iac).

1. Для оптимизации затрат при развертывании ресурсов в тестовой среде рекомендуется:
    * Использовать NRD-диски вместо SSD-IO [дисков](../../compute/concepts/disk.md#disks-types).
    * Использовать [прерываемые виртуальные машины](../../compute/concepts/preemptible-vm.md).
    * Динамически создавать ресурсы только на время тестирования.
    * Автоматически освобождать ресурсы после завершения тестов.
    * Использовать компоненты без SLA для снижения затрат.

### Рекомендации к проведению тестирования {#recommendations}

1. Наличие системы мониторинга, которая позволит оценить результаты тестирования. 
1. Сохранение результатов тестирования для ретроспективного анализа.
1. Рекомендуется проводить тестирование на регулярной основе.
1. Использовать при проведении тестирования инструмент [CLI Yandex Cloud](../../cli/quickstart.md) версии `0.154.0` и выше.

### Инструменты тестирования {#tools}

В данном руководстве рассматривается тестирование отказоустойчивости с помощью инструментов отключения балансировки нагрузки в отдельной [зоне доступности](../../overview/concepts/geo-scope.md) для [Application Load Balancer](../operations/manage-zone/start-and-cancel-shift.md).

В качестве дополнительного инструмента обеспечения изоляции отключаемой зоны рекомендуется использовать [группы безопасности VPC](../../vpc/concepts/security-groups.md).

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

## Методика проведения тестирования {#method}

### Подготовка {#test-prep}

1. Если требуется, подготовьте окружение к проведению тестирования.
1. Выберите зону доступности, которая будет отключаться (из которой будет уводиться трафик). Например, `kz1-b`.
1. Определите продолжительность теста. Отключение зоны балансировщика может быть как постоянным, так и на заданный период времени (от 1 минуты до 72 часов). Например, 30 минут.
1. Получите список балансировщиков, которые будут принимать участие в тестировании:

    ```
    yc alb load-balancer list
    ```

### Запуск тестирования {#test-run}

Отключите доставку трафика в выбранную зону доступности для каждого балансировщика из списка. Для отключения балансировки трафика в выбранной зоне доступности используется команда `disable-zones`.

Чтобы отключить балансировку трафика в зоне доступности `kz1-b` для определенного балансировщика нагрузки на 30 минут, выполните команду:

```
yc alb load-balancer disable-zones <имя_или_идентификатор_балансировщика> \
  --zones=kz1-b \
  --duration 30m
```

Примерный результат выполнения команды (обратите внимание на блок `allocation_policy.locations`):

```
...
allocation_policy:
  locations:
    - zone_id: kz1-a
      subnet_id: e9bnvnn56fs4********
    - zone_id: kz1-b
      subnet_id: e2lqsms4cdl3********
      zonal_shift_active: true
      zonal_traffic_disabled: true
    - zone_id: kz1-d
      subnet_id: fl8dmq91iruu********
...
```

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

При повторном выполнении команды период времени блокировки будет обновлен — 30 минут от текущего момента.

Если в команде не указывать параметр `--duration`, то балансировка трафика в выбранных зонах доступности будет заблокирована без ограничения по времени.

{% note warning %}

Команда `disable-zones` отключает только балансировку трафика в выбранную зону доступности и только для указанного балансировщика нагрузки. Эта команда не влияет на сетевой трафик внутри зоны и между зонами доступности в любых других сервисах облака. При необходимости такой широкой блокировки трафика можно использовать [группы безопасности VPC](../../vpc/concepts/security-groups.md) на соответствующих сетевых интерфейсах облачных ресурсов.

{% endnote %}

### Оценка состояния {#test-check}

1. Чтобы получить информацию о состоянии блокировки ресурсов за отдельным балансировщиком нагрузки:

    {% list tabs group=instructions %}

    - Консоль управления {#console}

      1. В [консоли управления](https://kz.console.yandex.cloud) выберите [каталог](../../resource-manager/concepts/resources-hierarchy.md#folder), в котором находится балансировщик.
      1. Перейдите в сервис **Application Load Balancer** и выберите нужный балансировщик.
      1. В блоке **Размещение** напротив зоны доступности посмотрите ее статус.

          Если была задана длительность блокировки, рядом с зоной будет указано время, до которого она заблокирована.

    {% endlist %}

1. Убедитесь, что трафик перестал поступать в выбранную зону. Это можно сделать в сервисе [мониторинга](../../monitoring/index.md), выведя на график суммарный трафик на интерфейсах виртуальных машин с группировкой по зонам доступности. 
   
   > На текущий момент нет возможности получить одним простым запросом к сервису мониторинга график распределения трафика по зонам. Чтобы решить эту задачу:
   > 1. Создайте график в сервисе мониторинга.
   > 1. Составьте списки идентификаторов виртуальных машин для зоны `kz1-a`, например, с помощью команды
   >    ```
   >    yc compute instance list --jq '[.[] | select(.zone_id=="kz1-a") | .id ] | join("|")'`
   >    ```
   >    Результатом выполнения команды будет однострочный список идентификаторов виртуальных машин, разделенных `|`. Пример: `fhm**********uv5|fhm**********aab|fhm**********ui1|...`. 
   > 1. В графике мониторинга добавьте запрос 
   >    ```
   >    alias(series_sum("network_received_packets"{folderId = "b1g**********", service = "compute", resource_type = "vm", resource_id = "<полученный_на_предыдущем_шаге_список_идентификаторов_виртуальных_машин_с_разделителем_|>"}), "kz1-a")`
   >    ```
   > 1. Повторите шаги 2 и 3 для зон `kz1-b` и `kz1-d`.
   > 1. Выполните запросы.

### Завершение тестирования {#test-fin}

1. Чтобы вернуть отключенную ранее зону доступности обратно в балансировку трафика, выполните команду `enable-zones`:

   ```
   yc alb load-balancer enable-zones <имя_или_идентификатор_балансировщика> \
     --zones=kz1-b
   ```
1. Убедитесь, что трафик начал поступать в выбранную зону доступности.
   
   > Важно помнить, что существует ограничение по времени для операции повторного выключения балансировки после включения обратно. Повторное отключение после обратного включения можно выполнить не ранее чем через 2 минуты.

## Заключение {#conclusion}

Рекомендуется проводить тестирование отказоустойчивости на регулярной основе, документировать результаты и постоянно улучшать процессы на основе полученного опыта.